Capture trace_id in builder logs (#2640)
Signed-off-by: Sanket Sudake <sanketsudake@gmail.com> Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
+27
-18
@@ -18,6 +18,7 @@ package builder
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -34,6 +35,7 @@ import (
|
|||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/info"
|
"github.com/fission/fission/pkg/info"
|
||||||
|
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -72,10 +74,12 @@ func MakeBuilder(logger *zap.Logger, sharedVolumePath string) *Builder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (builder *Builder) VersionHandler(w http.ResponseWriter, r *http.Request) {
|
func (builder *Builder) VersionHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
logger := otelUtils.LoggerWithTraceID(r.Context(), builder.logger)
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
_, err := w.Write([]byte(info.BuildInfo().String()))
|
_, err := w.Write([]byte(info.BuildInfo().String()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
builder.logger.Error(
|
logger.Error(
|
||||||
"error writing response",
|
"error writing response",
|
||||||
zap.Error(err),
|
zap.Error(err),
|
||||||
)
|
)
|
||||||
@@ -83,38 +87,40 @@ func (builder *Builder) VersionHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (builder *Builder) Handler(w http.ResponseWriter, r *http.Request) {
|
func (builder *Builder) Handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
logger := otelUtils.LoggerWithTraceID(r.Context(), builder.logger)
|
||||||
|
|
||||||
if r.Method != "POST" {
|
if r.Method != "POST" {
|
||||||
e := "method not allowed"
|
e := "method not allowed"
|
||||||
builder.logger.Error(e, zap.String("http_method", r.Method))
|
logger.Error(e, zap.String("http_method", r.Method))
|
||||||
builder.reply(w, "", fmt.Sprintf("%s: %s", e, r.Method), http.StatusMethodNotAllowed)
|
builder.reply(r.Context(), w, "", fmt.Sprintf("%s: %s", e, r.Method), http.StatusMethodNotAllowed)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
defer func() {
|
defer func() {
|
||||||
elapsed := time.Since(startTime)
|
elapsed := time.Since(startTime)
|
||||||
builder.logger.Info("build request complete", zap.Duration("elapsed_time", elapsed))
|
logger.Info("build request complete", zap.Duration("elapsed_time", elapsed))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// parse request
|
// parse request
|
||||||
body, err := io.ReadAll(r.Body)
|
body, err := io.ReadAll(r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e := "error reading request body"
|
e := "error reading request body"
|
||||||
builder.logger.Error(e, zap.Error(err))
|
logger.Error(e, zap.Error(err))
|
||||||
builder.reply(w, "", fmt.Sprintf("%s: %s", e, err.Error()), http.StatusInternalServerError)
|
builder.reply(r.Context(), w, "", fmt.Sprintf("%s: %s", e, err.Error()), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var req PackageBuildRequest
|
var req PackageBuildRequest
|
||||||
err = json.Unmarshal(body, &req)
|
err = json.Unmarshal(body, &req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e := "error parsing json body"
|
e := "error parsing json body"
|
||||||
builder.logger.Error(e, zap.Error(err))
|
logger.Error(e, zap.Error(err))
|
||||||
builder.reply(w, "", fmt.Sprintf("%s: %s", e, err.Error()), http.StatusBadRequest)
|
builder.reply(r.Context(), w, "", fmt.Sprintf("%s: %s", e, err.Error()), http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
builder.logger.Info("builder received request", zap.Any("request", req))
|
logger.Info("builder received request", zap.Any("request", req))
|
||||||
|
|
||||||
builder.logger.Debug("starting build")
|
logger.Debug("starting build")
|
||||||
srcPkgPath := filepath.Join(builder.sharedVolumePath, req.SrcPkgFilename)
|
srcPkgPath := filepath.Join(builder.sharedVolumePath, req.SrcPkgFilename)
|
||||||
deployPkgFilename := fmt.Sprintf("%s-%s", req.SrcPkgFilename, strings.ToLower(uniuri.NewLen(6)))
|
deployPkgFilename := fmt.Sprintf("%s-%s", req.SrcPkgFilename, strings.ToLower(uniuri.NewLen(6)))
|
||||||
deployPkgPath := filepath.Join(builder.sharedVolumePath, deployPkgFilename)
|
deployPkgPath := filepath.Join(builder.sharedVolumePath, deployPkgFilename)
|
||||||
@@ -134,21 +140,22 @@ func (builder *Builder) Handler(w http.ResponseWriter, r *http.Request) {
|
|||||||
buildArgs = append(buildArgs, args[i])
|
buildArgs = append(buildArgs, args[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buildLogs, err := builder.build(buildCmd, buildArgs, srcPkgPath, deployPkgPath)
|
buildLogs, err := builder.build(r.Context(), buildCmd, buildArgs, srcPkgPath, deployPkgPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e := "error building source package"
|
e := "error building source package"
|
||||||
builder.logger.Error(e, zap.Error(err))
|
logger.Error(e, zap.Error(err))
|
||||||
|
|
||||||
// append error at the end of build logs
|
// append error at the end of build logs
|
||||||
buildLogs += fmt.Sprintf("%s: %s\n", e, err.Error())
|
buildLogs += fmt.Sprintf("%s: %s\n", e, err.Error())
|
||||||
builder.reply(w, deployPkgFilename, buildLogs, http.StatusInternalServerError)
|
builder.reply(r.Context(), w, deployPkgFilename, buildLogs, http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.reply(w, deployPkgFilename, buildLogs, http.StatusOK)
|
builder.reply(r.Context(), w, deployPkgFilename, buildLogs, http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (builder *Builder) reply(w http.ResponseWriter, pkgFilename string, buildLogs string, statusCode int) {
|
func (builder *Builder) reply(ctx context.Context, w http.ResponseWriter, pkgFilename string, buildLogs string, statusCode int) {
|
||||||
|
logger := otelUtils.LoggerWithTraceID(ctx, builder.logger)
|
||||||
resp := PackageBuildResponse{
|
resp := PackageBuildResponse{
|
||||||
ArtifactFilename: pkgFilename,
|
ArtifactFilename: pkgFilename,
|
||||||
BuildLogs: buildLogs,
|
BuildLogs: buildLogs,
|
||||||
@@ -167,14 +174,16 @@ func (builder *Builder) reply(w http.ResponseWriter, pkgFilename string, buildLo
|
|||||||
w.WriteHeader(statusCode)
|
w.WriteHeader(statusCode)
|
||||||
_, err = w.Write(rBody)
|
_, err = w.Write(rBody)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
builder.logger.Error(
|
logger.Error(
|
||||||
"error writing response",
|
"error writing response",
|
||||||
zap.Error(err),
|
zap.Error(err),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (builder *Builder) build(command string, args []string, srcPkgPath string, deployPkgPath string) (string, error) {
|
func (builder *Builder) build(ctx context.Context, command string, args []string, srcPkgPath string, deployPkgPath string) (string, error) {
|
||||||
|
logger := otelUtils.LoggerWithTraceID(ctx, builder.logger)
|
||||||
|
|
||||||
cmd := exec.Command(command, args...)
|
cmd := exec.Command(command, args...)
|
||||||
|
|
||||||
fi, err := os.Stat(srcPkgPath)
|
fi, err := os.Stat(srcPkgPath)
|
||||||
@@ -204,7 +213,7 @@ func (builder *Builder) build(command string, args []string, srcPkgPath string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Init logs
|
// Init logs
|
||||||
builder.logger.Info("building source package", zap.String("command", command), zap.Strings("args", args), zap.Strings("env", cmd.Env))
|
logger.Info("building source package", zap.String("command", command), zap.Strings("args", args), zap.Strings("env", cmd.Env))
|
||||||
|
|
||||||
out := io.MultiReader(stdout, stderr)
|
out := io.MultiReader(stdout, stderr)
|
||||||
scanner := bufio.NewScanner(out)
|
scanner := bufio.NewScanner(out)
|
||||||
|
|||||||
Reference in New Issue
Block a user