2022-11-18 10:18:00 +01:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2022-11-20 14:42:57 +01:00
|
|
|
"fmt"
|
2022-11-18 10:18:00 +01:00
|
|
|
"net/http"
|
2022-11-23 07:50:55 +01:00
|
|
|
"time"
|
2022-11-18 10:18:00 +01:00
|
|
|
|
2022-11-23 07:50:55 +01:00
|
|
|
"github.com/go-logr/logr"
|
2022-11-18 10:18:00 +01:00
|
|
|
"github.com/kyverno/kyverno/pkg/tracing"
|
2023-03-22 16:29:42 +01:00
|
|
|
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
|
2023-02-23 18:54:33 +01:00
|
|
|
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
2022-11-18 10:18:00 +01:00
|
|
|
"go.opentelemetry.io/otel/trace"
|
2022-11-23 07:50:55 +01:00
|
|
|
admissionv1 "k8s.io/api/admission/v1"
|
2022-11-18 10:18:00 +01:00
|
|
|
)
|
|
|
|
|
2022-11-23 07:50:55 +01:00
|
|
|
func (inner HttpHandler) WithTrace(name string) HttpHandler {
|
2022-11-18 10:18:00 +01:00
|
|
|
return func(writer http.ResponseWriter, request *http.Request) {
|
|
|
|
tracing.Span(
|
|
|
|
request.Context(),
|
2022-11-20 14:42:57 +01:00
|
|
|
"webhooks/handlers",
|
2022-11-23 07:50:55 +01:00
|
|
|
fmt.Sprintf("%s %s %s", name, request.Method, request.URL.Path),
|
2022-11-18 10:18:00 +01:00
|
|
|
func(ctx context.Context, span trace.Span) {
|
|
|
|
inner(writer, request.WithContext(ctx))
|
|
|
|
},
|
|
|
|
trace.WithAttributes(
|
|
|
|
semconv.HTTPRequestContentLengthKey.Int64(request.ContentLength),
|
2023-03-24 08:33:55 +01:00
|
|
|
semconv.NetSockPeerAddrKey.String(tracing.StringValue(request.Host)),
|
2023-01-26 10:39:52 +01:00
|
|
|
semconv.HTTPMethodKey.String(tracing.StringValue(request.Method)),
|
|
|
|
semconv.HTTPURLKey.String(tracing.StringValue(request.RequestURI)),
|
2022-11-18 10:18:00 +01:00
|
|
|
),
|
|
|
|
trace.WithSpanKind(trace.SpanKindServer),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
2022-11-23 07:50:55 +01:00
|
|
|
|
|
|
|
func (inner AdmissionHandler) WithTrace(name string) AdmissionHandler {
|
|
|
|
return func(ctx context.Context, logger logr.Logger, request *admissionv1.AdmissionRequest, startTime time.Time) *admissionv1.AdmissionResponse {
|
|
|
|
return tracing.Span1(
|
|
|
|
ctx,
|
|
|
|
"webhooks/handlers",
|
|
|
|
fmt.Sprintf("%s %s %s", name, request.Operation, request.Kind),
|
|
|
|
func(ctx context.Context, span trace.Span) *admissionv1.AdmissionResponse {
|
|
|
|
response := inner(ctx, logger, request, startTime)
|
|
|
|
if response != nil {
|
|
|
|
span.SetAttributes(
|
2023-01-26 10:39:52 +01:00
|
|
|
tracing.ResponseUidKey.String(tracing.StringValue(string(response.UID))),
|
2022-11-23 07:50:55 +01:00
|
|
|
tracing.ResponseAllowedKey.Bool(response.Allowed),
|
|
|
|
tracing.ResponseWarningsKey.StringSlice(response.Warnings),
|
|
|
|
)
|
|
|
|
if response.Result != nil {
|
|
|
|
span.SetAttributes(
|
2023-01-26 10:39:52 +01:00
|
|
|
tracing.ResponseResultStatusKey.String(tracing.StringValue(response.Result.Status)),
|
|
|
|
tracing.ResponseResultMessageKey.String(tracing.StringValue(response.Result.Message)),
|
|
|
|
tracing.ResponseResultReasonKey.String(tracing.StringValue(string(response.Result.Reason))),
|
2022-11-23 07:50:55 +01:00
|
|
|
tracing.ResponseResultCodeKey.Int(int(response.Result.Code)),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
if response.PatchType != nil {
|
|
|
|
span.SetAttributes(
|
2023-01-26 10:39:52 +01:00
|
|
|
tracing.ResponsePatchTypeKey.String(tracing.StringValue(string(*response.PatchType))),
|
2022-11-23 07:50:55 +01:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return response
|
|
|
|
},
|
|
|
|
trace.WithAttributes(
|
2023-01-26 10:39:52 +01:00
|
|
|
tracing.RequestNameKey.String(tracing.StringValue(request.Name)),
|
|
|
|
tracing.RequestNamespaceKey.String(tracing.StringValue(request.Namespace)),
|
|
|
|
tracing.RequestUidKey.String(tracing.StringValue(string(request.UID))),
|
|
|
|
tracing.RequestOperationKey.String(tracing.StringValue(string(request.Operation))),
|
2023-03-22 16:29:42 +01:00
|
|
|
tracing.RequestDryRunKey.Bool(admissionutils.IsDryRun(request)),
|
2023-01-26 10:39:52 +01:00
|
|
|
tracing.RequestKindGroupKey.String(tracing.StringValue(request.Kind.Group)),
|
|
|
|
tracing.RequestKindVersionKey.String(tracing.StringValue(request.Kind.Version)),
|
|
|
|
tracing.RequestKindKindKey.String(tracing.StringValue(request.Kind.Kind)),
|
|
|
|
tracing.RequestSubResourceKey.String(tracing.StringValue(request.SubResource)),
|
|
|
|
tracing.RequestRequestKindGroupKey.String(tracing.StringValue(request.RequestKind.Group)),
|
|
|
|
tracing.RequestRequestKindVersionKey.String(tracing.StringValue(request.RequestKind.Version)),
|
|
|
|
tracing.RequestRequestKindKindKey.String(tracing.StringValue(request.RequestKind.Kind)),
|
|
|
|
tracing.RequestRequestSubResourceKey.String(tracing.StringValue(request.RequestSubResource)),
|
|
|
|
tracing.RequestResourceGroupKey.String(tracing.StringValue(request.Resource.Group)),
|
|
|
|
tracing.RequestResourceVersionKey.String(tracing.StringValue(request.Resource.Version)),
|
|
|
|
tracing.RequestResourceResourceKey.String(tracing.StringValue(request.Resource.Resource)),
|
|
|
|
tracing.RequestRequestResourceGroupKey.String(tracing.StringValue(request.RequestResource.Group)),
|
|
|
|
tracing.RequestRequestResourceVersionKey.String(tracing.StringValue(request.RequestResource.Version)),
|
|
|
|
tracing.RequestRequestResourceResourceKey.String(tracing.StringValue(request.RequestResource.Resource)),
|
|
|
|
tracing.RequestUserNameKey.String(tracing.StringValue(request.UserInfo.Username)),
|
|
|
|
tracing.RequestUserUidKey.String(tracing.StringValue(request.UserInfo.UID)),
|
2022-11-23 07:50:55 +01:00
|
|
|
tracing.RequestUserGroupsKey.StringSlice(request.UserInfo.Groups),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|