From e6b17d75b189ed71b6064363e57ad2442f968b28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20J=C3=A4ckle?= Date: Mon, 13 Jan 2025 12:52:14 +0100 Subject: [PATCH] fix wrongly calculated path in WoT validation errors * also fix traceparent-trace-id logging --- .../enforcement/ThingEnforcerActor.java | 10 +++++-- .../DefaultWotThingModelValidator.java | 26 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/things/service/src/main/java/org/eclipse/ditto/things/service/enforcement/ThingEnforcerActor.java b/things/service/src/main/java/org/eclipse/ditto/things/service/enforcement/ThingEnforcerActor.java index 33f8db3394..f7788435fe 100644 --- a/things/service/src/main/java/org/eclipse/ditto/things/service/enforcement/ThingEnforcerActor.java +++ b/things/service/src/main/java/org/eclipse/ditto/things/service/enforcement/ThingEnforcerActor.java @@ -198,8 +198,11 @@ protected CompletionStage> performWotBasedSignalValidation(final Signa ) .start(); return performWotBasedMessageCommandValidation(messageCommand.setDittoHeaders( - DittoHeaders.of(startedSpan.propagateContext(messageCommand.getDittoHeaders()))) - ).whenComplete((result, error) -> { + DittoHeaders.of(startedSpan.propagateContext(messageCommand.getDittoHeaders())) + .toBuilder() + .putHeader(DittoHeaderDefinition.ENTITY_ID.getKey(), entityId.toString()) + .build() + )).whenComplete((result, error) -> { if (error instanceof DittoRuntimeException dre) { startedSpan.tagAsFailed(dre.toString()); } else if (null != error) { @@ -239,6 +242,9 @@ protected CompletionStage> performWotBasedResponseValidation( return performWotBasedMessageCommandResponseValidation( messageCommandResponse.setDittoHeaders( DittoHeaders.of(startedSpan.propagateContext(messageCommandResponse.getDittoHeaders())) + .toBuilder() + .putHeader(DittoHeaderDefinition.ENTITY_ID.getKey(), entityId.toString()) + .build() ) ) .whenComplete((result, error) -> { diff --git a/wot/api/src/main/java/org/eclipse/ditto/wot/api/validator/DefaultWotThingModelValidator.java b/wot/api/src/main/java/org/eclipse/ditto/wot/api/validator/DefaultWotThingModelValidator.java index 65ad9e2790..debea34997 100644 --- a/wot/api/src/main/java/org/eclipse/ditto/wot/api/validator/DefaultWotThingModelValidator.java +++ b/wot/api/src/main/java/org/eclipse/ditto/wot/api/validator/DefaultWotThingModelValidator.java @@ -93,7 +93,7 @@ public CompletionStage validateThing(@Nullable final ThingDefinition thing return provideValidationConfigIfWotValidationEnabled(context) .map(validationConfig -> fetchResolveAndValidateWith(thingDefinition, dittoHeaders, thingModel -> doValidateThing(Optional.ofNullable(thingDefinition).orElseThrow(), - thingModel, thing, resourcePath, context, validationConfig + thingModel, thing, context, validationConfig ).handle(applyLogingErrorOnlyStrategy(validationConfig, context, "validateThing")) )) .orElseGet(DefaultWotThingModelValidator::success); @@ -109,7 +109,7 @@ public CompletionStage validateThing(final ThingDefinition thingDefinition final ValidationContext context = buildValidationContext(dittoHeaders, thingDefinition); return provideValidationConfigIfWotValidationEnabled(context) .map(validationConfig -> - doValidateThing(thingDefinition, thingModel, thing, resourcePath, context, validationConfig) + doValidateThing(thingDefinition, thingModel, thing, context, validationConfig) .handle(applyLogingErrorOnlyStrategy(validationConfig, context, "validateThing")) ) .orElseGet(DefaultWotThingModelValidator::success); @@ -126,9 +126,8 @@ public CompletionStage validateThingDefinitionModification(final ThingDefi validationConfig.getThingValidationConfig().isEnforceThingDescriptionModification() ) .map(validationConfig -> fetchResolveAndValidateWith(thingDefinition, dittoHeaders, thingModel -> - doValidateThing(thingDefinition, thingModel, thing, Thing.JsonFields.DEFINITION.getPointer(), - context, validationConfig - ).handle(applyLogingErrorOnlyStrategy(validationConfig, context, "validateThingDefinitionModification")) + doValidateThing(thingDefinition, thingModel, thing, context, validationConfig) + .handle(applyLogingErrorOnlyStrategy(validationConfig, context, "validateThingDefinitionModification")) )) .orElseGet(DefaultWotThingModelValidator::success); } @@ -608,14 +607,22 @@ private static void logValidationWarning(final boolean logAsWarning, ) { final DittoHeaders dittoHeaders = context.dittoHeaders(); dittoHeaders.getCorrelationId().ifPresent(cId -> MDC.put("correlation-id", cId)); - dittoHeaders.getTraceParent().ifPresent(traceParent -> MDC.put("traceparent-trace-id", traceParent)); + // positions defined by https://www.w3.org/TR/trace-context/#traceparent-header-field-values to contain the "trace-id" + dittoHeaders.getTraceParent().ifPresent(traceParent -> { + MDC.put("traceparent-trace-id", traceParent.substring(3, 35)); + MDC.put("traceparent-span-id", traceParent.substring(36, 52)); + } + ); final LoggingEventBuilder logBuilder = logAsWarning ? log.atWarn() : log.atInfo(); logBuilder.log("WoT based validation of Thing <{}> in <{}()> failed for / due to: <{}>", context.thingId(), loggingHintSource, context.thingDefinition(), context.featureDefinition(), throwable.toString() ); dittoHeaders.getCorrelationId().ifPresent(cId -> MDC.remove("correlation-id")); - dittoHeaders.getTraceParent().ifPresent(traceParent -> MDC.remove("traceparent-trace-id")); + dittoHeaders.getTraceParent().ifPresent(traceParent -> { + MDC.remove("traceparent-trace-id"); + MDC.remove("traceparent-span-id"); + }); } private CompletionStage fetchResolveAndValidateWith(@Nullable final DefinitionIdentifier definitionIdentifier, @@ -639,7 +646,6 @@ private CompletionStage fetchResolveAndValidateWith(final URL url, private CompletionStage doValidateThing(final ThingDefinition thingDefinition, final ThingModel thingModel, final Thing thing, - final JsonPointer resourcePath, final ValidationContext context, final TmValidationConfig validationConfig ) { @@ -653,7 +659,7 @@ private CompletionStage doValidateThing(final ThingDefinition thingDefinit return firstStage.thenCompose(unused -> doValidateThingAttributes(thingModel, thing.getAttributes().orElse(null), - resourcePath.append(Thing.JsonFields.ATTRIBUTES.getPointer()), + Thing.JsonFields.ATTRIBUTES.getPointer(), context, validationConfig ) @@ -662,7 +668,7 @@ private CompletionStage doValidateThing(final ThingDefinition thingDefinit .thenCompose(subModels -> doValidateFeatures(subModels, thing.getFeatures().orElse(null), - resourcePath, + JsonPointer.empty(), context, validationConfig )