diff --git a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/PluginApplication.java b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/PluginApplication.java index 341c66f15ad..61cee198366 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/PluginApplication.java +++ b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/PluginApplication.java @@ -48,16 +48,13 @@ private static Function generateAdviceClo return spec -> { final CallSiteResult result = adviceGenerator.generate(spec); if (result.isSuccess()) { - Extension.EXTENSIONS.stream() - .filter(ext -> ext.appliesTo(spec)) - .forEach( - ext -> { - try { - ext.apply(configuration, result); - } catch (final Throwable e) { - result.addError(e, ErrorCode.EXTENSION_ERROR, ext.getClass()); - } - }); + Extension.EXTENSIONS.stream().filter(ext -> ext.appliesTo(spec)).forEach(ext -> { + try { + ext.apply(configuration, result); + } catch (final Throwable e) { + result.addError(e, ErrorCode.EXTENSION_ERROR, ext.getClass()); + } + }); } return result; }; @@ -74,17 +71,15 @@ private static List searchForCallSites(final Configuratio final SpecificationBuilder builder = specificationBuilder(); final List result = new ArrayList<>(); final Pattern pattern = Pattern.compile(".*" + configuration.suffix + "\\.class$"); - Files.walkFileTree( - configuration.classesFolder, - new SimpleFileVisitor() { - public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) { - if (Files.isRegularFile(file) - && pattern.matcher(file.getFileName().toString()).matches()) { - builder.build(file.toFile()).ifPresent(result::add); - } - return FileVisitResult.CONTINUE; - } - }); + Files.walkFileTree(configuration.classesFolder, new SimpleFileVisitor() { + public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) { + if (Files.isRegularFile(file) + && pattern.matcher(file.getFileName().toString()).matches()) { + builder.build(file.toFile()).ifPresent(result::add); + } + return FileVisitResult.CONTINUE; + } + }); return result; } catch (IOException e) { throw new RuntimeException(e); diff --git a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AdviceGeneratorImpl.java b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AdviceGeneratorImpl.java index d517834c3a6..85b268cb11b 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AdviceGeneratorImpl.java +++ b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AdviceGeneratorImpl.java @@ -206,33 +206,28 @@ private void addAdviceLambda( type = "AROUND"; writeAdviceMethodCall(spec, adviceBody); } - body.addStatement( - new MethodCallExpr() - .setScope(new NameExpr("container")) - .setName("addAdvice") - .setArguments( - new NodeList<>( - new FieldAccessExpr() - .setScope( - new TypeExpr(new ClassOrInterfaceType().setName(ADVICE_TYPE_CLASS))) - .setName(type), - new StringLiteralExpr(pointCut.getOwner().getInternalName()), - new StringLiteralExpr(pointCut.getMethodName()), - new StringLiteralExpr(pointCut.getMethodType().getDescriptor()), - advice))); + body.addStatement(new MethodCallExpr() + .setScope(new NameExpr("container")) + .setName("addAdvice") + .setArguments(new NodeList<>( + new FieldAccessExpr() + .setScope(new TypeExpr(new ClassOrInterfaceType().setName(ADVICE_TYPE_CLASS))) + .setName(type), + new StringLiteralExpr(pointCut.getOwner().getInternalName()), + new StringLiteralExpr(pointCut.getMethodName()), + new StringLiteralExpr(pointCut.getMethodType().getDescriptor()), + advice))); } private static void addHelpersInvocation(final Type[] helpers, final BlockStmt body) { if (helpers != null && helpers.length > 0) { - final List helperTypes = - Arrays.stream(helpers) - .map(type -> new StringLiteralExpr(type.getClassName())) - .collect(Collectors.toList()); - body.addStatement( - new MethodCallExpr() - .setScope(new NameExpr("container")) - .setName("addHelpers") - .setArguments(new NodeList<>(helperTypes))); + final List helperTypes = Arrays.stream(helpers) + .map(type -> new StringLiteralExpr(type.getClassName())) + .collect(Collectors.toList()); + body.addStatement(new MethodCallExpr() + .setScope(new NameExpr("container")) + .setName("addHelpers") + .setArguments(new NodeList<>(helperTypes))); } } @@ -246,11 +241,10 @@ private static void addEnabledCheck( final List parameters = enabled.getArguments().stream().map(StringLiteralExpr::new).collect(Collectors.toList()); - final Expression enabledCheckExpression = - new MethodCallExpr() - .setScope(new NameExpr(ownerPackage + "." + ownerClassName)) - .setName(method.getMethodName()) - .setArguments(new NodeList<>(parameters)); + final Expression enabledCheckExpression = new MethodCallExpr() + .setScope(new NameExpr(ownerPackage + "." + ownerClassName)) + .setName(method.getMethodName()) + .setArguments(new NodeList<>(parameters)); type.addMethod("isEnabled", PUBLIC) .setType(boolean.class) @@ -263,21 +257,17 @@ private static void writeStackOperations(final AdviceSpecification advice, final final boolean instanceMethod = !advice.isStaticPointcut(); final AllArgsSpecification allArgsSpec = advice.findAllArguments(); if (allArgsSpec == null && advice.isPositionalArguments()) { - final List parameterIndicesValues = - advice - .getArguments() - .map(argSpec -> intLiteral(argSpec.getIndex())) - .collect(Collectors.toList()); - final VariableDeclarator parameterIndices = - new VariableDeclarator() - .setName("parameterIndices") - .setType(new ArrayType(new PrimitiveType(PrimitiveType.Primitive.INT))) + final List parameterIndicesValues = advice + .getArguments() + .map(argSpec -> intLiteral(argSpec.getIndex())) + .collect(Collectors.toList()); + final VariableDeclarator parameterIndices = new VariableDeclarator() + .setName("parameterIndices") + .setType(new ArrayType(new PrimitiveType(PrimitiveType.Primitive.INT))) + .setInitializer(new ArrayCreationExpr() + .setElementType(int.class) .setInitializer( - new ArrayCreationExpr() - .setElementType(int.class) - .setInitializer( - new ArrayInitializerExpr() - .setValues(new NodeList<>(parameterIndicesValues)))); + new ArrayInitializerExpr().setValues(new NodeList<>(parameterIndicesValues)))); body.addStatement(new VariableDeclarationExpr().addVariable(parameterIndices)); final MethodCallExpr dupMethod = new MethodCallExpr().setScope(new NameExpr("handler")); if (advice.includeThis()) { @@ -310,10 +300,9 @@ private static void writeStackOperations(final AdviceSpecification advice, final mode = "APPEND_ARRAY"; } } - dupMethod.addArgument( - new FieldAccessExpr() - .setScope(new TypeExpr(new ClassOrInterfaceType().setName(STACK_DUP_MODE_CLASS))) - .setName(mode)); + dupMethod.addArgument(new FieldAccessExpr() + .setScope(new TypeExpr(new ClassOrInterfaceType().setName(STACK_DUP_MODE_CLASS))) + .setName(mode)); body.addStatement(dupMethod); } } @@ -322,53 +311,49 @@ private static void writeAdviceMethodCall( final AdviceSpecification advice, final BlockStmt body) { final MethodType method = advice.getAdvice(); if (advice instanceof AroundSpecification && advice.isInvokeDynamic()) { - final Expression newHandle = - new ObjectCreationExpr() - .setType("Handle") - .addArgument(opCode("H_INVOKESTATIC")) - .addArgument(new StringLiteralExpr(method.getOwner().getInternalName())) - .addArgument(new StringLiteralExpr(method.getMethodName())) - .addArgument(new StringLiteralExpr(method.getMethodType().getDescriptor())) - .addArgument(new BooleanLiteralExpr(false)); - final MethodCallExpr invokeDynamic = - new MethodCallExpr() - .setScope(new NameExpr("handler")) - .setName("invokeDynamic") - .addArgument(new NameExpr("name")) - .addArgument(new NameExpr("descriptor")) - .addArgument(newHandle) - .addArgument(new NameExpr("bootstrapMethodArguments")); + final Expression newHandle = new ObjectCreationExpr() + .setType("Handle") + .addArgument(opCode("H_INVOKESTATIC")) + .addArgument(new StringLiteralExpr(method.getOwner().getInternalName())) + .addArgument(new StringLiteralExpr(method.getMethodName())) + .addArgument(new StringLiteralExpr(method.getMethodType().getDescriptor())) + .addArgument(new BooleanLiteralExpr(false)); + final MethodCallExpr invokeDynamic = new MethodCallExpr() + .setScope(new NameExpr("handler")) + .setName("invokeDynamic") + .addArgument(new NameExpr("name")) + .addArgument(new NameExpr("descriptor")) + .addArgument(newHandle) + .addArgument(new NameExpr("bootstrapMethodArguments")); body.addStatement(invokeDynamic); } else { if (advice.isInvokeDynamic() && advice.findInvokeDynamicConstants() != null) { // we should add the boostrap method constants before the method call - final MethodCallExpr loadConstantArray = - new MethodCallExpr() - .setScope(new NameExpr("handler")) - .setName("loadConstantArray") - .addArgument(new NameExpr("bootstrapMethodArguments")); + final MethodCallExpr loadConstantArray = new MethodCallExpr() + .setScope(new NameExpr("handler")) + .setName("loadConstantArray") + .addArgument(new NameExpr("bootstrapMethodArguments")); body.addStatement(loadConstantArray); } - final MethodCallExpr invokeStatic = - new MethodCallExpr() - .setScope(new NameExpr("handler")) - .setName("advice") - .addArgument(new StringLiteralExpr(method.getOwner().getInternalName())) - .addArgument(new StringLiteralExpr(method.getMethodName())) - .addArgument(new StringLiteralExpr(method.getMethodType().getDescriptor())); + final MethodCallExpr invokeStatic = new MethodCallExpr() + .setScope(new NameExpr("handler")) + .setName("advice") + .addArgument(new StringLiteralExpr(method.getOwner().getInternalName())) + .addArgument(new StringLiteralExpr(method.getMethodName())) + .addArgument(new StringLiteralExpr(method.getMethodType().getDescriptor())); body.addStatement(invokeStatic); } if (requiresCast(advice)) { final MethodType pointcut = advice.getPointcut(); - final Type expectedReturn = - pointcut.isConstructor() ? pointcut.getOwner() : pointcut.getMethodType().getReturnType(); + final Type expectedReturn = pointcut.isConstructor() + ? pointcut.getOwner() + : pointcut.getMethodType().getReturnType(); if (!expectedReturn.equals(method.getMethodType().getReturnType())) { - body.addStatement( - new MethodCallExpr() - .setScope(new NameExpr("handler")) - .setName("instruction") - .addArgument(opCode("CHECKCAST")) - .addArgument(new StringLiteralExpr(expectedReturn.getInternalName()))); + body.addStatement(new MethodCallExpr() + .setScope(new NameExpr("handler")) + .setName("instruction") + .addArgument(opCode("CHECKCAST")) + .addArgument(new StringLiteralExpr(expectedReturn.getInternalName()))); } } } diff --git a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilder.java b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilder.java index 00a93721f51..3d8257e3f55 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilder.java +++ b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilder.java @@ -246,10 +246,9 @@ public AnnotationVisitor visitParameterAnnotation( if (parameterCtor != null) { ParameterSpecification parameterSpec = parameterCtor.build(); if (parameterSpec instanceof ArgumentSpecification) { - final long index = - parameters.values().stream() - .filter(it -> it instanceof ArgumentSpecification) - .count(); + final long index = parameters.values().stream() + .filter(it -> it instanceof ArgumentSpecification) + .count(); ((ArgumentSpecification) parameterSpec) .setIndex((int) index); // can change in annotation visitor } @@ -273,13 +272,9 @@ public void visit(final String key, final Object value) { @Override public void visitEnd() { - adviceData.forEach( - (adviceCtor, list) -> - list.stream() - .map( - data -> - adviceCtor.build(advice, parameters, data.signature, data.invokeDynamic)) - .forEach(spec.advices::add)); + adviceData.forEach((adviceCtor, list) -> list.stream() + .map(data -> adviceCtor.build(advice, parameters, data.signature, data.invokeDynamic)) + .forEach(spec.advices::add)); } } diff --git a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/CallSiteSpecification.java b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/CallSiteSpecification.java index 7ce110d33e8..482d74d43e1 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/CallSiteSpecification.java +++ b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/CallSiteSpecification.java @@ -162,52 +162,44 @@ private void validateArgumentSpecCompatibility( final ValidationContext context, final Type[] adviceArgumentTypes, final Set pointcutParameters) { - withParameter( - ArgumentSpecification.class, - (i, spec) -> { - final Type argType = pointcut.getMethodType().getArgumentTypes()[spec.index]; - final Type advice = adviceArgumentTypes[i]; - if (!pointcutParameters.remove(spec.index)) { - context.addError(ErrorCode.ADVICE_PARAMETER_ARGUMENT_OUT_OF_BOUNDS); - } - validateCompatibility( - context, argType, advice, ErrorCode.ADVICE_METHOD_PARAM_NOT_COMPATIBLE, i); - }); + withParameter(ArgumentSpecification.class, (i, spec) -> { + final Type argType = pointcut.getMethodType().getArgumentTypes()[spec.index]; + final Type advice = adviceArgumentTypes[i]; + if (!pointcutParameters.remove(spec.index)) { + context.addError(ErrorCode.ADVICE_PARAMETER_ARGUMENT_OUT_OF_BOUNDS); + } + validateCompatibility( + context, argType, advice, ErrorCode.ADVICE_METHOD_PARAM_NOT_COMPATIBLE, i); + }); } private void validateReturnSpecCompatibility( final ValidationContext context, final Type[] adviceArgumentTypes) { - withParameter( - ReturnSpecification.class, - (i, spec) -> { - final Type rType = - pointcut.isConstructor() - ? pointcut.getOwner() - : pointcut.getMethodType().getReturnType(); - final Type advice = adviceArgumentTypes[i]; - validateCompatibility( - context, rType, advice, ErrorCode.ADVICE_METHOD_PARAM_RETURN_NOT_COMPATIBLE, i); - }); + withParameter(ReturnSpecification.class, (i, spec) -> { + final Type rType = pointcut.isConstructor() + ? pointcut.getOwner() + : pointcut.getMethodType().getReturnType(); + final Type advice = adviceArgumentTypes[i]; + validateCompatibility( + context, rType, advice, ErrorCode.ADVICE_METHOD_PARAM_RETURN_NOT_COMPATIBLE, i); + }); } private void validateThisSpecCompatibility( final ValidationContext context, final Type[] adviceArgumentTypes) { - withParameter( - ThisSpecification.class, - (i, spec) -> { - final Type owner = pointcut.getOwner(); - final Type advice = adviceArgumentTypes[i]; - validateCompatibility( - context, owner, advice, ErrorCode.ADVICE_METHOD_PARAM_THIS_NOT_COMPATIBLE, i); - }); + withParameter(ThisSpecification.class, (i, spec) -> { + final Type owner = pointcut.getOwner(); + final Type advice = adviceArgumentTypes[i]; + validateCompatibility( + context, owner, advice, ErrorCode.ADVICE_METHOD_PARAM_THIS_NOT_COMPATIBLE, i); + }); } protected void validateAdviceReturnTypeCompatibility(final ValidationContext context) { if (!advice.isVoidReturn()) { - final Type pointcutType = - pointcut.isConstructor() - ? pointcut.getOwner() - : pointcut.getMethodType().getReturnType(); + final Type pointcutType = pointcut.isConstructor() + ? pointcut.getOwner() + : pointcut.getMethodType().getReturnType(); final Type adviceType = advice.getMethodType().getReturnType(); validateCompatibility( context, pointcutType, adviceType, ErrorCode.ADVICE_METHOD_RETURN_NOT_COMPATIBLE, -1); @@ -218,34 +210,30 @@ private void validateInvokeDynamicConstCompatibility( final ValidationContext context, final Type[] adviceArgumentTypes, final Set pointcutParameters) { - withParameter( - InvokeDynamicConstantsSpecification.class, - (i, spec) -> { - final Type type = Types.OBJECT_ARRAY; - final Type advice = adviceArgumentTypes[i]; - pointcutParameters.clear(); - validateCompatibility( - context, - type, - advice, - ErrorCode.ADVICE_PARAMETER_INVOKE_DYNAMIC_CONSTANTS_NOT_COMPATIBLE, - i); - }); + withParameter(InvokeDynamicConstantsSpecification.class, (i, spec) -> { + final Type type = Types.OBJECT_ARRAY; + final Type advice = adviceArgumentTypes[i]; + pointcutParameters.clear(); + validateCompatibility( + context, + type, + advice, + ErrorCode.ADVICE_PARAMETER_INVOKE_DYNAMIC_CONSTANTS_NOT_COMPATIBLE, + i); + }); } private void validateAllArgsSpecCompatibility( final ValidationContext context, final Type[] adviceArgumentTypes, final Set pointcutParameters) { - withParameter( - AllArgsSpecification.class, - (i, spec) -> { - final Type type = Types.OBJECT_ARRAY; - final Type advice = adviceArgumentTypes[i]; - pointcutParameters.clear(); - validateCompatibility( - context, type, advice, ErrorCode.ADVICE_METHOD_PARAM_ALL_ARGS_NOT_COMPATIBLE, i); - }); + withParameter(AllArgsSpecification.class, (i, spec) -> { + final Type type = Types.OBJECT_ARRAY; + final Type advice = adviceArgumentTypes[i]; + pointcutParameters.clear(); + validateCompatibility( + context, type, advice, ErrorCode.ADVICE_METHOD_PARAM_ALL_ARGS_NOT_COMPATIBLE, i); + }); } protected void validateCompatibility( @@ -680,11 +668,10 @@ public static final class Enabled { public Enabled(final List enabled) { this.arguments = enabled.size() <= 2 ? emptyList() : enabled.subList(2, enabled.size()); - this.method = - new MethodType( - classNameToType(enabled.get(0)), - enabled.get(1), - Type.getMethodType(Types.BOOLEAN, stringTypeArray(arguments.size()))); + this.method = new MethodType( + classNameToType(enabled.get(0)), + enabled.get(1), + Type.getMethodType(Types.BOOLEAN, stringTypeArray(arguments.size()))); } public MethodType getMethod() { diff --git a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParser.java b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParser.java index d3205dfd0d3..a28cc4417e4 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParser.java +++ b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParser.java @@ -117,16 +117,13 @@ private static Type parseType(final String name) { if (startOfArray >= 0) { final Type arrayType = parseType(name.substring(0, startOfArray)); String arrayDeclaration = name.substring(startOfArray); - int dimension = - (int) - arrayDeclaration - .chars() - .filter(it -> it == ARRAY_DESCRIPTOR) - .count(); // assumes array notation is well-formed - String elementType = - arrayType.getSort() == Type.OBJECT - ? classNameToDescriptor(arrayType.getClassName()) - : arrayType.getInternalName(); + int dimension = (int) arrayDeclaration + .chars() + .filter(it -> it == ARRAY_DESCRIPTOR) + .count(); // assumes array notation is well-formed + String elementType = arrayType.getSort() == Type.OBJECT + ? classNameToDescriptor(arrayType.getClassName()) + : arrayType.getInternalName(); return Type.getType(repeat(ARRAY_DESCRIPTOR, dimension) + elementType); } return classNameOrPrimitiveToType(name); diff --git a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/TypeResolverPool.java b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/TypeResolverPool.java index f1d5159a46a..078c027499a 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/TypeResolverPool.java +++ b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/TypeResolverPool.java @@ -72,10 +72,9 @@ private String getResolvableClassName(final Type type) { switch (type.getSort()) { case Type.ARRAY: Type element = type.getElementType(); - String elementClassName = - element.getSort() == Type.OBJECT - ? "L" + element.getClassName() + ";" - : element.getInternalName(); + String elementClassName = element.getSort() == Type.OBJECT + ? "L" + element.getClassName() + ";" + : element.getInternalName(); return repeat('[', type.getDimensions()) + elementClassName; case Type.OBJECT: return type.getClassName(); diff --git a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/ext/IastExtension.java b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/ext/IastExtension.java index 9373073291c..342290e84e4 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/ext/IastExtension.java +++ b/buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/ext/IastExtension.java @@ -157,16 +157,14 @@ private void addTelemetryInterface(final CompilationUnit javaClass) { .getVariable(0) .setInitializer( new FieldAccessExpr().setScope(new NameExpr(VERBOSITY_CLASS)).setName("OFF")); - final MethodDeclaration enableTelemetry = - mainType - .addMethod("setVerbosity", Modifier.Keyword.PUBLIC) - .addParameter(VERBOSITY_CLASS, "verbosity") - .addAnnotation(Override.class); + final MethodDeclaration enableTelemetry = mainType + .addMethod("setVerbosity", Modifier.Keyword.PUBLIC) + .addParameter(VERBOSITY_CLASS, "verbosity") + .addAnnotation(Override.class); final BlockStmt enableTelemetryBody = new BlockStmt(); - enableTelemetryBody.addStatement( - new AssignExpr() - .setTarget(accessLocalField("verbosity")) - .setValue(new NameExpr("verbosity"))); + enableTelemetryBody.addStatement(new AssignExpr() + .setTarget(accessLocalField("verbosity")) + .setValue(new NameExpr("verbosity"))); enableTelemetry.setBody(enableTelemetryBody); } @@ -185,41 +183,37 @@ private void addTelemetryToAdvice( final String metric = getMetricName(metaData); final Byte tagValue = getMetricTagValue(resolver, metaData); final String instrumentedMetric = "INSTRUMENTED_" + metric; - final IfStmt instrumentedStatement = - new IfStmt() - .setCondition(isEnabledCondition(instrumentedMetric)) - .setThenStmt( - new BlockStmt() - .addStatement(addTelemetryCollectorMethod(instrumentedMetric, tagValue))); + final IfStmt instrumentedStatement = new IfStmt() + .setCondition(isEnabledCondition(instrumentedMetric)) + .setThenStmt(new BlockStmt() + .addStatement(addTelemetryCollectorMethod(instrumentedMetric, tagValue))); lambdaBody.addStatement(0, instrumentedStatement); final String executedMetric = "EXECUTED_" + metric; - final IfStmt executedStatement = - new IfStmt() - .setCondition(isEnabledCondition(executedMetric)) - .setThenStmt(addTelemetryCollectorByteCode(executedMetric, tagValue)); + final IfStmt executedStatement = new IfStmt() + .setCondition(isEnabledCondition(executedMetric)) + .setThenStmt(addTelemetryCollectorByteCode(executedMetric, tagValue)); lambdaBody.addStatement(1, executedStatement); } private static Expression isEnabledCondition(final String metric) { return new MethodCallExpr() - .setScope(new FieldAccessExpr().setScope(new NameExpr(IAST_METRIC_CLASS)).setName(metric)) + .setScope( + new FieldAccessExpr().setScope(new NameExpr(IAST_METRIC_CLASS)).setName(metric)) .setName("isEnabled") .addArgument(accessLocalField("verbosity")); } private static MethodCallExpr addTelemetryCollectorMethod( final String metric, final Byte tagValue) { - final MethodCallExpr method = - new MethodCallExpr() - .setScope(new NameExpr(IAST_METRIC_COLLECTOR_CLASS)) - .setName("add") - .addArgument( - new FieldAccessExpr().setScope(new NameExpr(IAST_METRIC_CLASS)).setName(metric)); + final MethodCallExpr method = new MethodCallExpr() + .setScope(new NameExpr(IAST_METRIC_COLLECTOR_CLASS)) + .setName("add") + .addArgument( + new FieldAccessExpr().setScope(new NameExpr(IAST_METRIC_CLASS)).setName(metric)); if (tagValue != null) { - method.addArgument( - new CastExpr() - .setExpression(new IntegerLiteralExpr(Byte.toString(tagValue))) - .setType(byte.class)); + method.addArgument(new CastExpr() + .setExpression(new IntegerLiteralExpr(Byte.toString(tagValue))) + .setType(byte.class)); } method.addArgument(intLiteral(1)); return method; @@ -230,38 +224,34 @@ private static BlockStmt addTelemetryCollectorByteCode(final String metric, fina // this code generates the java source code needed to provide the bytecode for the statement // IastTelemetryCollector.add(${metric}, 1); or IastTelemetryCollector.add(${metric}, ${tag}, // 1); - stmt.addStatement( - new MethodCallExpr() - .setScope(new NameExpr("handler")) - .setName("field") - .addArgument( - new FieldAccessExpr().setScope(new NameExpr(OPCODES_FQDN)).setName("GETSTATIC")) - .addArgument(new StringLiteralExpr(IAST_METRIC_INTERNAL_NAME)) - .addArgument(new StringLiteralExpr(metric)) - .addArgument(new StringLiteralExpr("L" + IAST_METRIC_INTERNAL_NAME + ";"))); + stmt.addStatement(new MethodCallExpr() + .setScope(new NameExpr("handler")) + .setName("field") + .addArgument( + new FieldAccessExpr().setScope(new NameExpr(OPCODES_FQDN)).setName("GETSTATIC")) + .addArgument(new StringLiteralExpr(IAST_METRIC_INTERNAL_NAME)) + .addArgument(new StringLiteralExpr(metric)) + .addArgument(new StringLiteralExpr("L" + IAST_METRIC_INTERNAL_NAME + ";"))); if (tagValue != null) { stmt.addStatement(pushByteExpression(tagValue)); } - stmt.addStatement( - new MethodCallExpr() - .setScope(new NameExpr("handler")) - .setName("instruction") - .addArgument( - new FieldAccessExpr().setScope(new NameExpr(OPCODES_FQDN)).setName("ICONST_1"))); - final String descriptor = - tagValue != null - ? "(L" + IAST_METRIC_INTERNAL_NAME + ";BI)V" - : "(L" + IAST_METRIC_INTERNAL_NAME + ";I)V"; - stmt.addStatement( - new MethodCallExpr() - .setScope(new NameExpr("handler")) - .setName("method") - .addArgument( - new FieldAccessExpr().setScope(new NameExpr(OPCODES_FQDN)).setName("INVOKESTATIC")) - .addArgument(new StringLiteralExpr(IAST_METRIC_COLLECTOR_INTERNAL_NAME)) - .addArgument(new StringLiteralExpr("add")) - .addArgument(new StringLiteralExpr(descriptor)) - .addArgument(new BooleanLiteralExpr(false))); + stmt.addStatement(new MethodCallExpr() + .setScope(new NameExpr("handler")) + .setName("instruction") + .addArgument( + new FieldAccessExpr().setScope(new NameExpr(OPCODES_FQDN)).setName("ICONST_1"))); + final String descriptor = tagValue != null + ? "(L" + IAST_METRIC_INTERNAL_NAME + ";BI)V" + : "(L" + IAST_METRIC_INTERNAL_NAME + ";I)V"; + stmt.addStatement(new MethodCallExpr() + .setScope(new NameExpr("handler")) + .setName("method") + .addArgument( + new FieldAccessExpr().setScope(new NameExpr(OPCODES_FQDN)).setName("INVOKESTATIC")) + .addArgument(new StringLiteralExpr(IAST_METRIC_COLLECTOR_INTERNAL_NAME)) + .addArgument(new StringLiteralExpr("add")) + .addArgument(new StringLiteralExpr(descriptor)) + .addArgument(new BooleanLiteralExpr(false))); return stmt; } @@ -311,15 +301,13 @@ private static Map findAdvices( final MethodDeclaration acceptMethod = callSiteProvider.getMethodsBySignature("accept", "Container").get(0); final BlockStmt body = acceptMethod.getBody().get().asBlockStmt(); - final List addAdviceMethods = - body.getStatements().stream() - .filter(IastExtension::isAddAdviceMethodCall) - .map(it -> it.asExpressionStmt().getExpression().asMethodCallExpr()) - .collect(Collectors.toList()); + final List addAdviceMethods = body.getStatements().stream() + .filter(IastExtension::isAddAdviceMethodCall) + .map(it -> it.asExpressionStmt().getExpression().asMethodCallExpr()) + .collect(Collectors.toList()); return result.getSpecification().getAdvices().stream() - .collect( - Collectors.toMap( - Function.identity(), spec -> findAdviceLambda(spec, addAdviceMethods))); + .collect(Collectors.toMap( + Function.identity(), spec -> findAdviceLambda(spec, addAdviceMethods))); } /** @@ -466,11 +454,10 @@ private AdviceMetadata(final AnnotationExpr kind, final Expression tag) { private static AdviceMetadata findAdviceMetadata(final BodyDeclaration target) { return target.getAnnotations().stream() .filter(AdviceMetadata::isAdviceAnnotation) - .map( - annotation -> { - final Expression tag = getAnnotationExpression(annotation); - return new AdviceMetadata(annotation, tag); - }) + .map(annotation -> { + final Expression tag = getAnnotationExpression(annotation); + return new AdviceMetadata(annotation, tag); + }) .findFirst() .orElse(null); } diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceGeneratorTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceGeneratorTest.java index 3206b3c9b31..fd65ff0591f 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceGeneratorTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceGeneratorTest.java @@ -23,7 +23,8 @@ class AdviceGeneratorTest extends BaseCsiPluginTest { - @TempDir private File buildDir; + @TempDir + private File buildDir; @CallSite(spi = CallSites.class) public static class BeforeAdvice { @@ -43,19 +44,17 @@ void testBeforeAdvice() { CallSiteAssert asserter = assertCallSites(result.getFile()); asserter.interfaces(CallSites.class); asserter.helpers(BeforeAdvice.class); - asserter.advices( - 0, - advice -> { - advice.type("BEFORE"); - advice.pointcut( - "java/security/MessageDigest", - "getInstance", - "(Ljava/lang/String;)Ljava/security/MessageDigest;"); - advice.statements( - "handler.dupParameters(descriptor, StackDupMode.COPY);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$BeforeAdvice\", \"before\", \"(Ljava/lang/String;)V\");", - "handler.method(opcode, owner, name, descriptor, isInterface);"); - }); + asserter.advices(0, advice -> { + advice.type("BEFORE"); + advice.pointcut( + "java/security/MessageDigest", + "getInstance", + "(Ljava/lang/String;)Ljava/security/MessageDigest;"); + advice.statements( + "handler.dupParameters(descriptor, StackDupMode.COPY);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$BeforeAdvice\", \"before\", \"(Ljava/lang/String;)V\");", + "handler.method(opcode, owner, name, descriptor, isInterface);"); + }); } @CallSite(spi = CallSites.class) @@ -81,17 +80,15 @@ void testAroundAdvice() { CallSiteAssert asserter = assertCallSites(result.getFile()); asserter.interfaces(CallSites.class); asserter.helpers(AroundAdvice.class); - asserter.advices( - 0, - advice -> { - advice.type("AROUND"); - advice.pointcut( - "java/lang/String", - "replaceAll", - "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); - advice.statements( - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AroundAdvice\", \"around\", \"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\");"); - }); + asserter.advices(0, advice -> { + advice.type("AROUND"); + advice.pointcut( + "java/lang/String", + "replaceAll", + "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); + advice.statements( + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AroundAdvice\", \"around\", \"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\");"); + }); } @CallSite(spi = CallSites.class) @@ -116,16 +113,14 @@ void testAfterAdvice() { CallSiteAssert asserter = assertCallSites(result.getFile()); asserter.interfaces(CallSites.class); asserter.helpers(AfterAdvice.class); - asserter.advices( - 0, - advice -> { - advice.type("AFTER"); - advice.pointcut("java/lang/String", "concat", "(Ljava/lang/String;)Ljava/lang/String;"); - advice.statements( - "handler.dupInvoke(owner, descriptor, StackDupMode.COPY);", - "handler.method(opcode, owner, name, descriptor, isInterface);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AfterAdvice\", \"after\", \"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\");"); - }); + asserter.advices(0, advice -> { + advice.type("AFTER"); + advice.pointcut("java/lang/String", "concat", "(Ljava/lang/String;)Ljava/lang/String;"); + advice.statements( + "handler.dupInvoke(owner, descriptor, StackDupMode.COPY);", + "handler.method(opcode, owner, name, descriptor, isInterface);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AfterAdvice\", \"after\", \"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;\");"); + }); } @CallSite(spi = CallSites.class) @@ -147,15 +142,13 @@ void testAfterAdviceCtor() { CallSiteAssert asserter = assertCallSites(result.getFile()); asserter.interfaces(CallSites.class); asserter.helpers(AfterAdviceCtor.class); - asserter.advices( - 0, - advice -> { - advice.pointcut("java/net/URL", "", "(Ljava/lang/String;)V"); - advice.statements( - "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY_CTOR);", - "handler.method(opcode, owner, name, descriptor, isInterface);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AfterAdviceCtor\", \"after\", \"([Ljava/lang/Object;Ljava/net/URL;)Ljava/net/URL;\");"); - }); + asserter.advices(0, advice -> { + advice.pointcut("java/net/URL", "", "(Ljava/lang/String;)V"); + advice.statements( + "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY_CTOR);", + "handler.method(opcode, owner, name, descriptor, isInterface);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AfterAdviceCtor\", \"after\", \"([Ljava/lang/Object;Ljava/net/URL;)Ljava/net/URL;\");"); + }); } @CallSite(spi = SpiAdvice.SampleSpi.class) @@ -203,18 +196,16 @@ void testInvokeDynamicAfterAdvice() { CallSiteAssert asserter = assertCallSites(result.getFile()); asserter.interfaces(CallSites.class); asserter.helpers(InvokeDynamicAfterAdvice.class); - asserter.advices( - 0, - advice -> { - advice.pointcut( - "java/lang/invoke/StringConcatFactory", - "makeConcatWithConstants", - "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"); - advice.statements( - "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY);", - "handler.invokeDynamic(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$InvokeDynamicAfterAdvice\", \"after\", \"([Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;\");"); - }); + asserter.advices(0, advice -> { + advice.pointcut( + "java/lang/invoke/StringConcatFactory", + "makeConcatWithConstants", + "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"); + advice.statements( + "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY);", + "handler.invokeDynamic(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$InvokeDynamicAfterAdvice\", \"after\", \"([Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;\");"); + }); } @CallSite(spi = CallSites.class) @@ -245,16 +236,14 @@ void testInvokeDynamicAroundAdvice() { CallSiteAssert asserter = assertCallSites(result.getFile()); asserter.interfaces(CallSites.class); asserter.helpers(InvokeDynamicAroundAdvice.class); - asserter.advices( - 0, - advice -> { - advice.pointcut( - "java/lang/invoke/StringConcatFactory", - "makeConcatWithConstants", - "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"); - advice.statements( - "handler.invokeDynamic(name, descriptor, new Handle(Opcodes.H_INVOKESTATIC, \"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$InvokeDynamicAroundAdvice\", \"around\", \"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;\", false), bootstrapMethodArguments);"); - }); + asserter.advices(0, advice -> { + advice.pointcut( + "java/lang/invoke/StringConcatFactory", + "makeConcatWithConstants", + "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"); + advice.statements( + "handler.invokeDynamic(name, descriptor, new Handle(Opcodes.H_INVOKESTATIC, \"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$InvokeDynamicAroundAdvice\", \"around\", \"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;\", false), bootstrapMethodArguments);"); + }); } @CallSite(spi = CallSites.class) @@ -283,19 +272,17 @@ void testInvokeDynamicWithConstantsAdvice() { CallSiteAssert asserter = assertCallSites(result.getFile()); asserter.interfaces(CallSites.class); asserter.helpers(InvokeDynamicWithConstantsAdvice.class); - asserter.advices( - 0, - advice -> { - advice.pointcut( - "java/lang/invoke/StringConcatFactory", - "makeConcatWithConstants", - "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"); - advice.statements( - "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY);", - "handler.invokeDynamic(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);", - "handler.loadConstantArray(bootstrapMethodArguments);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$InvokeDynamicWithConstantsAdvice\", \"after\", \"([Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\");"); - }); + asserter.advices(0, advice -> { + advice.pointcut( + "java/lang/invoke/StringConcatFactory", + "makeConcatWithConstants", + "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"); + advice.statements( + "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY);", + "handler.invokeDynamic(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);", + "handler.loadConstantArray(bootstrapMethodArguments);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$InvokeDynamicWithConstantsAdvice\", \"after\", \"([Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\");"); + }); } @CallSite(spi = CallSites.class) @@ -319,17 +306,13 @@ void testArrayAdvice() { assertNoErrors(result); CallSiteAssert asserter = assertCallSites(result.getFile()); - asserter.advices( - 0, - advice -> { - advice.pointcut("javax/servlet/ServletRequest", "getParameterMap", "()Ljava/util/Map;"); - }); - asserter.advices( - 1, - advice -> { - advice.pointcut( - "javax/servlet/ServletRequestWrapper", "getParameterMap", "()Ljava/util/Map;"); - }); + asserter.advices(0, advice -> { + advice.pointcut("javax/servlet/ServletRequest", "getParameterMap", "()Ljava/util/Map;"); + }); + asserter.advices(1, advice -> { + advice.pointcut( + "javax/servlet/ServletRequestWrapper", "getParameterMap", "()Ljava/util/Map;"); + }); } public static class MinJavaVersionCheck { @@ -390,40 +373,34 @@ void partialArgumentsWithBeforeAdvice() { assertNoErrors(result); CallSiteAssert asserter = assertCallSites(result.getFile()); - asserter.advices( - 0, - advice -> { - advice.pointcut( - "java/sql/Statement", "executeUpdate", "(Ljava/lang/String;[Ljava/lang/String;)I"); - advice.statements( - "int[] parameterIndices = new int[] { 0 };", - "handler.dupParameters(descriptor, parameterIndices, owner);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$PartialArgumentsBeforeAdvice\", \"before\", \"(Ljava/lang/String;)V\");", - "handler.method(opcode, owner, name, descriptor, isInterface);"); - }); - asserter.advices( - 1, - advice -> { - advice.pointcut( - "java/lang/String", - "format", - "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); - advice.statements( - "int[] parameterIndices = new int[] { 1 };", - "handler.dupParameters(descriptor, parameterIndices, null);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$PartialArgumentsBeforeAdvice\", \"before\", \"([Ljava/lang/Object;)V\");", - "handler.method(opcode, owner, name, descriptor, isInterface);"); - }); - asserter.advices( - 2, - advice -> { - advice.pointcut("java/lang/String", "subSequence", "(II)Ljava/lang/CharSequence;"); - advice.statements( - "int[] parameterIndices = new int[] { 0 };", - "handler.dupInvoke(owner, descriptor, parameterIndices);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$PartialArgumentsBeforeAdvice\", \"before\", \"(Ljava/lang/String;I)V\");", - "handler.method(opcode, owner, name, descriptor, isInterface);"); - }); + asserter.advices(0, advice -> { + advice.pointcut( + "java/sql/Statement", "executeUpdate", "(Ljava/lang/String;[Ljava/lang/String;)I"); + advice.statements( + "int[] parameterIndices = new int[] { 0 };", + "handler.dupParameters(descriptor, parameterIndices, owner);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$PartialArgumentsBeforeAdvice\", \"before\", \"(Ljava/lang/String;)V\");", + "handler.method(opcode, owner, name, descriptor, isInterface);"); + }); + asserter.advices(1, advice -> { + advice.pointcut( + "java/lang/String", + "format", + "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); + advice.statements( + "int[] parameterIndices = new int[] { 1 };", + "handler.dupParameters(descriptor, parameterIndices, null);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$PartialArgumentsBeforeAdvice\", \"before\", \"([Ljava/lang/Object;)V\");", + "handler.method(opcode, owner, name, descriptor, isInterface);"); + }); + asserter.advices(2, advice -> { + advice.pointcut("java/lang/String", "subSequence", "(II)Ljava/lang/CharSequence;"); + advice.statements( + "int[] parameterIndices = new int[] { 0 };", + "handler.dupInvoke(owner, descriptor, parameterIndices);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$PartialArgumentsBeforeAdvice\", \"before\", \"(Ljava/lang/String;I)V\");", + "handler.method(opcode, owner, name, descriptor, isInterface);"); + }); } /** @@ -462,33 +439,29 @@ void multiplePartialArgumentsWithBeforeAdvice() { assertNoErrors(result); CallSiteAssert asserter = assertCallSites(result.getFile()); // In-order capture: {0, 1} matches both advice and pointcut order - asserter.advices( - 0, - advice -> { - advice.pointcut( - "java/lang/String", - "format", - "(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); - advice.statements( - "int[] parameterIndices = new int[] { 0, 1 };", - "handler.dupParameters(descriptor, parameterIndices, null);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$MultiplePartialArgumentsBeforeAdvice\", \"before\", \"(Ljava/util/Locale;Ljava/lang/String;)V\");", - "handler.method(opcode, owner, name, descriptor, isInterface);"); - }); + asserter.advices(0, advice -> { + advice.pointcut( + "java/lang/String", + "format", + "(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); + advice.statements( + "int[] parameterIndices = new int[] { 0, 1 };", + "handler.dupParameters(descriptor, parameterIndices, null);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$MultiplePartialArgumentsBeforeAdvice\", \"before\", \"(Ljava/util/Locale;Ljava/lang/String;)V\");", + "handler.method(opcode, owner, name, descriptor, isInterface);"); + }); // Reversed capture: {1, 0} follows the advice signature, not the pointcut index order {0, 1} - asserter.advices( - 1, - advice -> { - advice.pointcut( - "java/lang/String", - "format", - "(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); - advice.statements( - "int[] parameterIndices = new int[] { 1, 0 };", - "handler.dupParameters(descriptor, parameterIndices, null);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$MultiplePartialArgumentsBeforeAdvice\", \"beforeReversed\", \"(Ljava/lang/String;Ljava/util/Locale;)V\");", - "handler.method(opcode, owner, name, descriptor, isInterface);"); - }); + asserter.advices(1, advice -> { + advice.pointcut( + "java/lang/String", + "format", + "(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); + advice.statements( + "int[] parameterIndices = new int[] { 1, 0 };", + "handler.dupParameters(descriptor, parameterIndices, null);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$MultiplePartialArgumentsBeforeAdvice\", \"beforeReversed\", \"(Ljava/lang/String;Ljava/util/Locale;)V\");", + "handler.method(opcode, owner, name, descriptor, isInterface);"); + }); } @CallSite(spi = CallSites.class) @@ -509,16 +482,14 @@ void testReturningSuperType() { assertNoErrors(result); CallSiteAssert asserter = assertCallSites(result.getFile()); - asserter.advices( - 0, - advice -> { - advice.pointcut("java/lang/StringBuilder", "", "(Ljava/lang/String;)V"); - advice.statements( - "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY_CTOR);", - "handler.method(opcode, owner, name, descriptor, isInterface);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$SuperTypeReturnAdvice\", \"after\", \"([Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\");", - "handler.instruction(Opcodes.CHECKCAST, \"java/lang/StringBuilder\");"); - }); + asserter.advices(0, advice -> { + advice.pointcut("java/lang/StringBuilder", "", "(Ljava/lang/String;)V"); + advice.statements( + "handler.dupParameters(descriptor, StackDupMode.PREPEND_ARRAY_CTOR);", + "handler.method(opcode, owner, name, descriptor, isInterface);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$SuperTypeReturnAdvice\", \"after\", \"([Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;\");", + "handler.instruction(Opcodes.CHECKCAST, \"java/lang/StringBuilder\");"); + }); } @CallSite(spi = {IastCallSites.class, RaspCallSites.class}) @@ -557,15 +528,13 @@ void testAfterAdviceWithVoidReturn() { assertNoErrors(result); CallSiteAssert asserter = assertCallSites(result.getFile()); - asserter.advices( - 0, - advice -> { - advice.pointcut("java/lang/StringBuilder", "setLength", "(I)V"); - advice.statements( - "handler.dupInvoke(owner, descriptor, StackDupMode.COPY);", - "handler.method(opcode, owner, name, descriptor, isInterface);", - "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AfterAdviceWithVoidReturn\", \"after\", \"(Ljava/lang/StringBuilder;I)V\");"); - }); + asserter.advices(0, advice -> { + advice.pointcut("java/lang/StringBuilder", "setLength", "(I)V"); + advice.statements( + "handler.dupInvoke(owner, descriptor, StackDupMode.COPY);", + "handler.method(opcode, owner, name, descriptor, isInterface);", + "handler.advice(\"datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AfterAdviceWithVoidReturn\", \"after\", \"(Ljava/lang/StringBuilder;I)V\");"); + }); } private static AdviceGenerator buildAdviceGenerator(File targetFolder) { diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceSpecificationTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceSpecificationTest.java index 3c9fe3cacb5..c07ff88e647 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceSpecificationTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AdviceSpecificationTest.java @@ -82,12 +82,11 @@ static Stream adviceClassShouldBeOnClasspathProvider() { @MethodSource("adviceClassShouldBeOnClasspathProvider") void testAdviceClassShouldBeOnTheClasspath(Type type, int errors) throws Exception { ValidationContext context = mockValidationContext(); - BeforeSpecification spec = - createBeforeSpec( - BeforeStringConcat.class.getDeclaredMethod("concat", String.class, String.class), - type, - Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + BeforeSpecification spec = createBeforeSpec( + BeforeStringConcat.class.getDeclaredMethod("concat", String.class, String.class), + type, + Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -103,14 +102,13 @@ static Stream beforeAdviceShouldReturnVoidProvider() { @MethodSource("beforeAdviceShouldReturnVoidProvider") void testBeforeAdviceShouldReturnVoid(Class returnType, int errors) { ValidationContext context = mockValidationContext(); - BeforeSpecification spec = - createBeforeSpec( - BeforeStringConcat.class, - "concat", - returnType, - new Class[] {String.class, String.class}, - Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + BeforeSpecification spec = createBeforeSpec( + BeforeStringConcat.class, + "concat", + returnType, + new Class[] {String.class, String.class}, + Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)).addError(eq(ErrorCode.ADVICE_BEFORE_SHOULD_RETURN_VOID), any()); @@ -133,14 +131,13 @@ static Stream aroundAdviceReturnTypeProvider() { @MethodSource("aroundAdviceReturnTypeProvider") void testAroundAdviceShouldReturnTypeCompatibleWithPointcut(Class returnType, int errors) { ValidationContext context = mockValidationContext(); - AroundSpecification spec = - createAroundSpec( - AroundStringConcat.class, - "concat", - returnType, - new Class[] {String.class, String.class}, - Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + AroundSpecification spec = createAroundSpec( + AroundStringConcat.class, + "concat", + returnType, + new Class[] {String.class, String.class}, + Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -164,15 +161,14 @@ static Stream afterAdviceReturnTypeProvider() { @MethodSource("afterAdviceReturnTypeProvider") void testAfterAdviceShouldReturnTypeCompatibleWithPointcut(Class returnType, int errors) { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - AfterStringConcat.class, - "concat", - returnType, - new Class[] {String.class, String.class, String.class}, - Arrays.asList( - new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + AfterStringConcat.class, + "concat", + returnType, + new Class[] {String.class, String.class, String.class}, + Arrays.asList( + new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -190,11 +186,10 @@ static Stream thisParameterShouldBeFirstProvider() { void testThisParameterShouldAlwaysBeTheFirst(List params, int errors) throws Exception { ValidationContext context = mockValidationContext(); - AroundSpecification spec = - createAroundSpec( - AroundStringConcat.class.getDeclaredMethod("concat", String.class, String.class), - params, - "java.lang.String java.lang.String.concat(java.lang.String)"); + AroundSpecification spec = createAroundSpec( + AroundStringConcat.class.getDeclaredMethod("concat", String.class, String.class), + params, + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -212,14 +207,13 @@ static Stream thisParameterCompatibilityProvider() { @MethodSource("thisParameterCompatibilityProvider") void testThisParameterShouldBeCompatibleWithPointcut(Class type, int errors) { ValidationContext context = mockValidationContext(); - AroundSpecification spec = - createAroundSpec( - AroundStringConcat.class, - "concat", - String.class, - new Class[] {type, String.class}, - Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + AroundSpecification spec = createAroundSpec( + AroundStringConcat.class, + "concat", + String.class, + new Class[] {type, String.class}, + Arrays.asList(new ThisSpecification(), new ArgumentSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -248,12 +242,11 @@ static Stream returnParameterShouldBeLastProvider() { void testReturnParameterShouldAlwaysBeTheLast(List params, int errors) throws Exception { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - AfterStringConcat.class.getDeclaredMethod( - "concat", String.class, String.class, String.class), - params, - "java.lang.String java.lang.String.concat(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + AfterStringConcat.class.getDeclaredMethod( + "concat", String.class, String.class, String.class), + params, + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -271,15 +264,14 @@ static Stream returnParameterCompatibilityProvider() { @MethodSource("returnParameterCompatibilityProvider") void testReturnParameterShouldBeCompatibleWithPointcut(Class returnType, int errors) { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - AfterStringConcat.class, - "concat", - String.class, - new Class[] {String.class, String.class, returnType}, - Arrays.asList( - new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + AfterStringConcat.class, + "concat", + String.class, + new Class[] {String.class, String.class, returnType}, + Arrays.asList( + new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -302,15 +294,14 @@ static Stream argumentParameterCompatibilityProvider() { @MethodSource("argumentParameterCompatibilityProvider") void testArgumentParameterShouldBeCompatibleWithPointcut(Class parameterType, int errors) { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - AfterStringConcat.class, - "concat", - String.class, - new Class[] {String.class, parameterType, String.class}, - Arrays.asList( - new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + AfterStringConcat.class, + "concat", + String.class, + new Class[] {String.class, parameterType, String.class}, + Arrays.asList( + new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context, times(errors)) @@ -343,11 +334,10 @@ static Stream afterAdviceRequiresThisAndReturnProvider() { void testAfterAdviceRequiresThisAndReturnParameters( List params, ErrorCode error) throws Exception { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - BadAfterStringConcat.class.getDeclaredMethod("concat", String.class, String.class), - params, - "java.lang.String java.lang.String.concat(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + BadAfterStringConcat.class.getDeclaredMethod("concat", String.class, String.class), + params, + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context).addError(eq(error), any()); @@ -364,12 +354,11 @@ void shouldNotMixAllArgumentsAndArgument() throws Exception { ValidationContext context = mockValidationContext(); AllArgsSpecification allArgs = new AllArgsSpecification(); allArgs.setIncludeThis(true); - AfterSpecification spec = - createAfterSpec( - BadAllArgsAfterStringConcat.class.getDeclaredMethod( - "concat", Object[].class, String.class, String.class), - Arrays.asList(allArgs, new ArgumentSpecification(), new ReturnSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + BadAllArgsAfterStringConcat.class.getDeclaredMethod( + "concat", Object[].class, String.class, String.class), + Arrays.asList(allArgs, new ArgumentSpecification(), new ReturnSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context).addError(eq(ErrorCode.ADVICE_PARAMETER_ALL_ARGS_MIXED), any()); @@ -385,13 +374,12 @@ static String after(ServletRequest request, String parameter, String value) { @Test void testInheritedMethods() throws Exception { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - TestInheritedMethod.class.getDeclaredMethod( - "after", ServletRequest.class, String.class, String.class), - Arrays.asList( - new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), - "java.lang.String javax.servlet.http.HttpServletRequest.getParameter(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + TestInheritedMethod.class.getDeclaredMethod( + "after", ServletRequest.class, String.class, String.class), + Arrays.asList( + new ThisSpecification(), new ArgumentSpecification(), new ReturnSpecification()), + "java.lang.String javax.servlet.http.HttpServletRequest.getParameter(java.lang.String)"); spec.validate(context); } @@ -406,16 +394,15 @@ static Object after(Object[] parameter, Object result, Object[] constants) { @EnabledForJreRange(min = JRE.JAVA_9) void testInvokeDynamicConstants() throws Exception { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - TestInvokeDynamicConstants.class.getDeclaredMethod( - "after", Object[].class, Object.class, Object[].class), - Arrays.asList( - new AllArgsSpecification(), - new ReturnSpecification(), - new InvokeDynamicConstantsSpecification()), - "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", - true); + AfterSpecification spec = createAfterSpec( + TestInvokeDynamicConstants.class.getDeclaredMethod( + "after", Object[].class, Object.class, Object[].class), + Arrays.asList( + new AllArgsSpecification(), + new ReturnSpecification(), + new InvokeDynamicConstantsSpecification()), + "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", + true); spec.validate(context); } @@ -442,13 +429,12 @@ static Stream invokeDynamicConstantsShouldBeLastProvider() { void testInvokeDynamicConstantsShouldBeLast(List params, ErrorCode error) throws Exception { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - TestInvokeDynamicConstants.class.getDeclaredMethod( - "after", Object[].class, Object.class, Object[].class), - params, - "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", - true); + AfterSpecification spec = createAfterSpec( + TestInvokeDynamicConstants.class.getDeclaredMethod( + "after", Object[].class, Object.class, Object[].class), + params, + "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", + true); spec.validate(context); if (error != null) { @@ -466,16 +452,15 @@ static Object after(Object self, Object[] parameter, Object value, Object[] cons @EnabledForJreRange(min = JRE.JAVA_9) void testInvokeDynamicConstantsOnNonInvokeDynamicPointcut() throws Exception { ValidationContext context = mockValidationContext(); - AfterSpecification spec = - createAfterSpec( - TestInvokeDynamicConstantsNonInvokeDynamic.class.getDeclaredMethod( - "after", Object.class, Object[].class, Object.class, Object[].class), - Arrays.asList( - new ThisSpecification(), - new AllArgsSpecification(), - new InvokeDynamicConstantsSpecification(), - new ReturnSpecification()), - "java.lang.String java.lang.String.concat(java.lang.String)"); + AfterSpecification spec = createAfterSpec( + TestInvokeDynamicConstantsNonInvokeDynamic.class.getDeclaredMethod( + "after", Object.class, Object[].class, Object.class, Object[].class), + Arrays.asList( + new ThisSpecification(), + new AllArgsSpecification(), + new InvokeDynamicConstantsSpecification(), + new ReturnSpecification()), + "java.lang.String java.lang.String.concat(java.lang.String)"); spec.validate(context); verify(context) @@ -491,13 +476,12 @@ static void before(Object[] parameter, Object[] constants) {} @EnabledForJreRange(min = JRE.JAVA_9) void testInvokeDynamicConstantsOnNonAfterAdvice() throws Exception { ValidationContext context = mockValidationContext(); - BeforeSpecification spec = - createBeforeSpec( - TestInvokeDynamicConstantsBefore.class.getDeclaredMethod( - "before", Object[].class, Object[].class), - Arrays.asList(new AllArgsSpecification(), new InvokeDynamicConstantsSpecification()), - "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", - true); + BeforeSpecification spec = createBeforeSpec( + TestInvokeDynamicConstantsBefore.class.getDeclaredMethod( + "before", Object[].class, Object[].class), + Arrays.asList(new AllArgsSpecification(), new InvokeDynamicConstantsSpecification()), + "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", + true); spec.validate(context); verify(context) @@ -519,23 +503,22 @@ static java.lang.invoke.CallSite around( @EnabledForJreRange(min = JRE.JAVA_9) void testInvokeDynamicOnAroundAdvice() throws Exception { ValidationContext context = mockValidationContext(); - AroundSpecification spec = - createAroundSpec( - TestInvokeDynamicConstantsAround.class.getDeclaredMethod( - "around", - MethodHandles.Lookup.class, - String.class, - java.lang.invoke.MethodType.class, - String.class, - Object[].class), - Arrays.asList( - new ArgumentSpecification(), - new ArgumentSpecification(), - new ArgumentSpecification(), - new ArgumentSpecification(), - new ArgumentSpecification()), - "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", - true); + AroundSpecification spec = createAroundSpec( + TestInvokeDynamicConstantsAround.class.getDeclaredMethod( + "around", + MethodHandles.Lookup.class, + String.class, + java.lang.invoke.MethodType.class, + String.class, + Object[].class), + Arrays.asList( + new ArgumentSpecification(), + new ArgumentSpecification(), + new ArgumentSpecification(), + new ArgumentSpecification(), + new ArgumentSpecification()), + "java.lang.invoke.CallSite java.lang.invoke.StringConcatFactory.makeConcatWithConstants(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType, java.lang.String, java.lang.Object[])", + true); spec.validate(context); } diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilderTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilderTest.java index 14ad65bfb0b..9b6b79ac896 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilderTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/AsmSpecificationBuilderTest.java @@ -78,12 +78,10 @@ void testSpecificationBuilderWithCustomHelperClasses() { specificationBuilder.build(advice).orElseThrow(RuntimeException::new); List helpers = Arrays.asList(result.getHelpers()); - assertTrue( - helpers.containsAll( - Arrays.asList( - Type.getType(HelpersAdvice.class), - Type.getType(HelpersAdvice.SampleHelper1.class), - Type.getType(HelpersAdvice.SampleHelper2.class)))); + assertTrue(helpers.containsAll(Arrays.asList( + Type.getType(HelpersAdvice.class), + Type.getType(HelpersAdvice.SampleHelper1.class), + Type.getType(HelpersAdvice.SampleHelper2.class)))); } @CallSite(spi = CallSites.class) diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/BaseCsiPluginTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/BaseCsiPluginTest.java index a2bd158d20b..bf83afc17d9 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/BaseCsiPluginTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/BaseCsiPluginTest.java @@ -22,14 +22,12 @@ public abstract class BaseCsiPluginTest { protected static void assertNoErrors(HasErrors hasErrors) { - List errors = - hasErrors.getErrors().stream() - .map( - error -> { - String causeString = error.getCause() == null ? "-" : error.getCauseString(); - return error.getMessage() + ": " + causeString; - }) - .collect(Collectors.toList()); + List errors = hasErrors.getErrors().stream() + .map(error -> { + String causeString = error.getCause() == null ? "-" : error.getCauseString(); + return error.getMessage() + ": " + causeString; + }) + .collect(Collectors.toList()); assertEquals(Collections.emptyList(), errors); } diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/CallSiteSpecificationTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/CallSiteSpecificationTest.java index a0d60d379c1..8a370f3520a 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/CallSiteSpecificationTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/CallSiteSpecificationTest.java @@ -25,9 +25,8 @@ void testCallSiteSpiShouldBeAnInterface() { Set spiTypes = Collections.singleton(Type.getType(String.class)); List helperClassNames = Collections.emptyList(); Set constants = Collections.emptySet(); - CallSiteSpecification spec = - new CallSiteSpecification( - Type.getType(String.class), advices, spiTypes, helperClassNames, constants); + CallSiteSpecification spec = new CallSiteSpecification( + Type.getType(String.class), advices, spiTypes, helperClassNames, constants); spec.validate(context); @@ -42,9 +41,8 @@ void testCallSiteSpiShouldNotDefineAnyMethods() { Set spiTypes = Collections.singleton(Type.getType(Comparable.class)); List helperClassNames = Collections.emptyList(); Set constants = Collections.emptySet(); - CallSiteSpecification spec = - new CallSiteSpecification( - Type.getType(String.class), advices, spiTypes, helperClassNames, constants); + CallSiteSpecification spec = new CallSiteSpecification( + Type.getType(String.class), advices, spiTypes, helperClassNames, constants); spec.validate(context); @@ -58,9 +56,8 @@ void testCallSiteShouldHaveAdvices() { Set spiTypes = Collections.singleton(Type.getType(CallSiteAdvice.class)); List helperClassNames = Collections.emptyList(); Set constants = Collections.emptySet(); - CallSiteSpecification spec = - new CallSiteSpecification( - Type.getType(String.class), advices, spiTypes, helperClassNames, constants); + CallSiteSpecification spec = new CallSiteSpecification( + Type.getType(String.class), advices, spiTypes, helperClassNames, constants); spec.validate(context); diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParserTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParserTest.java index 550082ccb7d..1f492876cc2 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParserTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/RegexpAdvicePointcutParserTest.java @@ -11,9 +11,8 @@ class RegexpAdvicePointcutParserTest { void resolveConstructor() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "void datadog.trace.plugin.csi.samples.SignatureParserExample.()"); + MethodType signature = pointcutParser.parse( + "void datadog.trace.plugin.csi.samples.SignatureParserExample.()"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -26,9 +25,8 @@ void resolveConstructor() { void resolveConstructorWithArgs() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "void datadog.trace.plugin.csi.samples.SignatureParserExample.(java.lang.String)"); + MethodType signature = pointcutParser.parse( + "void datadog.trace.plugin.csi.samples.SignatureParserExample.(java.lang.String)"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -41,9 +39,8 @@ void resolveConstructorWithArgs() { void resolveWithoutArgs() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.noParams()"); + MethodType signature = pointcutParser.parse( + "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.noParams()"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -56,24 +53,23 @@ void resolveWithoutArgs() { void resolveOneParam() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.oneParam(java.util.Map)"); + MethodType signature = pointcutParser.parse( + "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.oneParam(java.util.Map)"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", signature.getOwner().getClassName()); assertEquals("oneParam", signature.getMethodName()); - assertEquals("(Ljava/util/Map;)Ljava/lang/String;", signature.getMethodType().getDescriptor()); + assertEquals( + "(Ljava/util/Map;)Ljava/lang/String;", signature.getMethodType().getDescriptor()); } @Test void resolveMultipleParams() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.multipleParams(java.lang.String, int, java.util.List)"); + MethodType signature = pointcutParser.parse( + "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.multipleParams(java.lang.String, int, java.util.List)"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -88,9 +84,8 @@ void resolveMultipleParams() { void resolveVarargs() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.varargs(java.lang.String[])"); + MethodType signature = pointcutParser.parse( + "java.lang.String datadog.trace.plugin.csi.samples.SignatureParserExample.varargs(java.lang.String[])"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -104,9 +99,8 @@ void resolveVarargs() { void resolvePrimitive() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "int datadog.trace.plugin.csi.samples.SignatureParserExample.primitive()"); + MethodType signature = pointcutParser.parse( + "int datadog.trace.plugin.csi.samples.SignatureParserExample.primitive()"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -119,9 +113,8 @@ void resolvePrimitive() { void resolvePrimitiveArrayType() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "byte[] datadog.trace.plugin.csi.samples.SignatureParserExample.primitiveArray()"); + MethodType signature = pointcutParser.parse( + "byte[] datadog.trace.plugin.csi.samples.SignatureParserExample.primitiveArray()"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -134,9 +127,8 @@ void resolvePrimitiveArrayType() { void resolveObjectArrayType() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "java.lang.Object[] datadog.trace.plugin.csi.samples.SignatureParserExample.objectArray()"); + MethodType signature = pointcutParser.parse( + "java.lang.Object[] datadog.trace.plugin.csi.samples.SignatureParserExample.objectArray()"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", @@ -149,9 +141,8 @@ void resolveObjectArrayType() { void resolveMultiDimensionalObjectArrayType() { RegexpAdvicePointcutParser pointcutParser = new RegexpAdvicePointcutParser(); - MethodType signature = - pointcutParser.parse( - "java.lang.Object[][][] datadog.trace.plugin.csi.samples.SignatureParserExample.objectArray()"); + MethodType signature = pointcutParser.parse( + "java.lang.Object[][][] datadog.trace.plugin.csi.samples.SignatureParserExample.objectArray()"); assertEquals( "datadog.trace.plugin.csi.samples.SignatureParserExample", diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/TypeResolverPoolTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/TypeResolverPoolTest.java index 39a49d26c8b..aebb4e20ff9 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/TypeResolverPoolTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/TypeResolverPoolTest.java @@ -50,9 +50,8 @@ void testResolveClassMultidimensionalArray() { @Test void testTypeResolverFromMethod() { - Type type = - Type.getMethodType( - Type.getType(String[].class), Type.getType(String.class), Type.getType(String.class)); + Type type = Type.getMethodType( + Type.getType(String[].class), Type.getType(String.class), Type.getType(String.class)); assertEquals(String[].class, resolver.resolveType(type.getReturnType())); } diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/assertion/AssertBuilder.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/assertion/AssertBuilder.java index 42e87842adc..b37e240e791 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/assertion/AssertBuilder.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/assertion/AssertBuilder.java @@ -53,42 +53,34 @@ public CallSiteAssert build() { protected Set> getSpi(ClassOrInterfaceDeclaration type) { return type.getAnnotationByName("AutoService") - .>>map( - annotation -> - annotation.asNormalAnnotationExpr().getPairs().stream() - .filter(pair -> pair.getNameAsString().equals("value")) - .flatMap( - pair -> - pair.getValue().asArrayInitializerExpr().getValues().stream() - .map( - value -> - value - .asClassExpr() - .getType() - .resolve() - .asReferenceType() - .getTypeDeclaration() - .get() - .getQualifiedName())) - .map(AssertBuilder::loadClass) - .collect(Collectors.toSet())) + .>>map(annotation -> annotation.asNormalAnnotationExpr().getPairs().stream() + .filter(pair -> pair.getNameAsString().equals("value")) + .flatMap(pair -> pair.getValue().asArrayInitializerExpr().getValues().stream() + .map(value -> value + .asClassExpr() + .getType() + .resolve() + .asReferenceType() + .getTypeDeclaration() + .get() + .getQualifiedName())) + .map(AssertBuilder::loadClass) + .collect(Collectors.toSet())) .orElse(Collections.emptySet()); } protected Set> getInterfaces(ClassOrInterfaceDeclaration type) { return type.getImplementedTypes().stream() - .map( - implementedType -> { - String qualifiedName = - implementedType - .asClassOrInterfaceType() - .resolve() - .asReferenceType() - .getTypeDeclaration() - .get() - .getQualifiedName(); - return loadClass(qualifiedName); - }) + .map(implementedType -> { + String qualifiedName = implementedType + .asClassOrInterfaceType() + .resolve() + .asReferenceType() + .getTypeDeclaration() + .get() + .getQualifiedName(); + return loadClass(qualifiedName); + }) .collect(Collectors.toSet()); } @@ -115,21 +107,19 @@ protected Object[] getEnabledDeclaration( return new Object[] {null, null}; } MethodDeclaration isEnabled = type.getMethodsByName("isEnabled").get(0); - MethodCallExpr enabledMethodCall = - isEnabled - .getBody() - .get() - .getStatements() - .get(0) - .asReturnStmt() - .getExpression() - .get() - .asMethodCallExpr(); + MethodCallExpr enabledMethodCall = isEnabled + .getBody() + .get() + .getStatements() + .get(0) + .asReturnStmt() + .getExpression() + .get() + .asMethodCallExpr(); Method enabled = resolveMethod(enabledMethodCall); - Set enabledArgs = - enabledMethodCall.getArguments().stream() - .map(arg -> arg.asStringLiteralExpr().asString()) - .collect(Collectors.toSet()); + Set enabledArgs = enabledMethodCall.getArguments().stream() + .map(arg -> arg.asStringLiteralExpr().asString()) + .collect(Collectors.toSet()); return new Object[] {enabled, enabledArgs}; } @@ -139,11 +129,10 @@ protected Set> getHelpers(ClassOrInterfaceDeclaration type) { return methodCalls.stream() .filter(methodCall -> methodCall.getNameAsString().equals("addHelpers")) .flatMap(methodCall -> methodCall.getArguments().stream()) - .map( - arg -> { - String className = arg.asStringLiteralExpr().asString(); - return typeResolver().resolveType(classNameToType(className)); - }) + .map(arg -> { + String className = arg.asStringLiteralExpr().asString(); + return typeResolver().resolveType(classNameToType(className)); + }) .collect(Collectors.toSet()); } @@ -151,33 +140,30 @@ protected List getAdvices(ClassOrInterfaceDeclaration type) { MethodDeclaration acceptMethod = type.getMethodsByName("accept").get(0); return getMethodCalls(acceptMethod).stream() .filter(methodCall -> methodCall.getNameAsString().equals("addAdvice")) - .map( - methodCall -> { - String adviceType = methodCall.getArgument(0).asFieldAccessExpr().getNameAsString(); - String owner = methodCall.getArgument(1).asStringLiteralExpr().asString(); - String method = methodCall.getArgument(2).asStringLiteralExpr().asString(); - String descriptor = methodCall.getArgument(3).asStringLiteralExpr().asString(); - List statements = - methodCall - .getArgument(4) - .asLambdaExpr() - .getBody() - .asBlockStmt() - .getStatements() - .stream() - .map(Object::toString) - .collect(Collectors.toList()); - return new AdviceAssert(adviceType, owner, method, descriptor, statements); - }) + .map(methodCall -> { + String adviceType = methodCall.getArgument(0).asFieldAccessExpr().getNameAsString(); + String owner = methodCall.getArgument(1).asStringLiteralExpr().asString(); + String method = methodCall.getArgument(2).asStringLiteralExpr().asString(); + String descriptor = methodCall.getArgument(3).asStringLiteralExpr().asString(); + List statements = + methodCall + .getArgument(4) + .asLambdaExpr() + .getBody() + .asBlockStmt() + .getStatements() + .stream() + .map(Object::toString) + .collect(Collectors.toList()); + return new AdviceAssert(adviceType, owner, method, descriptor, statements); + }) .collect(Collectors.toList()); } protected static List getMethodCalls(MethodDeclaration method) { return method.getBody().get().asBlockStmt().getStatements().stream() - .filter( - stmt -> - stmt.isExpressionStmt() - && stmt.asExpressionStmt().getExpression().isMethodCallExpr()) + .filter(stmt -> + stmt.isExpressionStmt() && stmt.asExpressionStmt().getExpression().isMethodCallExpr()) .map(stmt -> stmt.asExpressionStmt().getExpression().asMethodCallExpr()) .collect(Collectors.toList()); } diff --git a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/ext/IastExtensionTest.java b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/ext/IastExtensionTest.java index cf42e18cbd5..b6fd58314cf 100644 --- a/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/ext/IastExtensionTest.java +++ b/buildSrc/call-site-instrumentation-plugin/src/test/java/datadog/trace/plugin/csi/impl/ext/IastExtensionTest.java @@ -40,7 +40,9 @@ class IastExtensionTest extends BaseCsiPluginTest { - @TempDir private File buildDir; + @TempDir + private File buildDir; + private Path targetFolder; private Path projectFolder; private Path srcFolder; @@ -94,72 +96,52 @@ void testThatExtensionGeneratesACallSiteWithTelemetry() throws Exception { assertNoErrors(result); IastExtensionCallSiteAssert asserter = assertCallSites(result.getFile()); - asserter.iastAdvices( - 0, - advice -> { - advice.pointcut( - "javax/servlet/http/HttpServletRequest", - "getHeader", - "(Ljava/lang/String;)Ljava/lang/String;"); - advice.instrumentedMetric( - "IastMetric.INSTRUMENTED_SOURCE", - metric -> { - metric.metricStatements( - "IastMetricCollector.add(IastMetric.INSTRUMENTED_SOURCE, (byte) 3, 1);"); - }); - advice.executedMetric( - "IastMetric.EXECUTED_SOURCE", - metric -> { - metric.metricStatements( - "handler.field(net.bytebuddy.jar.asm.Opcodes.GETSTATIC, \"datadog/trace/api/iast/telemetry/IastMetric\", \"EXECUTED_SOURCE\", \"Ldatadog/trace/api/iast/telemetry/IastMetric;\");", - "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_3);", - "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_1);", - "handler.method(net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC, \"datadog/trace/api/iast/telemetry/IastMetricCollector\", \"add\", \"(Ldatadog/trace/api/iast/telemetry/IastMetric;BI)V\", false);"); - }); - }); - asserter.iastAdvices( - 1, - advice -> { - advice.pointcut( - "javax/servlet/http/HttpServletRequest", - "getInputStream", - "()Ljavax/servlet/ServletInputStream;"); - advice.instrumentedMetric( - "IastMetric.INSTRUMENTED_SOURCE", - metric -> { - metric.metricStatements( - "IastMetricCollector.add(IastMetric.INSTRUMENTED_SOURCE, (byte) 127, 1);"); - }); - advice.executedMetric( - "IastMetric.EXECUTED_SOURCE", - metric -> { - metric.metricStatements( - "handler.field(net.bytebuddy.jar.asm.Opcodes.GETSTATIC, \"datadog/trace/api/iast/telemetry/IastMetric\", \"EXECUTED_SOURCE\", \"Ldatadog/trace/api/iast/telemetry/IastMetric;\");", - "handler.instruction(net.bytebuddy.jar.asm.Opcodes.BIPUSH, 127);", - "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_1);", - "handler.method(net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC, \"datadog/trace/api/iast/telemetry/IastMetricCollector\", \"add\", \"(Ldatadog/trace/api/iast/telemetry/IastMetric;BI)V\", false);"); - }); - }); - asserter.iastAdvices( - 2, - advice -> { - advice.pointcut( - "javax/servlet/ServletRequest", "getReader", "()Ljava/io/BufferedReader;"); - advice.instrumentedMetric( - "IastMetric.INSTRUMENTED_PROPAGATION", - metric -> { - metric.metricStatements( - "IastMetricCollector.add(IastMetric.INSTRUMENTED_PROPAGATION, 1);"); - }); - advice.executedMetric( - "IastMetric.EXECUTED_PROPAGATION", - metric -> { - metric.metricStatements( - "handler.field(net.bytebuddy.jar.asm.Opcodes.GETSTATIC, \"datadog/trace/api/iast/telemetry/IastMetric\", \"EXECUTED_PROPAGATION\", \"Ldatadog/trace/api/iast/telemetry/IastMetric;\");", - "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_1);", - "handler.method(net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC, \"datadog/trace/api/iast/telemetry/IastMetricCollector\", \"add\", \"(Ldatadog/trace/api/iast/telemetry/IastMetric;I)V\", false);"); - }); - }); + asserter.iastAdvices(0, advice -> { + advice.pointcut( + "javax/servlet/http/HttpServletRequest", + "getHeader", + "(Ljava/lang/String;)Ljava/lang/String;"); + advice.instrumentedMetric("IastMetric.INSTRUMENTED_SOURCE", metric -> { + metric.metricStatements( + "IastMetricCollector.add(IastMetric.INSTRUMENTED_SOURCE, (byte) 3, 1);"); + }); + advice.executedMetric("IastMetric.EXECUTED_SOURCE", metric -> { + metric.metricStatements( + "handler.field(net.bytebuddy.jar.asm.Opcodes.GETSTATIC, \"datadog/trace/api/iast/telemetry/IastMetric\", \"EXECUTED_SOURCE\", \"Ldatadog/trace/api/iast/telemetry/IastMetric;\");", + "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_3);", + "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_1);", + "handler.method(net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC, \"datadog/trace/api/iast/telemetry/IastMetricCollector\", \"add\", \"(Ldatadog/trace/api/iast/telemetry/IastMetric;BI)V\", false);"); + }); + }); + asserter.iastAdvices(1, advice -> { + advice.pointcut( + "javax/servlet/http/HttpServletRequest", + "getInputStream", + "()Ljavax/servlet/ServletInputStream;"); + advice.instrumentedMetric("IastMetric.INSTRUMENTED_SOURCE", metric -> { + metric.metricStatements( + "IastMetricCollector.add(IastMetric.INSTRUMENTED_SOURCE, (byte) 127, 1);"); + }); + advice.executedMetric("IastMetric.EXECUTED_SOURCE", metric -> { + metric.metricStatements( + "handler.field(net.bytebuddy.jar.asm.Opcodes.GETSTATIC, \"datadog/trace/api/iast/telemetry/IastMetric\", \"EXECUTED_SOURCE\", \"Ldatadog/trace/api/iast/telemetry/IastMetric;\");", + "handler.instruction(net.bytebuddy.jar.asm.Opcodes.BIPUSH, 127);", + "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_1);", + "handler.method(net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC, \"datadog/trace/api/iast/telemetry/IastMetricCollector\", \"add\", \"(Ldatadog/trace/api/iast/telemetry/IastMetric;BI)V\", false);"); + }); + }); + asserter.iastAdvices(2, advice -> { + advice.pointcut("javax/servlet/ServletRequest", "getReader", "()Ljava/io/BufferedReader;"); + advice.instrumentedMetric("IastMetric.INSTRUMENTED_PROPAGATION", metric -> { + metric.metricStatements("IastMetricCollector.add(IastMetric.INSTRUMENTED_PROPAGATION, 1);"); + }); + advice.executedMetric("IastMetric.EXECUTED_PROPAGATION", metric -> { + metric.metricStatements( + "handler.field(net.bytebuddy.jar.asm.Opcodes.GETSTATIC, \"datadog/trace/api/iast/telemetry/IastMetric\", \"EXECUTED_PROPAGATION\", \"Ldatadog/trace/api/iast/telemetry/IastMetric;\");", + "handler.instruction(net.bytebuddy.jar.asm.Opcodes.ICONST_1);", + "handler.method(net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC, \"datadog/trace/api/iast/telemetry/IastMetricCollector\", \"add\", \"(Ldatadog/trace/api/iast/telemetry/IastMetric;I)V\", false);"); + }); + }); } private static AdviceGenerator buildAdviceGenerator(File targetFolder) { @@ -167,7 +149,8 @@ private static AdviceGenerator buildAdviceGenerator(File targetFolder) { } private static Path getCallSiteSrcFolder() throws Exception { - File file = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI()); + File file = + new File(Thread.currentThread().getContextClassLoader().getResource("").toURI()); return file.toPath().resolve("../../../../src/test/java"); } @@ -272,42 +255,34 @@ public IastExtensionCallSiteAssert build() { protected List getAdvices(ClassOrInterfaceDeclaration type) { return getMethodCalls(type.getMethodsByName("accept").get(0)).stream() .filter(methodCall -> methodCall.getNameAsString().equals("addAdvice")) - .map( - methodCall -> { - String owner = methodCall.getArgument(1).asStringLiteralExpr().asString(); - String method = methodCall.getArgument(2).asStringLiteralExpr().asString(); - String descriptor = methodCall.getArgument(3).asStringLiteralExpr().asString(); - List statements = - methodCall - .getArgument(4) - .asLambdaExpr() - .getBody() - .asBlockStmt() - .getStatements(); - IfStmt instrumentedStmt = statements.get(0).asIfStmt(); - IfStmt executedStmt = statements.get(1).asIfStmt(); - List nonIfStatements = - statements.stream() - .filter(stmt -> !stmt.isIfStmt()) - .map(Object::toString) - .collect(Collectors.toList()); - return new IastExtensionAdviceAssert( - owner, - method, - descriptor, - buildMetricAsserter(instrumentedStmt), - buildMetricAsserter(executedStmt), - nonIfStatements); - }) + .map(methodCall -> { + String owner = methodCall.getArgument(1).asStringLiteralExpr().asString(); + String method = methodCall.getArgument(2).asStringLiteralExpr().asString(); + String descriptor = methodCall.getArgument(3).asStringLiteralExpr().asString(); + List statements = + methodCall.getArgument(4).asLambdaExpr().getBody().asBlockStmt().getStatements(); + IfStmt instrumentedStmt = statements.get(0).asIfStmt(); + IfStmt executedStmt = statements.get(1).asIfStmt(); + List nonIfStatements = statements.stream() + .filter(stmt -> !stmt.isIfStmt()) + .map(Object::toString) + .collect(Collectors.toList()); + return new IastExtensionAdviceAssert( + owner, + method, + descriptor, + buildMetricAsserter(instrumentedStmt), + buildMetricAsserter(executedStmt), + nonIfStatements); + }) .collect(Collectors.toList()); } protected IastExtensionMetricAsserter buildMetricAsserter(IfStmt ifStmt) { String metric = ifStmt.getCondition().asMethodCallExpr().getScope().get().toString(); - List statements = - ifStmt.getThenStmt().asBlockStmt().getStatements().stream() - .map(Object::toString) - .collect(Collectors.toList()); + List statements = ifStmt.getThenStmt().asBlockStmt().getStatements().stream() + .map(Object::toString) + .collect(Collectors.toList()); return new IastExtensionMetricAsserter(metric, statements); } } diff --git a/communication/src/main/java/datadog/communication/BackendApiFactory.java b/communication/src/main/java/datadog/communication/BackendApiFactory.java index 2ac0447fc7d..8eda231a58a 100644 --- a/communication/src/main/java/datadog/communication/BackendApiFactory.java +++ b/communication/src/main/java/datadog/communication/BackendApiFactory.java @@ -34,9 +34,8 @@ public BackendApiFactory(Config config, SharedCommunicationObjects sharedCommuni BackendApi backendApi = createEvpProxyApi(intake, responseCompression); if (backendApi == null) { - log.warn( - "Cannot create backend API client since agentless mode is disabled, " - + "and agent does not support EVP proxy"); + log.warn("Cannot create backend API client since agentless mode is disabled, " + + "and agent does not support EVP proxy"); } return backendApi; } diff --git a/communication/src/main/java/datadog/communication/EvpProxyApi.java b/communication/src/main/java/datadog/communication/EvpProxyApi.java index 8bb768b7e4e..1f3f2779878 100644 --- a/communication/src/main/java/datadog/communication/EvpProxyApi.java +++ b/communication/src/main/java/datadog/communication/EvpProxyApi.java @@ -59,12 +59,11 @@ public T post( throws IOException { final HttpUrl url = evpProxyUrl.resolve(uri); - Request.Builder requestBuilder = - new Request.Builder() - .url(url) - .addHeader(EvpProxy.SUBDOMAIN_HEADER, subdomain) - .addHeader(X_DATADOG_TRACE_ID_HEADER, traceId) - .addHeader(X_DATADOG_PARENT_ID_HEADER, traceId); + Request.Builder requestBuilder = new Request.Builder() + .url(url) + .addHeader(EvpProxy.SUBDOMAIN_HEADER, subdomain) + .addHeader(X_DATADOG_TRACE_ID_HEADER, traceId) + .addHeader(X_DATADOG_PARENT_ID_HEADER, traceId); if (requestListener != null) { requestBuilder.tag(OkHttpUtils.CustomListener.class, requestListener); diff --git a/communication/src/main/java/datadog/communication/IntakeApi.java b/communication/src/main/java/datadog/communication/IntakeApi.java index 1a6f3f91bc7..f36bf347b9d 100644 --- a/communication/src/main/java/datadog/communication/IntakeApi.java +++ b/communication/src/main/java/datadog/communication/IntakeApi.java @@ -58,13 +58,12 @@ public T post( boolean requestCompression) throws IOException { HttpUrl url = hostUrl.resolve(uri); - Request.Builder requestBuilder = - new Request.Builder() - .url(url) - .post(requestBody) - .addHeader(DD_API_KEY_HEADER, apiKey) - .addHeader(X_DATADOG_TRACE_ID_HEADER, traceId) - .addHeader(X_DATADOG_PARENT_ID_HEADER, traceId); + Request.Builder requestBuilder = new Request.Builder() + .url(url) + .post(requestBody) + .addHeader(DD_API_KEY_HEADER, apiKey) + .addHeader(X_DATADOG_TRACE_ID_HEADER, traceId) + .addHeader(X_DATADOG_PARENT_ID_HEADER, traceId); if (requestListener != null) { requestBuilder.tag(OkHttpUtils.CustomListener.class, requestListener); @@ -94,15 +93,14 @@ public T post( return responseParser.apply(responseBodyStream); } else { - throw new IOException( - "Request to " - + uri - + " returned error response " - + response.code() - + ": " - + response.message() - + "; " - + (response.body() != null ? response.body().string() : "")); + throw new IOException("Request to " + + uri + + " returned error response " + + response.code() + + ": " + + response.message() + + "; " + + (response.body() != null ? response.body().string() : "")); } } } diff --git a/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java b/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java index 16be2e84b98..a5a73cec423 100644 --- a/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java +++ b/communication/src/main/java/datadog/communication/ddagent/DDAgentFeaturesDiscovery.java @@ -37,15 +37,13 @@ public class DDAgentFeaturesDiscovery implements DroppingPolicy { private static final Logger log = LoggerFactory.getLogger(DDAgentFeaturesDiscovery.class); - private static final JsonAdapter> RESPONSE_ADAPTER = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + private static final JsonAdapter> RESPONSE_ADAPTER = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); // Currently all the endpoints that we probe expect a msgpack body of an array of arrays, v3/v4 // arbitrary size and v5 two elements, so let's give them a two element array of empty arrays - private static final byte[] PROBE_MESSAGE = { - (byte) FIXARRAY | 2, (byte) FIXARRAY, (byte) FIXARRAY + private static final byte[] PROBE_MESSAGE = {(byte) FIXARRAY | 2, (byte) FIXARRAY, (byte) FIXARRAY }; public static final String V03_ENDPOINT = "v0.3/traces"; @@ -203,13 +201,11 @@ private void doDiscovery(State newState) { private String probeTracesEndpoint(State newState, List endpoints) { for (String candidate : endpoints) { - try (Response response = - client - .newCall( - prepareRequest(agentBaseUrl.resolve(candidate), emptyMap()) - .put(msgpackRequestBodyOf(singletonList(ByteBuffer.wrap(PROBE_MESSAGE)))) - .build()) - .execute()) { + try (Response response = client + .newCall(prepareRequest(agentBaseUrl.resolve(candidate), emptyMap()) + .put(msgpackRequestBodyOf(singletonList(ByteBuffer.wrap(PROBE_MESSAGE)))) + .build()) + .execute()) { if (response.code() != 404) { newState.state = response.header(DATADOG_AGENT_STATE); return candidate; @@ -302,21 +298,17 @@ private boolean processInfoResponse(State newState, String response) { if (metricsEnabled) { Object canDrop = map.get("client_drop_p0s"); - newState.supportsDropping = - null != canDrop - && ("true".equalsIgnoreCase(String.valueOf(canDrop)) - || Boolean.TRUE.equals(canDrop)); + newState.supportsDropping = null != canDrop + && ("true".equalsIgnoreCase(String.valueOf(canDrop)) || Boolean.TRUE.equals(canDrop)); - newState.supportsClientSideStats = - newState.supportsDropping - && (ignoreAgentVersionForStats - || !AgentVersion.isVersionBelow(newState.version, 7, 65, 0)); + newState.supportsClientSideStats = newState.supportsDropping + && (ignoreAgentVersionForStats + || !AgentVersion.isVersionBelow(newState.version, 7, 65, 0)); Object peer_tags = map.get("peer_tags"); - newState.peerTags = - peer_tags instanceof List - ? unmodifiableSet(new HashSet<>((List) peer_tags)) - : emptySet(); + newState.peerTags = peer_tags instanceof List + ? unmodifiableSet(new HashSet<>((List) peer_tags)) + : emptySet(); } Object opm = map.get("org_prop_marker"); newState.orgPropagationMarker = (opm instanceof String) ? (String) opm : null; diff --git a/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java b/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java index 8eea13de224..3d70e596aa6 100644 --- a/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java +++ b/communication/src/main/java/datadog/communication/ddagent/ExternalAgentLauncher.java @@ -30,9 +30,8 @@ public ExternalAgentLauncher(Config config) { traceProcessBuilder.redirectError(DISCARD); traceProcessBuilder.command().addAll(config.getTraceAgentArgs()); - traceProcessSupervisor = - new ProcessSupervisor( - "trace-agent", traceProcessBuilder, healthCheck(config.getAgentNamedPipe())); + traceProcessSupervisor = new ProcessSupervisor( + "trace-agent", traceProcessBuilder, healthCheck(config.getAgentNamedPipe())); } else { log.warn("Trace agent path not set. Will not start trace agent process"); } @@ -43,9 +42,8 @@ public ExternalAgentLauncher(Config config) { dogStatsDProcessBuilder.redirectError(DISCARD); dogStatsDProcessBuilder.command().addAll(config.getDogStatsDArgs()); - dogStatsDProcessSupervisor = - new ProcessSupervisor( - "dogstatsd", dogStatsDProcessBuilder, healthCheck(config.getDogStatsDNamedPipe())); + dogStatsDProcessSupervisor = new ProcessSupervisor( + "dogstatsd", dogStatsDProcessBuilder, healthCheck(config.getDogStatsDNamedPipe())); } else { log.warn("DogStatsD path not set. Will not start DogStatsD process"); } diff --git a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java index 73e9fbc037c..9cad40e4957 100644 --- a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java +++ b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java @@ -72,10 +72,9 @@ public void createRemaining(Config config) { monitoring = Monitoring.DISABLED; } - httpClientTimeout = - config.isCiVisibilityEnabled() - ? config.getCiVisibilityBackendApiTimeoutMillis() - : TimeUnit.SECONDS.toMillis(config.getAgentTimeout()); + httpClientTimeout = config.isCiVisibilityEnabled() + ? config.getCiVisibilityBackendApiTimeoutMillis() + : TimeUnit.SECONDS.toMillis(config.getAgentTimeout()); forceClearTextHttpForIntakeClient = config.isForceClearTextHttpForIntakeClient(); @@ -89,9 +88,8 @@ public void createRemaining(Config config) { if (agentHttpClient == null) { String unixDomainSocket = SocketUtils.discoverApmSocket(config); String namedPipe = config.getAgentNamedPipe(); - agentHttpClient = - OkHttpUtils.buildHttpClient( - OkHttpUtils.isPlainHttp(agentUrl), unixDomainSocket, namedPipe, httpClientTimeout); + agentHttpClient = OkHttpUtils.buildHttpClient( + OkHttpUtils.isPlainHttp(agentUrl), unixDomainSocket, namedPipe, httpClientTimeout); String testSessionToken = config.getTestAgentSessionToken(); if (testSessionToken != null) { agentHttpClient = injectTestAgentSessionHeaderInterceptor(testSessionToken); @@ -102,14 +100,11 @@ public void createRemaining(Config config) { private OkHttpClient injectTestAgentSessionHeaderInterceptor(String testSessionToken) { return agentHttpClient .newBuilder() - .addInterceptor( - chain -> - chain.proceed( - chain - .request() - .newBuilder() - .header(X_DATADOG_TEST_SESSION_TOKEN, testSessionToken) - .build())) + .addInterceptor(chain -> chain.proceed(chain + .request() + .newBuilder() + .header(X_DATADOG_TEST_SESSION_TOKEN, testSessionToken) + .build())) .build(); } @@ -193,14 +188,13 @@ public DDAgentFeaturesDiscovery featuresDiscovery(Config config) { ret = NoopFeaturesDiscovery.INSTANCE; } else { createRemaining(config); - ret = - new DDAgentFeaturesDiscovery( - agentHttpClient, - monitoring, - agentUrl, - config.getProtocolVersion(), - config.isTracerMetricsEnabled(), - config.isTracerMetricsIgnoreAgentVersion()); + ret = new DDAgentFeaturesDiscovery( + agentHttpClient, + monitoring, + agentUrl, + config.getProtocolVersion(), + config.isTracerMetricsEnabled(), + config.isTracerMetricsIgnoreAgentVersion()); if (paused) { // defer remote discovery until remote I/O is allowed @@ -269,9 +263,8 @@ public OkHttpClient getIntakeHttpClient() { synchronized (this) { if (this.intakeHttpClient == null) { - this.intakeHttpClient = - OkHttpUtils.buildHttpClient( - forceClearTextHttpForIntakeClient, null, null, httpClientTimeout); + this.intakeHttpClient = OkHttpUtils.buildHttpClient( + forceClearTextHttpForIntakeClient, null, null, httpClientTimeout); } return this.intakeHttpClient; } diff --git a/communication/src/main/java/datadog/communication/ddagent/TracerVersion.java b/communication/src/main/java/datadog/communication/ddagent/TracerVersion.java index db45e70b548..491431cce0b 100644 --- a/communication/src/main/java/datadog/communication/ddagent/TracerVersion.java +++ b/communication/src/main/java/datadog/communication/ddagent/TracerVersion.java @@ -9,10 +9,8 @@ public class TracerVersion { private static String getTracerVersion() { ClassLoader cl = ClassLoader.getSystemClassLoader(); - try (final BufferedReader reader = - new BufferedReader( - new InputStreamReader( - cl.getResourceAsStream("dd-java-agent.version"), StandardCharsets.ISO_8859_1))) { + try (final BufferedReader reader = new BufferedReader(new InputStreamReader( + cl.getResourceAsStream("dd-java-agent.version"), StandardCharsets.ISO_8859_1))) { String line = reader.readLine(); return line != null ? line : "0.0.0"; } catch (Exception e) { diff --git a/communication/src/main/java/datadog/communication/http/HttpRetryPolicy.java b/communication/src/main/java/datadog/communication/http/HttpRetryPolicy.java index a645f53e29a..44088567bd3 100644 --- a/communication/src/main/java/datadog/communication/http/HttpRetryPolicy.java +++ b/communication/src/main/java/datadog/communication/http/HttpRetryPolicy.java @@ -105,9 +105,8 @@ public boolean shouldRetry(@Nullable okhttp3.Response response) { } retriesLeft = 0; - delay = - TimeUnit.SECONDS.toMillis(waitTimeSeconds) - + ThreadLocalRandom.current().nextInt(RATE_LIMIT_DELAY_RANDOM_COMPONENT_MAX_MILLIS); + delay = TimeUnit.SECONDS.toMillis(waitTimeSeconds) + + ThreadLocalRandom.current().nextInt(RATE_LIMIT_DELAY_RANDOM_COMPONENT_MAX_MILLIS); return true; } else if (responseCode >= 500 || responseCode == NO_RESPONSE_RECEIVED) { diff --git a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java index 44105ae772d..845caaab0aa 100644 --- a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java +++ b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java @@ -156,12 +156,11 @@ private static OkHttpClient buildHttpClient( final OkHttpClient.Builder builder = new OkHttpClient.Builder(); try { - builder.eventListenerFactory( - call -> { - Request request = call.request(); - CustomListener listener = request.tag(CustomListener.class); - return listener != null ? listener : EventListener.NONE; - }); + builder.eventListenerFactory(call -> { + Request request = call.request(); + CustomListener listener = request.tag(CustomListener.class); + return listener != null ? listener : EventListener.NONE; + }); } catch (NoSuchMethodError e) { // A workaround for OKHTTP instrumentation tests // where the version of OKHTTP conflicts with the one used in this module. @@ -178,9 +177,8 @@ private static OkHttpClient buildHttpClient( dispatcher != null ? dispatcher : new Dispatcher(RejectingExecutorService.INSTANCE)); if (unixDomainSocketPath != null) { - builder.socketFactory( - new UnixDomainSocketFactory( - new File(unixDomainSocketPath), useJdkUnixDomainSocket, agentConfiguredUsingDefault)); + builder.socketFactory(new UnixDomainSocketFactory( + new File(unixDomainSocketPath), useJdkUnixDomainSocket, agentConfiguredUsingDefault)); log.debug("Using UnixDomainSocket as http transport"); } else if (namedPipe != null) { builder.socketFactory(new NamedPipeSocketFactory(namedPipe)); @@ -213,17 +211,16 @@ private static OkHttpClient buildHttpClient( if (proxyHost != null) { builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort))); if (proxyUsername != null) { - builder.proxyAuthenticator( - (route, response) -> { - final String credential = - Credentials.basic(proxyUsername, proxyPassword == null ? "" : proxyPassword); - - return response - .request() - .newBuilder() - .header("Proxy-Authorization", credential) - .build(); - }); + builder.proxyAuthenticator((route, response) -> { + final String credential = + Credentials.basic(proxyUsername, proxyPassword == null ? "" : proxyPassword); + + return response + .request() + .newBuilder() + .header("Proxy-Authorization", credential) + .build(); + }); } } @@ -240,13 +237,12 @@ private static OkHttpClient buildHttpClient( public static Request.Builder prepareRequest(final HttpUrl url, Map headers) { - final Request.Builder builder = - new Request.Builder() - .url(url) - .addHeader(DATADOG_META_LANG, "java") - .addHeader(DATADOG_META_LANG_VERSION, JAVA_VERSION) - .addHeader(DATADOG_META_LANG_INTERPRETER, JAVA_VM_NAME) - .addHeader(DATADOG_META_LANG_INTERPRETER_VENDOR, JAVA_VM_VENDOR); + final Request.Builder builder = new Request.Builder() + .url(url) + .addHeader(DATADOG_META_LANG, "java") + .addHeader(DATADOG_META_LANG_VERSION, JAVA_VERSION) + .addHeader(DATADOG_META_LANG_INTERPRETER, JAVA_VM_NAME) + .addHeader(DATADOG_META_LANG_INTERPRETER_VENDOR, JAVA_VM_VENDOR); final String containerId = ContainerInfo.get().getContainerId(); final String entityId = ContainerInfo.getEntityId(); diff --git a/communication/src/main/java/datadog/communication/util/IOUtils.java b/communication/src/main/java/datadog/communication/util/IOUtils.java index 819e4bb3e18..12ed33ea270 100644 --- a/communication/src/main/java/datadog/communication/util/IOUtils.java +++ b/communication/src/main/java/datadog/communication/util/IOUtils.java @@ -63,22 +63,19 @@ public static void readFully(InputStream input, OutputStream output) throws IOEx } public static void copyFolder(Path src, Path dest) throws IOException { - Files.walkFileTree( - src, - new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - Files.createDirectories(dest.resolve(src.relativize(dir))); - return FileVisitResult.CONTINUE; - } + Files.walkFileTree(src, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + Files.createDirectories(dest.resolve(src.relativize(dir))); + return FileVisitResult.CONTINUE; + } - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - Files.copy(file, dest.resolve(src.relativize(file))); - return FileVisitResult.CONTINUE; - } - }); + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.copy(file, dest.resolve(src.relativize(file))); + return FileVisitResult.CONTINUE; + } + }); } } diff --git a/communication/src/main/java/okhttp3/internal/PatchUtil.java b/communication/src/main/java/okhttp3/internal/PatchUtil.java index dde57821c31..622c6396372 100644 --- a/communication/src/main/java/okhttp3/internal/PatchUtil.java +++ b/communication/src/main/java/okhttp3/internal/PatchUtil.java @@ -78,13 +78,12 @@ public final class PatchUtil { /** GMT and UTC are equivalent for our purposes. */ public static final TimeZone UTC = TimeZone.getTimeZone("GMT"); - public static final Comparator NATURAL_ORDER = - new Comparator() { - @Override - public int compare(String a, String b) { - return a.compareTo(b); - } - }; + public static final Comparator NATURAL_ORDER = new Comparator() { + @Override + public int compare(String a, String b) { + return a.compareTo(b); + } + }; private static final Method addSuppressedExceptionMethod; @@ -403,10 +402,9 @@ public static String canonicalizeHost(String host) { // If the input contains a :, it’s an IPv6 address. if (host.contains(":")) { // If the input is encased in square braces "[...]", drop 'em. - InetAddress inetAddress = - host.startsWith("[") && host.endsWith("]") - ? decodeIpv6(host, 1, host.length() - 1) - : decodeIpv6(host, 0, host.length()); + InetAddress inetAddress = host.startsWith("[") && host.endsWith("]") + ? decodeIpv6(host, 1, host.length() - 1) + : decodeIpv6(host, 0, host.length()); if (inetAddress == null) return null; byte[] address = inetAddress.getAddress(); if (address.length == 16) return inet6AddressToAscii(address); diff --git a/communication/src/main/java/okhttp3/internal/platform/PatchPlatform.java b/communication/src/main/java/okhttp3/internal/platform/PatchPlatform.java index dc9f9c2d4b6..db5ace6c330 100644 --- a/communication/src/main/java/okhttp3/internal/platform/PatchPlatform.java +++ b/communication/src/main/java/okhttp3/internal/platform/PatchPlatform.java @@ -155,9 +155,8 @@ public Object getStackTraceForCloseable(String closer) { public void logCloseableLeak(String message, Object stackTrace) { if (stackTrace == null) { - message += - " To see where this was allocated, set the OkHttpClient logger level to FINE: " - + "Logger.getLogger(OkHttpClient.class.getName()).setLevel(Level.FINE);"; + message += " To see where this was allocated, set the OkHttpClient logger level to FINE: " + + "Logger.getLogger(OkHttpClient.class.getName()).setLevel(Level.FINE);"; } log(WARN, message, (Throwable) stackTrace); } @@ -180,11 +179,10 @@ public CertificateChainCleaner buildCertificateChainCleaner(SSLSocketFactory ssl X509TrustManager trustManager = trustManager(sslSocketFactory); if (trustManager == null) { - throw new IllegalStateException( - "Unable to extract the trust manager on " - + Platform.get() - + ", sslSocketFactory is " - + sslSocketFactory.getClass()); + throw new IllegalStateException("Unable to extract the trust manager on " + + Platform.get() + + ", sslSocketFactory is " + + sslSocketFactory.getClass()); } return buildCertificateChainCleaner(trustManager); diff --git a/communication/src/test/java/datadog/communication/BackendApiFactoryTest.java b/communication/src/test/java/datadog/communication/BackendApiFactoryTest.java index 726c34a7f73..a0b9979b6e3 100644 --- a/communication/src/test/java/datadog/communication/BackendApiFactoryTest.java +++ b/communication/src/test/java/datadog/communication/BackendApiFactoryTest.java @@ -43,9 +43,8 @@ void advertisedEvpProxyEndpointSupportsDisabledResponseCompression() throws Exce agent.start(); try { final FakeFeaturesDiscovery discovery = new FakeFeaturesDiscovery(V4_EVP_PROXY_ENDPOINT); - final BackendApiFactory factory = - new BackendApiFactory( - Config.get(), sharedCommunicationObjects(discovery, agent.url("/"))); + final BackendApiFactory factory = new BackendApiFactory( + Config.get(), sharedCommunicationObjects(discovery, agent.url("/"))); final BackendApi api = factory.createBackendApi(Intake.EVENT_PLATFORM, false); assertNotNull(api); @@ -71,23 +70,20 @@ void explicitNoRetryProxyPolicyDoesNotReplayAmbiguousFailure() throws Exception agent.start(); try { final FakeFeaturesDiscovery discovery = new FakeFeaturesDiscovery(V4_EVP_PROXY_ENDPOINT); - final BackendApiFactory factory = - new BackendApiFactory( - Config.get(), sharedCommunicationObjects(discovery, agent.url("/"))); - final BackendApi api = - factory.createEvpProxyApi( - Intake.EVENT_PLATFORM, false, HttpRetryPolicy.Factory.NEVER_RETRY); + final BackendApiFactory factory = new BackendApiFactory( + Config.get(), sharedCommunicationObjects(discovery, agent.url("/"))); + final BackendApi api = factory.createEvpProxyApi( + Intake.EVENT_PLATFORM, false, HttpRetryPolicy.Factory.NEVER_RETRY); assertNotNull(api); assertThrows( HttpResponseException.class, - () -> - api.post( - "flagevaluation", - RequestBody.create(JSON, "{}".getBytes(StandardCharsets.UTF_8)), - stream -> null, - null, - false)); + () -> api.post( + "flagevaluation", + RequestBody.create(JSON, "{}".getBytes(StandardCharsets.UTF_8)), + stream -> null, + null, + false)); assertEquals(1, agent.getRequestCount()); } finally { diff --git a/communication/src/test/java/datadog/communication/EvpProxyApiTest.java b/communication/src/test/java/datadog/communication/EvpProxyApiTest.java index 14c6962bf8e..b532fc853ad 100644 --- a/communication/src/test/java/datadog/communication/EvpProxyApiTest.java +++ b/communication/src/test/java/datadog/communication/EvpProxyApiTest.java @@ -37,25 +37,22 @@ void tearDown() throws IOException { @Test void reportsHttpStatusForRejectedRequest() throws Exception { server.enqueue(new MockResponse().setResponseCode(404).setBody("not found")); - final EvpProxyApi api = - new EvpProxyApi( - "123", - server.url("/evp_proxy/v4/"), - "event-platform-intake", - HttpRetryPolicy.Factory.NEVER_RETRY, - client, - false); - - final HttpResponseException exception = - assertThrows( - HttpResponseException.class, - () -> - api.post( - "exposures", - RequestBody.create(MediaType.parse("application/json"), "{}"), - stream -> null, - null, - false)); + final EvpProxyApi api = new EvpProxyApi( + "123", + server.url("/evp_proxy/v4/"), + "event-platform-intake", + HttpRetryPolicy.Factory.NEVER_RETRY, + client, + false); + + final HttpResponseException exception = assertThrows( + HttpResponseException.class, + () -> api.post( + "exposures", + RequestBody.create(MediaType.parse("application/json"), "{}"), + stream -> null, + null, + false)); assertEquals(404, exception.getStatusCode()); final RecordedRequest request = server.takeRequest(); diff --git a/communication/src/test/java/datadog/communication/IntakeApiTest.java b/communication/src/test/java/datadog/communication/IntakeApiTest.java index 326cf21ca84..0b1250472c7 100644 --- a/communication/src/test/java/datadog/communication/IntakeApiTest.java +++ b/communication/src/test/java/datadog/communication/IntakeApiTest.java @@ -47,14 +47,13 @@ void requestsIdentityResponseEncodingWhenCompressionIsDisabled() throws Exceptio private String postAndReadAcceptEncoding(final boolean responseCompression) throws Exception { server.enqueue(new MockResponse().setResponseCode(200).setBody("{}")); - final IntakeApi api = - new IntakeApi( - server.url("/api/v2/"), - "api-key", - "123", - HttpRetryPolicy.Factory.NEVER_RETRY, - client, - responseCompression); + final IntakeApi api = new IntakeApi( + server.url("/api/v2/"), + "api-key", + "123", + HttpRetryPolicy.Factory.NEVER_RETRY, + client, + responseCompression); api.post("flagevaluation", RequestBody.create(JSON, "{}"), responseBody -> null, null, false); diff --git a/communication/src/test/java/datadog/communication/http/OkHttpUtilsRetryTest.java b/communication/src/test/java/datadog/communication/http/OkHttpUtilsRetryTest.java index 45f84a4810a..9d31e7c7949 100644 --- a/communication/src/test/java/datadog/communication/http/OkHttpUtilsRetryTest.java +++ b/communication/src/test/java/datadog/communication/http/OkHttpUtilsRetryTest.java @@ -25,21 +25,18 @@ void retriesResponseMappingFailureThroughCallFactory() throws Exception { server.start(); try { - final Request request = new Request.Builder().url(server.url("/configuration")).build(); + final Request request = + new Request.Builder().url(server.url("/configuration")).build(); - final String body = - sendWithRetries( - (Call.Factory) client, - new HttpRetryPolicy.Factory(1, 0, 1), - request, - response -> { - try (ResponseBody responseBody = response.body()) { - if (mappingAttempts.getAndIncrement() == 0) { - throw new ConnectException("response body could not be mapped"); - } - return responseBody.string(); - } - }); + final String body = sendWithRetries( + (Call.Factory) client, new HttpRetryPolicy.Factory(1, 0, 1), request, response -> { + try (ResponseBody responseBody = response.body()) { + if (mappingAttempts.getAndIncrement() == 0) { + throw new ConnectException("response body could not be mapped"); + } + return responseBody.string(); + } + }); assertEquals("second", body); assertEquals(2, mappingAttempts.get()); diff --git a/communication/src/test/java/datadog/communication/serialization/GenerationalUtf8CacheTest.java b/communication/src/test/java/datadog/communication/serialization/GenerationalUtf8CacheTest.java index f7f9ff502dc..d564ec7849a 100644 --- a/communication/src/test/java/datadog/communication/serialization/GenerationalUtf8CacheTest.java +++ b/communication/src/test/java/datadog/communication/serialization/GenerationalUtf8CacheTest.java @@ -49,10 +49,9 @@ public void capacity_twoArg() { @Test public void maxCapacity() { - GenerationalUtf8Cache cache = - new GenerationalUtf8Cache( - GenerationalUtf8Cache.MAX_EDEN_CAPACITY + 1, - GenerationalUtf8Cache.MAX_TENURED_CAPACITY + 1); + GenerationalUtf8Cache cache = new GenerationalUtf8Cache( + GenerationalUtf8Cache.MAX_EDEN_CAPACITY + 1, + GenerationalUtf8Cache.MAX_TENURED_CAPACITY + 1); assertEquals(GenerationalUtf8Cache.MAX_EDEN_CAPACITY, cache.edenCapacity()); assertEquals(GenerationalUtf8Cache.MAX_TENURED_CAPACITY, cache.tenuredCapacity()); @@ -60,11 +59,8 @@ public void maxCapacity() { @Test public void maxCapacity_combined() { - GenerationalUtf8Cache cache = - new GenerationalUtf8Cache( - GenerationalUtf8Cache.MAX_EDEN_CAPACITY - + GenerationalUtf8Cache.MAX_TENURED_CAPACITY - + 2); + GenerationalUtf8Cache cache = new GenerationalUtf8Cache( + GenerationalUtf8Cache.MAX_EDEN_CAPACITY + GenerationalUtf8Cache.MAX_TENURED_CAPACITY + 2); assertEquals(GenerationalUtf8Cache.MAX_EDEN_CAPACITY, cache.edenCapacity()); assertEquals(GenerationalUtf8Cache.MAX_TENURED_CAPACITY, cache.tenuredCapacity()); @@ -202,48 +198,43 @@ public void concurrentAccess_neverThrowsOrReturnsWrongBytes() throws Interrupted Thread[] readers = new Thread[threadCount]; for (int t = 0; t < threadCount; ++t) { - readers[t] = - new Thread( - () -> { - try { - start.await(); - ThreadLocalRandom random = ThreadLocalRandom.current(); - for (int i = 0; i < iterationsPerThread && failure.get() == null; ++i) { - String value = values[random.nextInt(values.length)]; - byte[] result = cache.getUtf8(value); - if (!Arrays.equals(value.getBytes(StandardCharsets.UTF_8), result)) { - failure.compareAndSet( - null, - new AssertionError( - "getUtf8(\"" - + value - + "\") returned bytes for \"" - + new String(result, StandardCharsets.UTF_8) - + "\"")); - return; - } - } - } catch (Throwable e) { - failure.compareAndSet(null, e); - } finally { - readersRunning.decrementAndGet(); - } - }); + readers[t] = new Thread(() -> { + try { + start.await(); + ThreadLocalRandom random = ThreadLocalRandom.current(); + for (int i = 0; i < iterationsPerThread && failure.get() == null; ++i) { + String value = values[random.nextInt(values.length)]; + byte[] result = cache.getUtf8(value); + if (!Arrays.equals(value.getBytes(StandardCharsets.UTF_8), result)) { + failure.compareAndSet( + null, + new AssertionError("getUtf8(\"" + + value + + "\") returned bytes for \"" + + new String(result, StandardCharsets.UTF_8) + + "\"")); + return; + } + } + } catch (Throwable e) { + failure.compareAndSet(null, e); + } finally { + readersRunning.decrementAndGet(); + } + }); } // Recalibrate in a tight loop for the duration, nulling decayed slots concurrently with reads. - Thread recalibrator = - new Thread( - () -> { - try { - start.await(); - while (readersRunning.get() > 0 && failure.get() == null) { - cache.recalibrate(); - } - } catch (Throwable e) { - failure.compareAndSet(null, e); - } - }); + Thread recalibrator = new Thread(() -> { + try { + start.await(); + while (readersRunning.get() > 0 && failure.get() == null) { + cache.recalibrate(); + } + } catch (Throwable e) { + failure.compareAndSet(null, e); + } + }); for (Thread reader : readers) { reader.start(); diff --git a/communication/src/test/java/datadog/communication/serialization/IntPackingTest.java b/communication/src/test/java/datadog/communication/serialization/IntPackingTest.java index ef5f1c8b13e..f139ac37123 100644 --- a/communication/src/test/java/datadog/communication/serialization/IntPackingTest.java +++ b/communication/src/test/java/datadog/communication/serialization/IntPackingTest.java @@ -97,21 +97,18 @@ private static long[] random(int size) { public void packLongs(long[] input) { ByteBuffer buffer = ByteBuffer.allocate(input.length * 9 + 10); MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - input.length * 9 + 10, - (messageCount, buffy) -> { - try { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - assertEquals(1, messageCount); - assertEquals(input.length, unpacker.unpackArrayHeader()); - for (long i : input) { - assertEquals(i, unpacker.unpackLong()); - } - } catch (IOException e) { - Assertions.fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(input.length * 9 + 10, (messageCount, buffy) -> { + try { + MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); + assertEquals(1, messageCount); + assertEquals(input.length, unpacker.unpackArrayHeader()); + for (long i : input) { + assertEquals(i, unpacker.unpackLong()); + } + } catch (IOException e) { + Assertions.fail(e.getMessage()); + } + })); messageFormatter.format(input, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -124,21 +121,18 @@ public void packInts(long[] input) { asInts[i] = (int) input[i]; } MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - input.length * 5 + 10, - (messageCount, buffy) -> { - try { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - assertEquals(1, messageCount); - assertEquals(asInts.length, unpacker.unpackArrayHeader()); - for (int i : asInts) { - assertEquals(i, unpacker.unpackInt()); - } - } catch (IOException e) { - Assertions.fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(input.length * 5 + 10, (messageCount, buffy) -> { + try { + MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); + assertEquals(1, messageCount); + assertEquals(asInts.length, unpacker.unpackArrayHeader()); + for (int i : asInts) { + assertEquals(i, unpacker.unpackInt()); + } + } catch (IOException e) { + Assertions.fail(e.getMessage()); + } + })); messageFormatter.format(asInts, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); diff --git a/communication/src/test/java/datadog/communication/serialization/SmokeTest.java b/communication/src/test/java/datadog/communication/serialization/SmokeTest.java index c646d0b835d..37adcd37936 100644 --- a/communication/src/test/java/datadog/communication/serialization/SmokeTest.java +++ b/communication/src/test/java/datadog/communication/serialization/SmokeTest.java @@ -45,77 +45,70 @@ static Foo create() { } } - Map constantPool = - new HashMap() { - { - put("foo", "foo".getBytes(StandardCharsets.UTF_8)); - put("id1", "id1".getBytes(StandardCharsets.UTF_8)); - } - }; + Map constantPool = new HashMap() { + { + put("foo", "foo".getBytes(StandardCharsets.UTF_8)); + put("id1", "id1".getBytes(StandardCharsets.UTF_8)); + } + }; EncodingCache encodingCache = null; @Test public void testWriteMessage() { final Foo message = Foo.create(); - MsgPackWriter packer = - new MsgPackWriter( - new FlushingBuffer( - 1024, - (messageCount, buffy) -> { - assertEquals(1, messageCount); - try { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - assertEquals("id1", unpacker.unpackString()); - assertEquals(message.id1, unpacker.unpackLong()); - assertEquals("id2", unpacker.unpackString()); - assertEquals(message.id2, unpacker.unpackLong()); - assertEquals("name", unpacker.unpackString()); - assertEquals(message.name, unpacker.unpackString()); - assertEquals("values", unpacker.unpackString()); - int length = unpacker.unpackArrayHeader(); - assertEquals(message.values.length, length); - for (int i : message.values) { - assertEquals(i, unpacker.unpackInt()); - } - assertEquals("tags", unpacker.unpackString()); - int mapHeader = unpacker.unpackMapHeader(); - assertEquals(message.tags.size(), mapHeader); - for (int i = 0; i < mapHeader; ++i) { - String key = unpacker.unpackString(); - Object expected = message.tags.get(key); - assertNotNull(expected); - if (expected instanceof Float) { - assertEquals((Float) expected, unpacker.unpackFloat(), 0.0001); - } else if (expected instanceof Double) { - assertEquals((Double) expected, unpacker.unpackDouble(), 0.0001); - } else if (expected instanceof List) { - List l = (List) expected; - assertEquals(l.size(), unpacker.unpackArrayHeader()); - for (String element : l) { - assertEquals(element, unpacker.unpackString()); - } - } else if (expected instanceof String) { - assertEquals(expected, unpacker.unpackString()); - } - } - } catch (IOException e) { - Assertions.fail(e.getMessage()); - } - })); - packer.format( - message, - (data, p) -> { - p.writeString("id1", encodingCache); - p.writeLong(data.id1); - p.writeString("id2", encodingCache); - p.writeLong(data.id2); - p.writeString("name", encodingCache); - p.writeString(data.name, encodingCache); - p.writeString("values", encodingCache); - p.writeObject(data.values, encodingCache); - p.writeString("tags", encodingCache); - p.writeMap(data.tags, encodingCache); - }); + MsgPackWriter packer = new MsgPackWriter(new FlushingBuffer(1024, (messageCount, buffy) -> { + assertEquals(1, messageCount); + try { + MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); + assertEquals("id1", unpacker.unpackString()); + assertEquals(message.id1, unpacker.unpackLong()); + assertEquals("id2", unpacker.unpackString()); + assertEquals(message.id2, unpacker.unpackLong()); + assertEquals("name", unpacker.unpackString()); + assertEquals(message.name, unpacker.unpackString()); + assertEquals("values", unpacker.unpackString()); + int length = unpacker.unpackArrayHeader(); + assertEquals(message.values.length, length); + for (int i : message.values) { + assertEquals(i, unpacker.unpackInt()); + } + assertEquals("tags", unpacker.unpackString()); + int mapHeader = unpacker.unpackMapHeader(); + assertEquals(message.tags.size(), mapHeader); + for (int i = 0; i < mapHeader; ++i) { + String key = unpacker.unpackString(); + Object expected = message.tags.get(key); + assertNotNull(expected); + if (expected instanceof Float) { + assertEquals((Float) expected, unpacker.unpackFloat(), 0.0001); + } else if (expected instanceof Double) { + assertEquals((Double) expected, unpacker.unpackDouble(), 0.0001); + } else if (expected instanceof List) { + List l = (List) expected; + assertEquals(l.size(), unpacker.unpackArrayHeader()); + for (String element : l) { + assertEquals(element, unpacker.unpackString()); + } + } else if (expected instanceof String) { + assertEquals(expected, unpacker.unpackString()); + } + } + } catch (IOException e) { + Assertions.fail(e.getMessage()); + } + })); + packer.format(message, (data, p) -> { + p.writeString("id1", encodingCache); + p.writeLong(data.id1); + p.writeString("id2", encodingCache); + p.writeLong(data.id2); + p.writeString("name", encodingCache); + p.writeString(data.name, encodingCache); + p.writeString("values", encodingCache); + p.writeObject(data.values, encodingCache); + p.writeString("tags", encodingCache); + p.writeMap(data.tags, encodingCache); + }); packer.flush(); } } diff --git a/communication/src/test/java/datadog/communication/serialization/StringWritingTest.java b/communication/src/test/java/datadog/communication/serialization/StringWritingTest.java index 17732d2b9a4..ba80abe96c9 100644 --- a/communication/src/test/java/datadog/communication/serialization/StringWritingTest.java +++ b/communication/src/test/java/datadog/communication/serialization/StringWritingTest.java @@ -122,9 +122,8 @@ public static Object[][] maps() { @ParameterizedTest @MethodSource("maps") public void testSerialiseTextMapWithCache(List> maps) { - MsgPackWriter packer = - new MsgPackWriter( - new FlushingBuffer(TEN_KB, (messageCount, buffer) -> testBufferContents(buffer, maps))); + MsgPackWriter packer = new MsgPackWriter( + new FlushingBuffer(TEN_KB, (messageCount, buffer) -> testBufferContents(buffer, maps))); for (Map map : maps) { packer.format(map, (m, p) -> p.writeMap(m, CACHE)); } @@ -134,9 +133,8 @@ public void testSerialiseTextMapWithCache(List> maps) { @ParameterizedTest @MethodSource("maps") public void testSerialiseTextMapWithoutCache(List> maps) { - MsgPackWriter packer = - new MsgPackWriter( - new FlushingBuffer(TEN_KB, (messageCount, buffer) -> testBufferContents(buffer, maps))); + MsgPackWriter packer = new MsgPackWriter( + new FlushingBuffer(TEN_KB, (messageCount, buffer) -> testBufferContents(buffer, maps))); for (Map map : maps) { packer.format(map, (m, p) -> p.writeMap(m, NO_CACHE)); } diff --git a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java index fca302dd3d1..e5587466dae 100644 --- a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java +++ b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java @@ -40,24 +40,21 @@ public class MsgPackWriterTest { @Test public void testOverflow() { MessageFormatter packer = new MsgPackWriter(newBuffer(25, (messageCount, buffer) -> {})); - assertFalse( - packer.format( - new HashMap() { - { - put("foo", "abcdefghijklmnopqrstuvwxyz"); - } - }, - (Mapper>) (data, writable) -> writable.writeObject(data, null))); + assertFalse(packer.format( + new HashMap() { + { + put("foo", "abcdefghijklmnopqrstuvwxyz"); + } + }, + (Mapper>) (data, writable) -> writable.writeObject(data, null))); } @Test public void testInsertAfterOverflow() { Mapper mapper = (data, writable) -> writable.writeString(data, null); - MessageFormatter packer = - new MsgPackWriter( - newBuffer( - 2 + 25, // enough space for a 25 element string and its 2 byte header - (messageCount, buffer) -> {})); + MessageFormatter packer = new MsgPackWriter(newBuffer( + 2 + 25, // enough space for a 25 element string and its 2 byte header + (messageCount, buffer) -> {})); assertTrue(packer.format("abcdefghijklmnopqrstuvwxy", mapper), "data fits in buffer"); assertFalse( packer.format("abcdefghijklmnopqrstuvwxyz", mapper), "data doesn't fit in finite buffer"); @@ -69,23 +66,21 @@ public void testInsertAfterOverflow() { public void testFlushOfOverflow() { final List flushed = new ArrayList<>(); Mapper mapper = (data, writable) -> writable.writeString(data, null); - MessageFormatter packer = - new MsgPackWriter( - newBuffer( - 2 + 25, // enough space for a 25 element string and its 2 byte header - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - for (int i = 0; i < messageCount; ++i) { - try { - flushed.add(unpacker.unpackString()); - } catch (Exception error) { - fail(error.getMessage()); - } - } - } catch (IOException error) { - fail(error.getMessage()); - } - })); + MessageFormatter packer = new MsgPackWriter(newBuffer( + 2 + 25, // enough space for a 25 element string and its 2 byte header + (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + for (int i = 0; i < messageCount; ++i) { + try { + flushed.add(unpacker.unpackString()); + } catch (Exception error) { + fail(error.getMessage()); + } + } + } catch (IOException error) { + fail(error.getMessage()); + } + })); assertTrue(packer.format("abcdefghijklm", mapper), "data fits in buffer"); assertTrue( packer.format("nopqrstuvwxyz", mapper), "data fits in empty buffer but triggers flush"); @@ -99,12 +94,11 @@ public void testFlushOfOverflow() { @Test public void testRecycle() { final AtomicInteger i = new AtomicInteger(); - Map map = - new HashMap() { - { - put("foo", "abcd"); - } - }; + Map map = new HashMap() { + { + put("foo", "abcd"); + } + }; MsgPackWriter packer = new MsgPackWriter(newBuffer(25, (messageCount, buffer) -> i.getAndIncrement())); Mapper mapper = (data, writable) -> writable.writeObject(data, null); @@ -118,19 +112,15 @@ public void testRecycle() { @Test public void testWriteBinary() { final byte[] data = new byte[] {1, 2, 3, 4}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - int length = unpacker.unpackBinaryHeader(); - assertEquals(4, length); - assertArrayEquals(data, unpacker.readPayload(length)); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + int length = unpacker.unpackBinaryHeader(); + assertEquals(4, length); + assertArrayEquals(data, unpacker.readPayload(length)); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format( data, (data1, writable) -> writable.writeBinary(data1, 0, data1.length)); messageFormatter.flush(); @@ -138,18 +128,14 @@ public void testWriteBinary() { @Test public void testWriteBinaryNoArgVariant() { - MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - 10, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(6, unpacker.unpackBinaryHeader()); - assertArrayEquals(unpacker.readPayload(6), "foobar".getBytes(UTF_8)); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MsgPackWriter writer = new MsgPackWriter(newBuffer(10, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(6, unpacker.unpackBinaryHeader()); + assertArrayEquals(unpacker.readPayload(6), "foobar".getBytes(UTF_8)); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.writeBinary("foobar".getBytes(UTF_8)); } @@ -158,19 +144,15 @@ public void testWriteBinaryLongPair() { final long hi = 0x1122334455667788L; final long lo = 0x99AABBCCDDEEFF00L; final byte[] data = ByteBuffer.allocate(16).putLong(hi).putLong(lo).array(); - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - int length = unpacker.unpackBinaryHeader(); - assertEquals(16, length); - assertArrayEquals(data, unpacker.readPayload(length)); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + int length = unpacker.unpackBinaryHeader(); + assertEquals(16, length); + assertArrayEquals(data, unpacker.readPayload(length)); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (ignored, writable) -> writable.writeBinary(hi, lo)); messageFormatter.flush(); } @@ -178,19 +160,15 @@ public void testWriteBinaryLongPair() { @Test public void testWriteBinaryAsObject() { final byte[] data = new byte[] {1, 2, 3, 4}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - int length = unpacker.unpackBinaryHeader(); - assertEquals(4, length); - assertArrayEquals(data, unpacker.readPayload(length)); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + int length = unpacker.unpackBinaryHeader(); + assertEquals(4, length); + assertArrayEquals(data, unpacker.readPayload(length)); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (ba, writable) -> writable.writeObject(ba, null)); messageFormatter.flush(); } @@ -198,19 +176,15 @@ public void testWriteBinaryAsObject() { @Test public void testWriteByteBuffer() { final byte[] data = new byte[] {1, 2, 3, 4}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - int length = unpacker.unpackBinaryHeader(); - assertEquals(4, length); - assertArrayEquals(data, unpacker.readPayload(length)); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + int length = unpacker.unpackBinaryHeader(); + assertEquals(4, length); + assertArrayEquals(data, unpacker.readPayload(length)); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(ByteBuffer.wrap(data), (bb, writable) -> writable.writeBinary(bb)); messageFormatter.flush(); } @@ -218,19 +192,15 @@ public void testWriteByteBuffer() { @Test public void testWriteByteBufferAsObject() { final byte[] data = new byte[] {1, 2, 3, 4}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - int length = unpacker.unpackBinaryHeader(); - assertEquals(4, length); - assertArrayEquals(data, unpacker.readPayload(length)); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + int length = unpacker.unpackBinaryHeader(); + assertEquals(4, length); + assertArrayEquals(data, unpacker.readPayload(length)); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format( ByteBuffer.wrap(data), (bb, writable) -> writable.writeObject(bb, null)); messageFormatter.flush(); @@ -238,51 +208,39 @@ public void testWriteByteBufferAsObject() { @Test public void testWriteNull() { - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - unpacker.unpackNil(); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + unpacker.unpackNil(); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(null, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @Test public void testWriteBooleanAsObject() { - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertTrue(unpacker.unpackBoolean()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertTrue(unpacker.unpackBoolean()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(true, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @Test public void testWriteBoolean() { - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertTrue(unpacker.unpackBoolean()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertTrue(unpacker.unpackBoolean()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(true, (x, w) -> w.writeBoolean(x)); messageFormatter.flush(); } @@ -290,17 +248,13 @@ public void testWriteBoolean() { @Test public void testWriteGenericNumber() { final BigDecimal data = BigDecimal.valueOf(47.11); - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data.doubleValue(), unpacker.unpackDouble(), 0); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data.doubleValue(), unpacker.unpackDouble(), 0); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (Mapper) (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -308,17 +262,13 @@ public void testWriteGenericNumber() { @Test public void testWriteCharArray() { final String data = "xyz"; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data, unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data, unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data.toCharArray(), (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -326,17 +276,13 @@ public void testWriteCharArray() { @Test public void testWriteUTF8ByteString() { final UTF8BytesString utf8BytesString = UTF8BytesString.create("xyz"); - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals("xyz", unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals("xyz", unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(utf8BytesString, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -344,20 +290,16 @@ public void testWriteUTF8ByteString() { @Test public void testWriteBooleanArray() { final boolean[] data = new boolean[] {true, false, true, true}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 25, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(4, unpacker.unpackArrayHeader()); - for (boolean datum : data) { - assertEquals(datum, unpacker.unpackBoolean()); - } - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(25, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(4, unpacker.unpackArrayHeader()); + for (boolean datum : data) { + assertEquals(datum, unpacker.unpackBoolean()); + } + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -365,20 +307,16 @@ public void testWriteBooleanArray() { @Test public void testWriteFloatArray() { final float[] data = new float[] {0.1f, 0.2f, 0.3f, 0.4f}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(4, unpacker.unpackArrayHeader()); - for (float datum : data) { - assertEquals(datum, unpacker.unpackFloat(), 0.001); - } - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(4, unpacker.unpackArrayHeader()); + for (float datum : data) { + assertEquals(datum, unpacker.unpackFloat(), 0.001); + } + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -386,20 +324,16 @@ public void testWriteFloatArray() { @Test public void testWriteDoubleArray() { final double[] data = new double[] {0.1f, 0.2f, 0.3f, 0.4f}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(4, unpacker.unpackArrayHeader()); - for (double datum : data) { - assertEquals(datum, unpacker.unpackDouble(), 0.001); - } - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(4, unpacker.unpackArrayHeader()); + for (double datum : data) { + assertEquals(datum, unpacker.unpackDouble(), 0.001); + } + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -407,20 +341,16 @@ public void testWriteDoubleArray() { @Test public void testWriteLongArray() { final long[] data = new long[] {1, 2, 3, 4}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(4, unpacker.unpackArrayHeader()); - for (long datum : data) { - assertEquals(datum, unpacker.unpackLong()); - } - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(4, unpacker.unpackArrayHeader()); + for (long datum : data) { + assertEquals(datum, unpacker.unpackLong()); + } + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -428,20 +358,16 @@ public void testWriteLongArray() { @Test public void testWriteIntArray() { final int[] data = new int[] {1, 2, 3, 4}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(4, unpacker.unpackArrayHeader()); - for (int datum : data) { - assertEquals(datum, unpacker.unpackInt()); - } - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(4, unpacker.unpackArrayHeader()); + for (int datum : data) { + assertEquals(datum, unpacker.unpackInt()); + } + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -449,20 +375,16 @@ public void testWriteIntArray() { @Test public void testWriteShortArray() { final short[] data = new short[] {1, 2, 3, 4}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(4, unpacker.unpackArrayHeader()); - for (short datum : data) { - assertEquals(datum, unpacker.unpackInt()); - } - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(4, unpacker.unpackArrayHeader()); + for (short datum : data) { + assertEquals(datum, unpacker.unpackInt()); + } + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -470,17 +392,13 @@ public void testWriteShortArray() { @Test public void testWriteLongBoxed() { final long data = 1234L; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data, unpacker.unpackLong()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data, unpacker.unpackLong()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -488,68 +406,52 @@ public void testWriteLongBoxed() { @Test public void testWriteLongPrimitive() { final long data = 1234L; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data, unpacker.unpackLong()); - assertEquals(data, unpacker.unpackLong()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); - messageFormatter.format( - data, - (x, w) -> { - w.writeLong(x); - w.writeSignedLong(x); - }); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data, unpacker.unpackLong()); + assertEquals(data, unpacker.unpackLong()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); + messageFormatter.format(data, (x, w) -> { + w.writeLong(x); + w.writeSignedLong(x); + }); messageFormatter.flush(); } @Test public void testWriteNegativeLongPrimitive() { final long data = -1234L; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data, unpacker.unpackLong()); - assertEquals(data, unpacker.unpackLong()); - // Can't unpack unsigned long directly as the unpacker refuses negative values - assertEquals(data, unpacker.unpackValue().asNumberValue().toLong()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); - messageFormatter.format( - data, - (x, w) -> { - w.writeLong(x); - w.writeSignedLong(x); - w.writeUnsignedLong(x); - }); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data, unpacker.unpackLong()); + assertEquals(data, unpacker.unpackLong()); + // Can't unpack unsigned long directly as the unpacker refuses negative values + assertEquals(data, unpacker.unpackValue().asNumberValue().toLong()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); + messageFormatter.format(data, (x, w) -> { + w.writeLong(x); + w.writeSignedLong(x); + w.writeUnsignedLong(x); + }); messageFormatter.flush(); } @Test public void testWriteIntBoxed() { final int data = 1234; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data, unpacker.unpackInt()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data, unpacker.unpackInt()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -557,17 +459,13 @@ public void testWriteIntBoxed() { @Test public void testWriteIntPrimitive() { final int data = 1234; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data, unpacker.unpackInt()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data, unpacker.unpackInt()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeInt(x)); messageFormatter.flush(); } @@ -575,17 +473,13 @@ public void testWriteIntPrimitive() { @Test public void testWriteShortBoxed() { final short data = 1234; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data, unpacker.unpackInt()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data, unpacker.unpackInt()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -593,17 +487,13 @@ public void testWriteShortBoxed() { @Test public void testUnknownObject() { final Object data = Codec.INSTANCE; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data.toString(), unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data.toString(), unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -611,19 +501,15 @@ public void testUnknownObject() { @Test public void testWriteObjectArray() { final Object[] data = new Object[] {"foo", "bar"}; - MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100, - (messageCount, buffy) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { - assertEquals(data.length, unpacker.unpackArrayHeader()); - assertEquals(data[0].toString(), unpacker.unpackString()); - assertEquals(data[1].toString(), unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MessageFormatter messageFormatter = new MsgPackWriter(newBuffer(100, (messageCount, buffy) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { + assertEquals(data.length, unpacker.unpackArrayHeader()); + assertEquals(data[0].toString(), unpacker.unpackString()); + assertEquals(data[1].toString(), unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -632,60 +518,48 @@ public void testWriteObjectArray() { public void testWriteStringUTF8BytesString() { UTF8BytesString value = UTF8BytesString.create(NON_ASCII_STRING); MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - NON_ASCII_BUFFER_CAPACITY * 2, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(NON_ASCII_STRING, unpacker.unpackString()); - assertEquals(NON_ASCII_STRING, unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(NON_ASCII_BUFFER_CAPACITY * 2, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.writeObjectString(value, null); writer.writeString(value, null); } @Test public void testWriteStringNull() { - MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - 20, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - unpacker.unpackNil(); - unpacker.unpackNil(); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MsgPackWriter writer = new MsgPackWriter(newBuffer(20, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + unpacker.unpackNil(); + unpacker.unpackNil(); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.writeObjectString(null, null); writer.writeString(null, null); } @Test public void testWriteObjectStringGeneralPath() { - Object value = - new Object() { - @Override - public String toString() { - return NON_ASCII_STRING; - } - }; - MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - 40, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(NON_ASCII_STRING, unpacker.unpackString()); - assertEquals(NON_ASCII_STRING, unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + Object value = new Object() { + @Override + public String toString() { + return NON_ASCII_STRING; + } + }; + MsgPackWriter writer = new MsgPackWriter(newBuffer(40, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.writeObjectString(value, null); writer.writeObjectString(value, s -> NON_ASCII_BYTES); } @@ -693,16 +567,13 @@ public String toString() { @Test public void testWriteStringGeneralCharSequence() { MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - NON_ASCII_BUFFER_CAPACITY, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(NON_ASCII_STRING, unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(NON_ASCII_BUFFER_CAPACITY, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); CharBuffer charSeq = CharBuffer.wrap(NON_ASCII_STRING); writer.writeString(charSeq, null); } @@ -710,35 +581,28 @@ public void testWriteStringGeneralCharSequence() { @Test public void testWriteStringEncodingCache() { MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - NON_ASCII_BUFFER_CAPACITY, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(NON_ASCII_STRING, unpacker.unpackString()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(NON_ASCII_BUFFER_CAPACITY, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.writeString("", s -> NON_ASCII_BYTES); } @Test public void testStartArray() { - MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - 10, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(1, unpacker.unpackArrayHeader()); - assertEquals(0xFFFF, unpacker.unpackArrayHeader()); - assertEquals(0x10000, unpacker.unpackArrayHeader()); - assertEquals(1, unpacker.unpackArrayHeader()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MsgPackWriter writer = new MsgPackWriter(newBuffer(10, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(1, unpacker.unpackArrayHeader()); + assertEquals(0xFFFF, unpacker.unpackArrayHeader()); + assertEquals(0x10000, unpacker.unpackArrayHeader()); + assertEquals(1, unpacker.unpackArrayHeader()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.startArray(1); writer.startArray(0xFFFF); writer.startArray(0x10000); @@ -747,19 +611,15 @@ public void testStartArray() { @Test public void testStartMap() { - MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - 10, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(1, unpacker.unpackMapHeader()); - assertEquals(0xFFFF, unpacker.unpackMapHeader()); - assertEquals(0x10000, unpacker.unpackMapHeader()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MsgPackWriter writer = new MsgPackWriter(newBuffer(10, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(1, unpacker.unpackMapHeader()); + assertEquals(0xFFFF, unpacker.unpackMapHeader()); + assertEquals(0x10000, unpacker.unpackMapHeader()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.startMap(1); writer.startMap(0xFFFF); writer.startMap(0x10000); @@ -767,19 +627,15 @@ public void testStartMap() { @Test public void testStartStringHeader() { - MsgPackWriter writer = - new MsgPackWriter( - newBuffer( - 10, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - assertEquals(1, unpacker.unpackRawStringHeader()); - assertEquals(0xFFFF, unpacker.unpackRawStringHeader()); - assertEquals(0x10000, unpacker.unpackRawStringHeader()); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + MsgPackWriter writer = new MsgPackWriter(newBuffer(10, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(1, unpacker.unpackRawStringHeader()); + assertEquals(0xFFFF, unpacker.unpackRawStringHeader()); + assertEquals(0x10000, unpacker.unpackRawStringHeader()); + } catch (IOException e) { + fail(e.getMessage()); + } + })); writer.writeStringHeader(1); writer.writeStringHeader(0xFFFF); writer.writeStringHeader(0x10000); @@ -804,16 +660,13 @@ public void testSimpleStackTraceEvent() { new StackTraceFrame(1, new StackTraceElement("class1", "method1", "file1", 1)); StackTraceEvent data = new StackTraceEvent(Collections.singletonList(frame), null, null, null); MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 1000, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - checkStackTraceEvent(data, unpacker); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(1000, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + checkStackTraceEvent(data, unpacker); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } @@ -822,32 +675,26 @@ public void testSimpleStackTraceEvent() { public void testSimpleStackTraceFrame() { final StackTraceFrame frame = new StackTraceFrame(1, null, "null", -1, null, null); MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 1000, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - checkStackTraceFrame(frame, unpacker); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(1000, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + checkStackTraceFrame(frame, unpacker); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(frame, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } private void testStackTraceBatch(final Map> batch) { MessageFormatter messageFormatter = - new MsgPackWriter( - newBuffer( - 100000, - (messageCount, buffer) -> { - try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { - checkStackTraceBatch(batch, unpacker); - } catch (IOException e) { - fail(e.getMessage()); - } - })); + new MsgPackWriter(newBuffer(100000, (messageCount, buffer) -> { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + checkStackTraceBatch(batch, unpacker); + } catch (IOException e) { + fail(e.getMessage()); + } + })); messageFormatter.format(batch, (x, w) -> w.writeObject(x, null)); messageFormatter.flush(); } diff --git a/components/context/src/main/java/datadog/context/ContextHelpers.java b/components/context/src/main/java/datadog/context/ContextHelpers.java index 12eddf91e99..c98f69079f1 100644 --- a/components/context/src/main/java/datadog/context/ContextHelpers.java +++ b/components/context/src/main/java/datadog/context/ContextHelpers.java @@ -124,9 +124,8 @@ private static Context combineKeepingFirst(Context current, Context next) { return current; } // Always store next value otherwise - Object[] store = - copyOfRange( - currentIndexed.store, 0, max(currentIndexed.store.length, nextSingleton.index + 1)); + Object[] store = copyOfRange( + currentIndexed.store, 0, max(currentIndexed.store.length, nextSingleton.index + 1)); store[nextSingleton.index] = nextSingleton.value; return new IndexedContext(store); } else if (next instanceof IndexedContext) { @@ -160,6 +159,7 @@ private static Context combineKeepingFirst(Context current, Context next) { // If store was not allocated, no value from nextIndexed was taken return store == null ? current : new IndexedContext(store); } - throw new IllegalStateException("Unsupported context type: " + next.getClass().getName()); + throw new IllegalStateException( + "Unsupported context type: " + next.getClass().getName()); } } diff --git a/components/context/src/main/java/datadog/context/ContextProviders.java b/components/context/src/main/java/datadog/context/ContextProviders.java index c4421b0a2ab..d2b7ac9cbed 100644 --- a/components/context/src/main/java/datadog/context/ContextProviders.java +++ b/components/context/src/main/java/datadog/context/ContextProviders.java @@ -7,17 +7,15 @@ final class ContextProviders { static volatile ContextBinder customBinder; private static final class ProvidedManager { - static final ContextManager INSTANCE = - null != ContextProviders.customManager - ? ContextProviders.customManager - : ThreadLocalContextManager.INSTANCE; + static final ContextManager INSTANCE = null != ContextProviders.customManager + ? ContextProviders.customManager + : ThreadLocalContextManager.INSTANCE; } private static final class ProvidedBinder { - static final ContextBinder INSTANCE = - null != ContextProviders.customBinder - ? ContextProviders.customBinder - : WeakMapContextBinder.INSTANCE; + static final ContextBinder INSTANCE = null != ContextProviders.customBinder + ? ContextProviders.customBinder + : WeakMapContextBinder.INSTANCE; } static ContextManager manager() { diff --git a/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java b/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java index ccb3a641565..540090fff0e 100644 --- a/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java +++ b/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java @@ -147,7 +147,8 @@ public void close() { } private static final class ResumedScopeImpl extends ContextScopeImpl { - @Nullable private ContextContinuationImpl continuation; + @Nullable + private ContextContinuationImpl continuation; ResumedScopeImpl( Context context, diff --git a/components/context/src/main/java/datadog/context/propagation/Propagators.java b/components/context/src/main/java/datadog/context/propagation/Propagators.java index cbf1bd0ae5f..c9e9ac2b788 100644 --- a/components/context/src/main/java/datadog/context/propagation/Propagators.java +++ b/components/context/src/main/java/datadog/context/propagation/Propagators.java @@ -27,13 +27,12 @@ private Propagators() {} */ public static Propagator defaultPropagator() { if (rebuildDefaultPropagator) { - Propagator[] propagatorsByPriority = - PROPAGATORS.entrySet().stream() - .filter(entry -> entry.getValue().isUsedAsDefault()) - .sorted(comparingInt(entry -> entry.getKey().priority())) - .map(Map.Entry::getValue) - .map(RegisteredPropagator::propagator) - .toArray(Propagator[]::new); + Propagator[] propagatorsByPriority = PROPAGATORS.entrySet().stream() + .filter(entry -> entry.getValue().isUsedAsDefault()) + .sorted(comparingInt(entry -> entry.getKey().priority())) + .map(Map.Entry::getValue) + .map(RegisteredPropagator::propagator) + .toArray(Propagator[]::new); defaultPropagator = composite(propagatorsByPriority); rebuildDefaultPropagator = false; } diff --git a/components/context/src/test/java/datadog/context/ContextContinuationTest.java b/components/context/src/test/java/datadog/context/ContextContinuationTest.java index 5f818332c89..3e300588142 100644 --- a/components/context/src/test/java/datadog/context/ContextContinuationTest.java +++ b/components/context/src/test/java/datadog/context/ContextContinuationTest.java @@ -151,15 +151,13 @@ void testResumeOnDifferentThread() { // original scope is closed; resume the context on another thread ExecutorService executor = Executors.newSingleThreadExecutor(); try { - Future future = - executor.submit( - () -> { - assertEquals(root(), current()); // thread starts with root context - try (ContextScope scope = continuation.resume()) { - assertEquals(context, current()); - } - assertEquals(root(), current()); // restored after scope close - }); + Future future = executor.submit(() -> { + assertEquals(root(), current()); // thread starts with root context + try (ContextScope scope = continuation.resume()) { + assertEquals(context, current()); + } + assertEquals(root(), current()); // restored after scope close + }); assertDoesNotThrow(() -> future.get()); } finally { executor.shutdown(); @@ -169,13 +167,12 @@ void testResumeOnDifferentThread() { @Test void testMultipleResumesReleaseAfterLastScopeCloses() throws InterruptedException { List events = synchronizedList(new ArrayList<>()); - ContextManager.register( - new ContextListener() { - @Override - public void onRelease(Context c) { - events.add("release"); - } - }); + ContextManager.register(new ContextListener() { + @Override + public void onRelease(Context c) { + events.add("release"); + } + }); Context context = root().with(TEST_KEY, "value"); ContextContinuation continuation; try (ContextScope scope = context.attach()) { @@ -187,28 +184,24 @@ public void onRelease(Context c) { CountDownLatch closeSecond = new CountDownLatch(1); ExecutorService executor = Executors.newFixedThreadPool(2); try { - Future f1 = - executor.submit( - () -> { - try (ContextScope scope = continuation.resume()) { - bothResumed.countDown(); - closeFirst.await(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } finally { - firstClosed.countDown(); - } - }); - Future f2 = - executor.submit( - () -> { - try (ContextScope scope = continuation.resume()) { - bothResumed.countDown(); - closeSecond.await(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - }); + Future f1 = executor.submit(() -> { + try (ContextScope scope = continuation.resume()) { + bothResumed.countDown(); + closeFirst.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + firstClosed.countDown(); + } + }); + Future f2 = executor.submit(() -> { + try (ContextScope scope = continuation.resume()) { + bothResumed.countDown(); + closeSecond.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); bothResumed.await(); assertTrue(events.isEmpty(), "release should not fire while scopes are open"); closeFirst.countDown(); diff --git a/components/context/src/test/java/datadog/context/ContextHelpersTest.java b/components/context/src/test/java/datadog/context/ContextHelpersTest.java index de2f1610a87..a562546bf70 100644 --- a/components/context/src/test/java/datadog/context/ContextHelpersTest.java +++ b/components/context/src/test/java/datadog/context/ContextHelpersTest.java @@ -177,11 +177,10 @@ void testCombiner() { Context context2 = root().with(errorKey, ErrorStats.from(SEVERE, 1)).with(FLOAT_KEY, 3.14F); Context context3 = root().with(errorKey, ErrorStats.from(WARNING, 6)).with(BOOLEAN_KEY, true); - BinaryOperator errorStatsMerger = - (left, right) -> { - ErrorStats mergedStats = ErrorStats.merge(left.get(errorKey), right.get(errorKey)); - return left.with(errorKey, mergedStats); - }; + BinaryOperator errorStatsMerger = (left, right) -> { + ErrorStats mergedStats = ErrorStats.merge(left.get(errorKey), right.get(errorKey)); + return left.with(errorKey, mergedStats); + }; Context combined = combine(errorStatsMerger, context1, context2, context3); ErrorStats combinedStats = combined.get(errorKey); assertNotNull(combinedStats, "Failed to combined error stats"); diff --git a/components/context/src/test/java/datadog/context/ContextListenerExceptionTest.java b/components/context/src/test/java/datadog/context/ContextListenerExceptionTest.java index 160873e7103..314f179c24d 100644 --- a/components/context/src/test/java/datadog/context/ContextListenerExceptionTest.java +++ b/components/context/src/test/java/datadog/context/ContextListenerExceptionTest.java @@ -13,52 +13,47 @@ class ContextListenerExceptionTest extends ContextTestBase { @Test void testListenerExceptionSwallowed() { - ContextManager.register( - new ContextListener() { - @Override - public void onUpdate(Context before, Context after) { - throw new RuntimeException("listener failure"); - } - }); + ContextManager.register(new ContextListener() { + @Override + public void onUpdate(Context before, Context after) { + throw new RuntimeException("listener failure"); + } + }); Context context = root().with(TEST_KEY, "value"); - assertDoesNotThrow( - () -> { - try (ContextScope scope = context.attach()) { - assertEquals(context, current()); - } - }); + assertDoesNotThrow(() -> { + try (ContextScope scope = context.attach()) { + assertEquals(context, current()); + } + }); } @Test void testListenerExceptionSwallowedOnCapture() { - ContextManager.register( - new ContextListener() { - @Override - public void onCapture(Context c) { - throw new RuntimeException("listener failure on capture"); - } - }); + ContextManager.register(new ContextListener() { + @Override + public void onCapture(Context c) { + throw new RuntimeException("listener failure on capture"); + } + }); Context context = root().with(TEST_KEY, "value"); try (ContextScope scope = context.attach()) { - assertDoesNotThrow( - () -> { - ContextContinuation continuation = context.capture(); - assertNotNull(continuation); - assertEquals(context, continuation.context()); - continuation.release(); - }); + assertDoesNotThrow(() -> { + ContextContinuation continuation = context.capture(); + assertNotNull(continuation); + assertEquals(context, continuation.context()); + continuation.release(); + }); } } @Test void testListenerExceptionSwallowedOnRelease() { - ContextManager.register( - new ContextListener() { - @Override - public void onRelease(Context c) { - throw new RuntimeException("listener failure on release"); - } - }); + ContextManager.register(new ContextListener() { + @Override + public void onRelease(Context c) { + throw new RuntimeException("listener failure on release"); + } + }); Context context = root().with(TEST_KEY, "value"); try (ContextScope scope = context.attach()) { ContextContinuation continuation = context.capture(); diff --git a/components/context/src/test/java/datadog/context/ContextManagerTest.java b/components/context/src/test/java/datadog/context/ContextManagerTest.java index 789f6fc6eaf..e3c07d7fe77 100644 --- a/components/context/src/test/java/datadog/context/ContextManagerTest.java +++ b/components/context/src/test/java/datadog/context/ContextManagerTest.java @@ -149,60 +149,56 @@ void testThreadIndependence() { /* * Create first executor. */ - Future future1 = - executor.submit( - () -> { - try { - // Fist step: check empty context - phaser.arriveAndAwaitAdvance(); - assertEquals(root(), current()); - // Second step: set context on first executor - Context context1 = root().with(STRING_KEY, "executor1"); - try (ContextScope ignored1 = context1.attach()) { - phaser.arriveAndAwaitAdvance(); - assertEquals(context1, current()); - // Third step: set context on second executor - phaser.arriveAndAwaitAdvance(); - assertEquals(context1, current()); - // Fourth step: set child context on first executor - Context context11 = context1.with(STRING_KEY, "executor1.1"); - try (ContextScope ignored11 = context11.attach()) { - phaser.arriveAndAwaitAdvance(); - assertEquals(context11, current()); - } - } - } finally { - // Complete the execution - phaser.arriveAndDeregister(); - } - }); + Future future1 = executor.submit(() -> { + try { + // Fist step: check empty context + phaser.arriveAndAwaitAdvance(); + assertEquals(root(), current()); + // Second step: set context on first executor + Context context1 = root().with(STRING_KEY, "executor1"); + try (ContextScope ignored1 = context1.attach()) { + phaser.arriveAndAwaitAdvance(); + assertEquals(context1, current()); + // Third step: set context on second executor + phaser.arriveAndAwaitAdvance(); + assertEquals(context1, current()); + // Fourth step: set child context on first executor + Context context11 = context1.with(STRING_KEY, "executor1.1"); + try (ContextScope ignored11 = context11.attach()) { + phaser.arriveAndAwaitAdvance(); + assertEquals(context11, current()); + } + } + } finally { + // Complete the execution + phaser.arriveAndDeregister(); + } + }); /* * Create second executor. */ - Future future2 = - executor.submit( - () -> { - try { - // First step: check empty context - phaser.arriveAndAwaitAdvance(); - assertEquals(root(), current()); - // Second step: set context on first executor - phaser.arriveAndAwaitAdvance(); - assertEquals(root(), current()); - // Third step: set context on second executor - Context context2 = root().with(STRING_KEY, "executor2"); - try (ContextScope ignored2 = context2.attach()) { - phaser.arriveAndAwaitAdvance(); - assertEquals(context2, current()); - // Fourth step: set child context on first executor - phaser.arriveAndAwaitAdvance(); - assertEquals(context2, current()); - } - } finally { - // Complete the execution - phaser.arriveAndDeregister(); - } - }); + Future future2 = executor.submit(() -> { + try { + // First step: check empty context + phaser.arriveAndAwaitAdvance(); + assertEquals(root(), current()); + // Second step: set context on first executor + phaser.arriveAndAwaitAdvance(); + assertEquals(root(), current()); + // Third step: set context on second executor + Context context2 = root().with(STRING_KEY, "executor2"); + try (ContextScope ignored2 = context2.attach()) { + phaser.arriveAndAwaitAdvance(); + assertEquals(context2, current()); + // Fourth step: set child context on first executor + phaser.arriveAndAwaitAdvance(); + assertEquals(context2, current()); + } + } finally { + // Complete the execution + phaser.arriveAndDeregister(); + } + }); /* * Run main thread. */ diff --git a/components/context/src/test/java/datadog/context/ContextProvidersForkedTest.java b/components/context/src/test/java/datadog/context/ContextProvidersForkedTest.java index 73c55a28c6f..70e2fe8be00 100644 --- a/components/context/src/test/java/datadog/context/ContextProvidersForkedTest.java +++ b/components/context/src/test/java/datadog/context/ContextProvidersForkedTest.java @@ -27,23 +27,22 @@ void testCustomBinder() { assertSame(root(), Context.from(carrier)); // now register a NOOP context binder - ContextBinder.register( - new ContextBinder() { - @Override - public Context from(@Nonnull Object carrier) { - return root(); - } - - @Override - public void attachTo(@Nonnull Object carrier, @Nonnull Context context) { - // no-op - } - - @Override - public Context detachFrom(@Nonnull Object carrier) { - return root(); - } - }); + ContextBinder.register(new ContextBinder() { + @Override + public Context from(@Nonnull Object carrier) { + return root(); + } + + @Override + public void attachTo(@Nonnull Object carrier, @Nonnull Context context) { + // no-op + } + + @Override + public Context detachFrom(@Nonnull Object carrier) { + return root(); + } + }); // NOOP binder, context will always be root context.attachTo(carrier); @@ -75,31 +74,30 @@ void testCustomManager() { assertSame(root(), Context.current()); // now register a NOOP context manager - ContextManager.register( - new ContextManager() { - @Override - public Context current() { - return root(); - } - - @Override - public ContextScope attach(@Nonnull Context context) { - return new NoopContextScope(root()); - } - - @Override - public Context swap(@Nonnull Context context) { - return root(); - } - - @Override - public ContextContinuation capture(@Nonnull Context context) { - return new NoopContextContinuation(root()); - } - - @Override - public void addListener(@Nonnull ContextListener listener) {} - }); + ContextManager.register(new ContextManager() { + @Override + public Context current() { + return root(); + } + + @Override + public ContextScope attach(@Nonnull Context context) { + return new NoopContextScope(root()); + } + + @Override + public Context swap(@Nonnull Context context) { + return root(); + } + + @Override + public ContextContinuation capture(@Nonnull Context context) { + return new NoopContextContinuation(root()); + } + + @Override + public void addListener(@Nonnull ContextListener listener) {} + }); ContextTestBase.TrackingListener listener = trackingListener(); ContextManager.register(listener); diff --git a/components/context/src/test/java/datadog/context/propagation/PropagatorsTest.java b/components/context/src/test/java/datadog/context/propagation/PropagatorsTest.java index a8611014ede..fc420d1f658 100644 --- a/components/context/src/test/java/datadog/context/propagation/PropagatorsTest.java +++ b/components/context/src/test/java/datadog/context/propagation/PropagatorsTest.java @@ -40,12 +40,11 @@ class PropagatorsTest { static final DependentPropagator PROFILING_PROPAGATOR = new DependentPropagator(PROFILING_KEY, "profiling", TRACING_KEY); - static final Context CONTEXT = - root() - .with(TRACING_KEY, "sampled") - .with(IAST_KEY, "standalone") - .with(DEBUGGER_KEY, "debug") - .with(PROFILING_KEY, "profile"); + static final Context CONTEXT = root() + .with(TRACING_KEY, "sampled") + .with(IAST_KEY, "standalone") + .with(DEBUGGER_KEY, "debug") + .with(PROFILING_KEY, "profile"); @ParametersAreNonnullByDefault static class MapCarrierAccessor @@ -83,13 +82,11 @@ public void inject(Context context, C carrier, CarrierSetter setter) { @Override public Context extract(Context context, C carrier, CarrierVisitor visitor) { String[] valueRef = new String[1]; - visitor.forEachKeyValue( - carrier, - (key, value) -> { - if (this.carrierKey.equals(key)) { - valueRef[0] = value; - } - }); + visitor.forEachKeyValue(carrier, (key, value) -> { + if (this.carrierKey.equals(key)) { + valueRef[0] = value; + } + }); if (valueRef[0] != null) { context = context.with(this.contextKey, valueRef[0]); } diff --git a/components/environment/src/main/java/datadog/environment/CommandLine.java b/components/environment/src/main/java/datadog/environment/CommandLine.java index 79f78bef2af..c42bdcc48fa 100644 --- a/components/environment/src/main/java/datadog/environment/CommandLine.java +++ b/components/environment/src/main/java/datadog/environment/CommandLine.java @@ -30,7 +30,8 @@ class CommandLine { @SuppressForbidden // split on single-character uses a fast path private List findFullCommand() { - String command = SystemProperties.getOrDefault(SUN_JAVA_COMMAND_PROPERTY, "").trim(); + String command = + SystemProperties.getOrDefault(SUN_JAVA_COMMAND_PROPERTY, "").trim(); return command.isEmpty() ? emptyList() : Arrays.asList(command.split(" ")); } diff --git a/components/environment/src/test/java/datadog/environment/CommandLineTest.java b/components/environment/src/test/java/datadog/environment/CommandLineTest.java index b1673b80a29..86763495267 100644 --- a/components/environment/src/test/java/datadog/environment/CommandLineTest.java +++ b/components/environment/src/test/java/datadog/environment/CommandLineTest.java @@ -109,9 +109,8 @@ private static String argFile(String name) { private static List expectedArsFromArgFile(String name) { List arguments = new ArrayList<>(); - try (InputStream stream = - requireNonNull( - CommandLineTest.class.getResourceAsStream("/argfiles/" + name + "-expected.txt")); + try (InputStream stream = requireNonNull( + CommandLineTest.class.getResourceAsStream("/argfiles/" + name + "-expected.txt")); BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) { String line; while ((line = reader.readLine()) != null) { diff --git a/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java b/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java index 99edf00159d..7e29ec67338 100644 --- a/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java +++ b/components/environment/src/test/java/datadog/environment/JavaVirtualMachineTest.java @@ -170,9 +170,8 @@ void testRuntimeParsing( String expectedPatches, String expectedName, String expectedVendor) { - JavaVirtualMachine.Runtime runtime = - new JavaVirtualMachine.Runtime( - javaVersion, javaRuntimeVersion, javaRuntimeName, javaVmVendor, null); + JavaVirtualMachine.Runtime runtime = new JavaVirtualMachine.Runtime( + javaVersion, javaRuntimeVersion, javaRuntimeName, javaVmVendor, null); assertEquals(expectedVersion, runtime.version); assertEquals(expectedPatches, runtime.patches); assertEquals(expectedName, runtime.name); diff --git a/components/environment/src/test/java/datadog/environment/JvmOptionsTest.java b/components/environment/src/test/java/datadog/environment/JvmOptionsTest.java index 3d66c562262..64e689bedb4 100644 --- a/components/environment/src/test/java/datadog/environment/JvmOptionsTest.java +++ b/components/environment/src/test/java/datadog/environment/JvmOptionsTest.java @@ -174,9 +174,8 @@ void testFindVmOptionsFromProcFs(String useCase, String[] procfsCmdline, List environmentVariables) { - assumeTrue( - JavaVirtualMachine.isJavaVersionAtLeast(9) - || !environmentVariables.containsKey("JDK_JAVA_OPTIONS")); + assumeTrue(JavaVirtualMachine.isJavaVersionAtLeast(9) + || !environmentVariables.containsKey("JDK_JAVA_OPTIONS")); } private static Map env(String... keysAndValues) { @@ -196,9 +195,8 @@ private static String argFile(String name) { private static List expectedArsFromArgFile(String name) { List arguments = new ArrayList<>(); - try (InputStream stream = - requireNonNull( - CommandLineTest.class.getResourceAsStream("/argfiles/" + name + "-expected.txt")); + try (InputStream stream = requireNonNull( + CommandLineTest.class.getResourceAsStream("/argfiles/" + name + "-expected.txt")); BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) { String line; while ((line = reader.readLine()) != null) { diff --git a/components/environment/src/test/java/datadog/environment/ThreadSupportTest.java b/components/environment/src/test/java/datadog/environment/ThreadSupportTest.java index be2032c5470..bdb84577ce8 100644 --- a/components/environment/src/test/java/datadog/environment/ThreadSupportTest.java +++ b/components/environment/src/test/java/datadog/environment/ThreadSupportTest.java @@ -20,7 +20,8 @@ class ThreadSupportTest { @BeforeAll static void beforeAll() { singleThreadExecutor = Executors.newSingleThreadExecutor(); - newVirtualThreadPerTaskExecutor = ThreadSupport.newVirtualThreadPerTaskExecutor().orElse(null); + newVirtualThreadPerTaskExecutor = + ThreadSupport.newVirtualThreadPerTaskExecutor().orElse(null); } @Test @@ -58,12 +59,10 @@ void testVirtualThread() { static void assertVirtualThread(ExecutorService executorService, boolean expected) { Future futureCurrent = executorService.submit(() -> ThreadSupport.isVirtual()); - Future futureGiven = - executorService.submit( - () -> { - Thread thread = Thread.currentThread(); - return ThreadSupport.isVirtual(thread); - }); + Future futureGiven = executorService.submit(() -> { + Thread thread = Thread.currentThread(); + return ThreadSupport.isVirtual(thread); + }); try { assertEquals(expected, futureCurrent.get(), "invalid current thread virtual status"); assertEquals(expected, futureGiven.get(), "invalid given thread virtual status"); diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java index 30c2df16168..340f2f5c024 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java @@ -92,30 +92,28 @@ void testExecuteAsyncWithListener() throws Exception { CountDownLatch latch = new CountDownLatch(1); HttpUrl url = HttpUrl.parse(this.baseUrl + "/test"); - HttpRequest request = - HttpRequest.newBuilder() - .url(url) - .get() - .listener( - new HttpRequestListener() { - @Override - public void onRequestStart(HttpRequest request) { - startCalled.set(true); - } - - @Override - public void onRequestEnd(HttpRequest request, HttpResponse response) { - endCalled.set(true); - capturedResponse.set(response); - latch.countDown(); - } - - @Override - public void onRequestFailure(HttpRequest request, IOException exception) { - fail("Should not fail"); - } - }) - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url(url) + .get() + .listener(new HttpRequestListener() { + @Override + public void onRequestStart(HttpRequest request) { + startCalled.set(true); + } + + @Override + public void onRequestEnd(HttpRequest request, HttpResponse response) { + endCalled.set(true); + capturedResponse.set(response); + latch.countDown(); + } + + @Override + public void onRequestFailure(HttpRequest request, IOException exception) { + fail("Should not fail"); + } + }) + .build(); this.client.executeAsync(request); @@ -138,30 +136,28 @@ void testExecuteAsyncWithListenerOnFailure() throws Exception { AtomicReference capturedException = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(1); - HttpRequest request = - HttpRequest.newBuilder() - .url(url) - .get() - .listener( - new HttpRequestListener() { - @Override - public void onRequestStart(HttpRequest request) { - startCalled.set(true); - } - - @Override - public void onRequestEnd(HttpRequest request, HttpResponse response) { - fail("Should not succeed"); - } - - @Override - public void onRequestFailure(HttpRequest request, IOException exception) { - failureCalled.set(true); - capturedException.set(exception); - latch.countDown(); - } - }) - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url(url) + .get() + .listener(new HttpRequestListener() { + @Override + public void onRequestStart(HttpRequest request) { + startCalled.set(true); + } + + @Override + public void onRequestEnd(HttpRequest request, HttpResponse response) { + fail("Should not succeed"); + } + + @Override + public void onRequestFailure(HttpRequest request, IOException exception) { + failureCalled.set(true); + capturedException.set(exception); + latch.countDown(); + } + }) + .build(); CompletableFuture future = this.client.executeAsync(request); @@ -189,17 +185,13 @@ void testExecuteAsyncComposition() throws Exception { HttpRequest request = HttpRequest.newBuilder().url(url).get().build(); // Test thenApply composition - CompletableFuture future = - this.client - .executeAsync(request) - .thenApply( - response -> { - try { - return Integer.parseInt(response.bodyAsString().trim()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); + CompletableFuture future = this.client.executeAsync(request).thenApply(response -> { + try { + return Integer.parseInt(response.bodyAsString().trim()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); Integer result = future.get(TIMEOUT_SECONDS, SECONDS); assertEquals(42, result); @@ -220,10 +212,14 @@ void testExecuteAsyncMultipleRequests() throws Exception { .when(expectedRequest2) .respond(response().withStatusCode(200).withBody("response2")); - HttpRequest request1 = - HttpRequest.newBuilder().url(HttpUrl.parse(this.baseUrl + "/test1")).get().build(); - HttpRequest request2 = - HttpRequest.newBuilder().url(HttpUrl.parse(this.baseUrl + "/test2")).get().build(); + HttpRequest request1 = HttpRequest.newBuilder() + .url(HttpUrl.parse(this.baseUrl + "/test1")) + .get() + .build(); + HttpRequest request2 = HttpRequest.newBuilder() + .url(HttpUrl.parse(this.baseUrl + "/test2")) + .get() + .build(); // Execute both requests concurrently CompletableFuture future1 = this.client.executeAsync(request1); diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java index 811ed742723..e38b59ecef1 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java @@ -55,22 +55,20 @@ void testGetRequest() throws IOException { @Test void testPostRequest() throws IOException { String payload = "{\"key\":\"value\"}"; - org.mockserver.model.HttpRequest expectedRequest = - request() - .withMethod("POST") - .withPath("/test") - .withHeader("Content-Type", "application/json") - .withBody(payload); + org.mockserver.model.HttpRequest expectedRequest = request() + .withMethod("POST") + .withPath("/test") + .withHeader("Content-Type", "application/json") + .withBody(payload); this.server.when(expectedRequest).respond(response().withStatusCode(201)); HttpUrl url = HttpUrl.parse(this.baseUrl + "/test"); HttpRequestBody body = HttpRequestBody.of(payload); - HttpRequest request = - HttpRequest.newBuilder() - .url(url) - .header("Content-Type", "application/json") - .post(body) - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url(url) + .header("Content-Type", "application/json") + .post(body) + .build(); HttpResponse response = this.client.execute(request); @@ -84,22 +82,20 @@ void testPostRequest() throws IOException { @Test void testPutRequest() throws IOException { String payload = "{\"key\":\"value\"}"; - org.mockserver.model.HttpRequest expectedRequest = - request() - .withMethod("PUT") - .withPath("/test") - .withHeader("Content-Type", "application/json") - .withBody(payload); + org.mockserver.model.HttpRequest expectedRequest = request() + .withMethod("PUT") + .withPath("/test") + .withHeader("Content-Type", "application/json") + .withBody(payload); this.server.when(expectedRequest).respond(response().withStatusCode(200)); HttpUrl url = HttpUrl.parse(this.baseUrl + "/test"); HttpRequestBody body = HttpRequestBody.of(payload); - HttpRequest request = - HttpRequest.newBuilder() - .url(url) - .header("Content-Type", "application/json") - .put(body) - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url(url) + .header("Content-Type", "application/json") + .put(body) + .build(); HttpResponse response = this.client.execute(request); @@ -130,24 +126,22 @@ void testErrorResponse() throws IOException { @Test void testRequestHeaders() throws IOException { - org.mockserver.model.HttpRequest expectedRequest = - request() - .withMethod("GET") - .withPath("/test") - .withHeader("Accept", "text/plain") - .withHeader("X-Custom-Header", "custom-value1", "custom-value2", "custom-value3"); + org.mockserver.model.HttpRequest expectedRequest = request() + .withMethod("GET") + .withPath("/test") + .withHeader("Accept", "text/plain") + .withHeader("X-Custom-Header", "custom-value1", "custom-value2", "custom-value3"); this.server.when(expectedRequest).respond(response().withStatusCode(200)); HttpUrl url = HttpUrl.parse(this.baseUrl + "/test"); - HttpRequest request = - HttpRequest.newBuilder() - .url(url) - .get() - .header("Accept", "text/plain") - .addHeader("X-Custom-Header", "custom-value1") - .addHeader("X-Custom-Header", "custom-value2") - .addHeader("X-Custom-Header", "custom-value3") - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url(url) + .get() + .header("Accept", "text/plain") + .addHeader("X-Custom-Header", "custom-value1") + .addHeader("X-Custom-Header", "custom-value2") + .addHeader("X-Custom-Header", "custom-value3") + .build(); HttpResponse response = this.client.execute(request); @@ -162,12 +156,11 @@ void testRequestHeaders() throws IOException { void testResponseHeaders() throws IOException { org.mockserver.model.HttpRequest expectedRequest = request().withMethod("GET").withPath("/test"); - org.mockserver.model.HttpResponse resultResponse = - response() - .withStatusCode(200) - .withHeader("Content-Type", "text/plain") - .withHeader("X-Custom-Header", "value1", "value2", "value3") - .withBody("test-response"); + org.mockserver.model.HttpResponse resultResponse = response() + .withStatusCode(200) + .withHeader("Content-Type", "text/plain") + .withHeader("X-Custom-Header", "value1", "value2", "value3") + .withBody("test-response"); this.server.when(expectedRequest).respond(resultResponse); HttpUrl url = HttpUrl.parse(this.baseUrl + "/test"); diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpRequestTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpRequestTest.java index 28b9efb0484..b8232c94360 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpRequestTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpRequestTest.java @@ -46,13 +46,15 @@ void testPutRequest() { @Test void testWithoutMethod() { - HttpRequest request = HttpRequest.newBuilder().url("http://localhost:8080/test").build(); + HttpRequest request = + HttpRequest.newBuilder().url("http://localhost:8080/test").build(); assertEquals("GET", request.method()); } @Test void testRequestWithUrlString() { - HttpRequest request = HttpRequest.newBuilder().url("http://localhost:8080/test").get().build(); + HttpRequest request = + HttpRequest.newBuilder().url("http://localhost:8080/test").get().build(); assertNotNull(request); assertEquals("http://localhost:8080/test", request.url().url()); @@ -60,27 +62,25 @@ void testRequestWithUrlString() { @Test void testRequestWithSingleHeader() { - HttpRequest request = - HttpRequest.newBuilder() - .url("http://localhost:8080/test") - .header("Content-Type", "application/json") - .get() - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url("http://localhost:8080/test") + .header("Content-Type", "application/json") + .get() + .build(); assertEquals("application/json", request.header("Content-Type")); } @Test void testRequestWithMultipleHeaders() { - HttpRequest request = - HttpRequest.newBuilder() - .url("http://localhost:8080/test") - .header("Content-Type", "application/json") - .header("Accept", "application/json") - .addHeader("X-Custom-Header", "value1") - .addHeader("X-Custom-Header", "value2") - .get() - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url("http://localhost:8080/test") + .header("Content-Type", "application/json") + .header("Accept", "application/json") + .addHeader("X-Custom-Header", "value1") + .addHeader("X-Custom-Header", "value2") + .get() + .build(); assertEquals("application/json", request.header("Content-Type")); assertEquals("application/json", request.header("Accept")); @@ -93,25 +93,26 @@ void testRequestWithMultipleHeaders() { @Test void testWithoutUrl() { - assertThrows(IllegalStateException.class, () -> HttpRequest.newBuilder().get().build()); + assertThrows( + IllegalStateException.class, () -> HttpRequest.newBuilder().get().build()); } @Test void testHeaderReplacement() { - HttpRequest request = - HttpRequest.newBuilder() - .url("http://localhost:8080/test") - .header("Content-Type", "text/plain") - .header("Content-Type", "application/json") - .get() - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url("http://localhost:8080/test") + .header("Content-Type", "text/plain") + .header("Content-Type", "application/json") + .get() + .build(); assertEquals("application/json", request.header("Content-Type")); } @Test void testMissingHeader() { - HttpRequest request = HttpRequest.newBuilder().url("http://localhost:8080/test").get().build(); + HttpRequest request = + HttpRequest.newBuilder().url("http://localhost:8080/test").get().build(); assertNull(request.header("X-Missing")); List missing = request.headers("X-Missing"); @@ -121,12 +122,11 @@ void testMissingHeader() { @Test void testEmptyHeaderValue() { - HttpRequest request = - HttpRequest.newBuilder() - .url("http://localhost:8080/test") - .header("X-Empty-Header", "") - .get() - .build(); + HttpRequest request = HttpRequest.newBuilder() + .url("http://localhost:8080/test") + .header("X-Empty-Header", "") + .get() + .build(); assertEquals("", request.header("X-Empty-Header")); } diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java index 2bfde756dcc..7fd46bc707a 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java @@ -103,11 +103,10 @@ void testHeader() throws IOException { void testHeaderNames() throws IOException { org.mockserver.model.HttpRequest expectedRequest = request().withMethod("GET").withPath("/test"); - org.mockserver.model.HttpResponse resultResponse = - response() - .withHeader("Content-Type", "application/json") - .withHeader("X-Custom-Header", "custom-value") - .withHeader("X-Another-Header", "another-value"); + org.mockserver.model.HttpResponse resultResponse = response() + .withHeader("Content-Type", "application/json") + .withHeader("X-Custom-Header", "custom-value") + .withHeader("X-Another-Header", "another-value"); this.server.when(expectedRequest).respond(resultResponse); HttpUrl url = HttpUrl.parse(this.baseUrl + "/test"); diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpUrlTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpUrlTest.java index da4f6f1b513..8f15706dde0 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpUrlTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpUrlTest.java @@ -188,22 +188,24 @@ void testNewBuilderAllowsModification() { @Test void testAddPathSegmentSingle() { - HttpUrl url = - HttpUrl.builder().scheme("https").host("example.com").addPathSegment("api").build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addPathSegment("api") + .build(); assertTrue(url.url().contains("/api")); } @Test void testAddPathSegmentMultiple() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .addPathSegment("api") - .addPathSegment("v1") - .addPathSegment("users") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addPathSegment("api") + .addPathSegment("v1") + .addPathSegment("users") + .build(); String urlString = url.url(); assertTrue(urlString.contains("/api")); @@ -213,13 +215,12 @@ void testAddPathSegmentMultiple() { @Test void testAddPathSegmentWithPort() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .port(8443) - .addPathSegment("api") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .port(8443) + .addPathSegment("api") + .build(); String urlString = url.url(); assertTrue(urlString.contains(":8443")); @@ -230,7 +231,8 @@ void testAddPathSegmentWithPort() { @Test void testBuilderSchemeHostPort() { - HttpUrl url = HttpUrl.builder().scheme("https").host("api.example.com").port(8443).build(); + HttpUrl url = + HttpUrl.builder().scheme("https").host("api.example.com").port(8443).build(); assertEquals("https", url.scheme()); assertEquals("api.example.com", url.host()); @@ -248,12 +250,11 @@ void testBuilderDefaultScheme() { @Test void testAddQueryParameterSingle() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .addQueryParameter("key", "value") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addQueryParameter("key", "value") + .build(); String urlString = url.url(); // OkHttp adds trailing slash, JDK doesn't - both are valid @@ -264,14 +265,13 @@ void testAddQueryParameterSingle() { @Test void testAddQueryParameterMultiple() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .addQueryParameter("key1", "value1") - .addQueryParameter("key2", "value2") - .addQueryParameter("key3", "value3") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addQueryParameter("key1", "value1") + .addQueryParameter("key2", "value2") + .addQueryParameter("key3", "value3") + .build(); String urlString = url.url(); // OkHttp adds trailing slash, JDK doesn't - both are valid @@ -286,12 +286,11 @@ void testAddQueryParameterMultiple() { @Test void testAddQueryParameterWithNullValue() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .addQueryParameter("flag", null) - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addQueryParameter("flag", null) + .build(); String urlString = url.url(); assertTrue(urlString.contains("flag")); @@ -301,13 +300,12 @@ void testAddQueryParameterWithNullValue() { @Test void testAddQueryParameterWithEncoding() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .addQueryParameter("message", "hello world") - .addQueryParameter("special", "a=b&c=d") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addQueryParameter("message", "hello world") + .addQueryParameter("special", "a=b&c=d") + .build(); String urlString = url.url(); // Values should be URL encoded - accept both + and %20 for space @@ -321,15 +319,14 @@ void testAddQueryParameterWithEncoding() { @Test void testAddQueryParameterWithPath() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .addPathSegment("api") - .addPathSegment("v1") - .addQueryParameter("page", "1") - .addQueryParameter("limit", "10") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addPathSegment("api") + .addPathSegment("v1") + .addQueryParameter("page", "1") + .addQueryParameter("limit", "10") + .build(); String urlString = url.url(); assertTrue(urlString.contains("example.com/api/v1")); @@ -359,8 +356,11 @@ void testAddQueryParameterPreservesExistingQuery() { @Test void testAddQueryParameterEmptyValue() { - HttpUrl url = - HttpUrl.builder().scheme("https").host("example.com").addQueryParameter("key", "").build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addQueryParameter("key", "") + .build(); String urlString = url.url(); assertTrue(urlString.contains("key=")); @@ -368,13 +368,12 @@ void testAddQueryParameterEmptyValue() { @Test void testAddQueryParameterSpecialCharactersInName() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .addQueryParameter("my-key", "value") - .addQueryParameter("my_key", "value2") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .addQueryParameter("my-key", "value") + .addQueryParameter("my_key", "value2") + .build(); String urlString = url.url(); assertTrue(urlString.contains("my-key=value")); @@ -383,13 +382,12 @@ void testAddQueryParameterSpecialCharactersInName() { @Test void testAddQueryParameterWithPort() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .port(8443) - .addQueryParameter("key", "value") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .port(8443) + .addQueryParameter("key", "value") + .build(); String urlString = url.url(); assertTrue(urlString.contains(":8443")); @@ -400,14 +398,13 @@ void testAddQueryParameterWithPort() { @Test void testUrlReturnsCompleteUrl() { - HttpUrl url = - HttpUrl.builder() - .scheme("https") - .host("example.com") - .port(8443) - .addPathSegment("api") - .addQueryParameter("key", "value") - .build(); + HttpUrl url = HttpUrl.builder() + .scheme("https") + .host("example.com") + .port(8443) + .addPathSegment("api") + .addQueryParameter("key", "value") + .build(); String urlString = url.url(); assertTrue(urlString.startsWith("https://")); diff --git a/components/json/src/main/java/datadog/json/JsonReader.java b/components/json/src/main/java/datadog/json/JsonReader.java index 771617cf0a2..7d586dbd972 100644 --- a/components/json/src/main/java/datadog/json/JsonReader.java +++ b/components/json/src/main/java/datadog/json/JsonReader.java @@ -488,24 +488,20 @@ private String readLiteral(int length) throws IOException { } private IOException unexpectedSyntaxError(String expected, String found) { - return new IOException( - String.format( - "Syntax error at line %d, position %d: expected %s but found '%s'", - this.lineNumber, this.linePosition, expected, found)); + return new IOException(String.format( + "Syntax error at line %d, position %d: expected %s but found '%s'", + this.lineNumber, this.linePosition, expected, found)); } private IOException unexpectedSyntaxError(String expected, char found) { - return new IOException( - String.format( - "Syntax error at line %d, position %d: expected %s but found '%s'", - this.lineNumber, this.linePosition, expected, found)); + return new IOException(String.format( + "Syntax error at line %d, position %d: expected %s but found '%s'", + this.lineNumber, this.linePosition, expected, found)); } private IOException syntaxError(String message) { - return new IOException( - String.format( - "Syntax error at line %d, position %d: %s", - this.lineNumber, this.linePosition, message)); + return new IOException(String.format( + "Syntax error at line %d, position %d: %s", this.lineNumber, this.linePosition, message)); } @Override diff --git a/components/json/src/test/java/datadog/json/JsonReaderTest.java b/components/json/src/test/java/datadog/json/JsonReaderTest.java index e716a625103..9f2d99f3b94 100644 --- a/components/json/src/test/java/datadog/json/JsonReaderTest.java +++ b/components/json/src/test/java/datadog/json/JsonReaderTest.java @@ -61,53 +61,45 @@ void testReadEmptyObject() { @ParameterizedTest @ValueSource(strings = {"", "null", "1", "[]", "true", "false"}) void testInvalidObjectStart(String json) { - assertThrows( - IOException.class, - () -> { - try (JsonReader reader = new JsonReader(json)) { - reader.beginObject(); - } - }); + assertThrows(IOException.class, () -> { + try (JsonReader reader = new JsonReader(json)) { + reader.beginObject(); + } + }); } @ParameterizedTest @ValueSource(strings = {"{", "{\"key\":\"value\"}", "{null}", "{]"}) void testInvalidObjectEnd(String json) { - assertThrows( - IOException.class, - () -> { - try (JsonReader reader = new JsonReader(json)) { - reader.beginObject(); - reader.endObject(); - } - }); + assertThrows(IOException.class, () -> { + try (JsonReader reader = new JsonReader(json)) { + reader.beginObject(); + reader.endObject(); + } + }); } @ParameterizedTest @ValueSource(strings = {"{\"key\"}", "{\"key\"\"value\"}", "{key:\"value\"}"}) void testInvalidObjectNames(String json) { - assertThrows( - IOException.class, - () -> { - try (JsonReader reader = new JsonReader(json)) { - reader.beginObject(); - reader.nextName(); - } - }); + assertThrows(IOException.class, () -> { + try (JsonReader reader = new JsonReader(json)) { + reader.beginObject(); + reader.nextName(); + } + }); } @ParameterizedTest @ValueSource(strings = {"{\"key\":value}"}) void testInvalidObjectValue(String json) { - assertThrows( - IOException.class, - () -> { - try (JsonReader reader = new JsonReader(json)) { - reader.beginObject(); - reader.nextName(); - reader.nextValue(); - } - }); + assertThrows(IOException.class, () -> { + try (JsonReader reader = new JsonReader(json)) { + reader.beginObject(); + reader.nextName(); + reader.nextValue(); + } + }); } @Test diff --git a/components/native-loader/src/main/java/datadog/nativeloader/NativeLoader.java b/components/native-loader/src/main/java/datadog/nativeloader/NativeLoader.java index 8a55eabe570..7b46f96ff9a 100644 --- a/components/native-loader/src/main/java/datadog/nativeloader/NativeLoader.java +++ b/components/native-loader/src/main/java/datadog/nativeloader/NativeLoader.java @@ -298,12 +298,11 @@ private LibFile resolveDynamicImpl( String libName, LibraryLoadingListener[] scopedListeners) throws LibraryLoadException { - SafeLibraryLoadingListener allListeners = - (scopedListeners == null - || scopedListeners == EMPTY_LISTENERS - || scopedListeners.length == 0) - ? this.listeners - : this.listeners.join(scopedListeners); + SafeLibraryLoadingListener allListeners = (scopedListeners == null + || scopedListeners == EMPTY_LISTENERS + || scopedListeners.length == 0) + ? this.listeners + : this.listeners.join(scopedListeners); if (platformSpec.isUnknownOs() || platformSpec.isUnknownArch()) { allListeners.onResolveDynamicFailure(platformSpec, optionalComponent, libName, NO_CAUSE); diff --git a/components/native-loader/src/test/java/datadog/nativeloader/NativeLoaderTest.java b/components/native-loader/src/test/java/datadog/nativeloader/NativeLoaderTest.java index 0a44b91f912..62794abb724 100644 --- a/components/native-loader/src/test/java/datadog/nativeloader/NativeLoaderTest.java +++ b/components/native-loader/src/test/java/datadog/nativeloader/NativeLoaderTest.java @@ -31,7 +31,8 @@ public class NativeLoaderTest { @Test public void preloaded() throws LibraryLoadException { - NativeLoader loader = NativeLoader.builder().preloaded("preloaded1", "preloaded2").build(); + NativeLoader loader = + NativeLoader.builder().preloaded("preloaded1", "preloaded2").build(); assertTrue(loader.isPreloaded("preloaded1")); assertTrue(loader.isPreloaded("preloaded2")); @@ -56,11 +57,10 @@ public void preloaded() throws LibraryLoadException { public void preloaded_listenerSupport() throws LibraryLoadException { TestLibraryLoadingListener sharedListener = new TestLibraryLoadingListener(); - NativeLoader loader = - NativeLoader.builder() - .preloaded("preloaded1", "preloaded2") - .addListener(sharedListener) - .build(); + NativeLoader loader = NativeLoader.builder() + .preloaded("preloaded1", "preloaded2") + .addListener(sharedListener) + .build(); // debatable - but no listener calls just for checking assertTrue(loader.isPreloaded("preloaded1")); @@ -69,10 +69,9 @@ public void preloaded_listenerSupport() throws LibraryLoadException { sharedListener.expectResolvePreloaded("preloaded1"); sharedListener.expectLoadPreloaded("preloaded1"); - TestLibraryLoadingListener scopedListener1 = - new TestLibraryLoadingListener() - .expectResolvePreloaded("preloaded1") - .expectLoadPreloaded("preloaded1"); + TestLibraryLoadingListener scopedListener1 = new TestLibraryLoadingListener() + .expectResolvePreloaded("preloaded1") + .expectLoadPreloaded("preloaded1"); try (LibFile lib = loader.resolveDynamic("preloaded1", scopedListener1)) { lib.load(); @@ -84,10 +83,9 @@ public void preloaded_listenerSupport() throws LibraryLoadException { sharedListener.expectResolvePreloaded("preloaded2"); sharedListener.expectLoadPreloaded("preloaded2"); - TestLibraryLoadingListener scopedListener2 = - new TestLibraryLoadingListener() - .expectResolvePreloaded("preloaded2") - .expectLoadPreloaded("preloaded2"); + TestLibraryLoadingListener scopedListener2 = new TestLibraryLoadingListener() + .expectResolvePreloaded("preloaded2") + .expectLoadPreloaded("preloaded2"); // load is just convenience for resolve & load loader.load("preloaded2", scopedListener2); @@ -112,8 +110,10 @@ public void unsupportedPlatform() { TestLibraryLoadingListener sharedListener = new TestLibraryLoadingListener(); PlatformSpec unsupportedOsSpec = TestPlatformSpec.of(UNSUPPORTED_OS, AARCH64); - NativeLoader loader = - NativeLoader.builder().platformSpec(unsupportedOsSpec).addListener(sharedListener).build(); + NativeLoader loader = NativeLoader.builder() + .platformSpec(unsupportedOsSpec) + .addListener(sharedListener) + .build(); assertFalse(loader.isPlatformSupported()); @@ -167,13 +167,11 @@ public void loadFailure() throws LibraryLoadException { public void resolutionFailure_in_LibraryResolver() { Exception exception = new Exception("boom!"); - NativeLoader loader = - NativeLoader.builder() - .libResolver( - (pathLocator, platformSpec, component, libName) -> { - throw exception; - }) - .build(); + NativeLoader loader = NativeLoader.builder() + .libResolver((pathLocator, platformSpec, component, libName) -> { + throw exception; + }) + .build(); TestLibraryLoadingListener scopedListener = new TestLibraryLoadingListener().expectResolveDynamicFailure("dummy", exception); @@ -189,14 +187,12 @@ public void resolutionFailure_in_PathLocator() { Exception exception = new Exception("boom!"); - NativeLoader loader = - NativeLoader.builder() - .addListener(sharedListener) - .pathLocator( - (comp, path) -> { - throw exception; - }) - .build(); + NativeLoader loader = NativeLoader.builder() + .addListener(sharedListener) + .pathLocator((comp, path) -> { + throw exception; + }) + .build(); sharedListener.expectResolveDynamicFailure("dummy", exception); @@ -265,7 +261,8 @@ public void fromDir_override_linux() throws LibraryLoadException { @Test public void fromDirList() throws LibraryLoadException { - NativeLoader loader = NativeLoader.builder().fromDirs("dne1", "dne2", "test-data").build(); + NativeLoader loader = + NativeLoader.builder().fromDirs("dne1", "dne2", "test-data").build(); try (LibFile lib = loader.resolveDynamic("dummy")) { // loaded directly from directory, so no clean-up required @@ -306,10 +303,9 @@ public void fromDir_load_with_component() { // lib file is a dummy, so fails during loading and linking assertThrows(LibraryLoadException.class, () -> loader.load("comp1", "dummy")); - TestLibraryLoadingListener scopedListener2 = - new TestLibraryLoadingListener() - .expectResolveDynamic("comp2", "dummy") - .expectLoadFailure("comp2", "dummy"); + TestLibraryLoadingListener scopedListener2 = new TestLibraryLoadingListener() + .expectResolveDynamic("comp2", "dummy") + .expectLoadFailure("comp2", "dummy"); assertThrows(LibraryLoadException.class, () -> loader.load("comp2", "dummy", scopedListener2)); @@ -356,7 +352,8 @@ public void fromDirBackedClassLoader_with_subResource() throws IOException, Libr URL[] urls = {new File("test-data").toURL()}; try (URLClassLoader classLoader = new URLClassLoader(urls)) { - NativeLoader loader = NativeLoader.builder().fromClassLoader(classLoader, "resource").build(); + NativeLoader loader = + NativeLoader.builder().fromClassLoader(classLoader, "resource").build(); try (LibFile lib = loader.resolveDynamic("dummy")) { // since there's a normal file, no need to copy to a temp file and clean-up assertRegularFile(lib); @@ -370,7 +367,8 @@ public void fromDirBackedClassLoader_with_subResource_and_comp() throws IOException, LibraryLoadException { // ClassLoader pulling from a directory, so there's still a normal file try (URLClassLoader classLoader = createClassLoader(Paths.get("test-data"))) { - NativeLoader loader = NativeLoader.builder().fromClassLoader(classLoader, "resource").build(); + NativeLoader loader = + NativeLoader.builder().fromClassLoader(classLoader, "resource").build(); try (LibFile lib = loader.resolveDynamic("comp1", "dummy")) { // since there's a normal file, no need to copy to a temp file and clean-up assertRegularFile(lib); @@ -385,13 +383,13 @@ public void fromJarBackedClassLoader() throws IOException, LibraryLoadException Path jar = jar("test-data"); try { try (URLClassLoader classLoader = createClassLoader(jar)) { - NativeLoader loader = NativeLoader.builder().fromClassLoader(classLoader).build(); + NativeLoader loader = + NativeLoader.builder().fromClassLoader(classLoader).build(); - TestLibraryLoadingListener scopedListener = - new TestLibraryLoadingListener() - .expectResolveDynamic("dummy") - .expectTempFileCreated("dummy") - .expectTempFileCleanup("dummy"); + TestLibraryLoadingListener scopedListener = new TestLibraryLoadingListener() + .expectResolveDynamic("dummy") + .expectTempFileCreated("dummy") + .expectTempFileCleanup("dummy"); try (LibFile lib = loader.resolveDynamic("dummy", scopedListener)) { // loaded from a jar, so copied to temp file @@ -411,17 +409,17 @@ public void fromJarBackedClassLoader_load_with_component() Path jar = jar("test-data"); try { try (URLClassLoader classLoader = createClassLoader(jar)) { - NativeLoader loader = NativeLoader.builder().fromClassLoader(classLoader).build(); + NativeLoader loader = + NativeLoader.builder().fromClassLoader(classLoader).build(); // lib file is a dummy, so fails during loading and linking assertThrows(LibraryLoadException.class, () -> loader.load("comp1", "dummy")); - TestLibraryLoadingListener scopedListener2 = - new TestLibraryLoadingListener() - .expectResolveDynamic("comp2", "dummy") - .expectTempFileCreated("comp2", "dummy") - .expectLoadFailure("comp2", "dummy") - .expectTempFileCleanup("comp2", "dummy"); + TestLibraryLoadingListener scopedListener2 = new TestLibraryLoadingListener() + .expectResolveDynamic("comp2", "dummy") + .expectTempFileCreated("comp2", "dummy") + .expectLoadFailure("comp2", "dummy") + .expectTempFileCleanup("comp2", "dummy"); assertThrows( LibraryLoadException.class, () -> loader.load("comp2", "dummy", scopedListener2)); @@ -465,13 +463,14 @@ public void fromJarBackedClassLoader_with_unwritable_tempDir() Files.createDirectories(noWriteDir, posixAttr("r-x------")); try (URLClassLoader classLoader = createClassLoader(jar)) { - NativeLoader loader = - NativeLoader.builder().fromClassLoader(classLoader).tempDir(noWriteDir).build(); + NativeLoader loader = NativeLoader.builder() + .fromClassLoader(classLoader) + .tempDir(noWriteDir) + .build(); - TestLibraryLoadingListener scopedListener = - new TestLibraryLoadingListener() - .expectResolveDynamic("dummy") - .expectTempFileCreationFailure("dummy"); + TestLibraryLoadingListener scopedListener = new TestLibraryLoadingListener() + .expectResolveDynamic("dummy") + .expectTempFileCreationFailure("dummy"); // unable to resolve to a File because tempDir isn't writable assertThrows( @@ -552,19 +551,16 @@ static Path jarHelper(Path dir) throws IOException { Path jarPath = Files.createTempFile(dir.toFile().getName(), ".jar", posixAttr("rwx------")); try (JarOutputStream jarStream = new JarOutputStream(Files.newOutputStream(jarPath))) { - Files.walk(dir) - .filter(path -> !Files.isDirectory(path)) - .forEach( - path -> { - try { - JarEntry jarEntry = new JarEntry(dir.relativize(path).toString()); - jarStream.putNextEntry(jarEntry); - Files.copy(path, jarStream); - jarStream.closeEntry(); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - }); + Files.walk(dir).filter(path -> !Files.isDirectory(path)).forEach(path -> { + try { + JarEntry jarEntry = new JarEntry(dir.relativize(path).toString()); + jarStream.putNextEntry(jarEntry); + Files.copy(path, jarStream); + jarStream.closeEntry(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); } return jarPath; } diff --git a/components/native-loader/src/test/java/datadog/nativeloader/PathLocationHelperTest.java b/components/native-loader/src/test/java/datadog/nativeloader/PathLocationHelperTest.java index dae51056efd..217f59c59bd 100644 --- a/components/native-loader/src/test/java/datadog/nativeloader/PathLocationHelperTest.java +++ b/components/native-loader/src/test/java/datadog/nativeloader/PathLocationHelperTest.java @@ -23,10 +23,9 @@ public void happyPath() throws MalformedURLException { @Test public void throwingException() { Exception expectedCause = new IllegalStateException("wrong!"); - PathLocator throwingPathLocator = - (comp, path) -> { - throw expectedCause; - }; + PathLocator throwingPathLocator = (comp, path) -> { + throw expectedCause; + }; PathLocatorHelper helper = new PathLocatorHelper("test", throwingPathLocator); @@ -48,10 +47,9 @@ public void throwingException() { @Test public void throwingLibraryLoadException() { Exception expectedCause = new LibraryLoadException("test", "wrong!"); - PathLocator throwingPathLocator = - (comp, path) -> { - throw expectedCause; - }; + PathLocator throwingPathLocator = (comp, path) -> { + throw expectedCause; + }; PathLocatorHelper helper = new PathLocatorHelper("test", throwingPathLocator); @@ -75,14 +73,13 @@ public void throwingMultipleExceptions() { Exception firstCause = new IllegalStateException("wrong!"); Exception secondCause = new IllegalStateException("wrong again!"); - PathLocator throwingPathLocator = - (comp, path) -> { - if (path.equals("firstPath")) { - throw firstCause; - } else { - throw secondCause; - } - }; + PathLocator throwingPathLocator = (comp, path) -> { + if (path.equals("firstPath")) { + throw firstCause; + } else { + throw secondCause; + } + }; // on exception, PathLocator returns null, but stores the first exception PathLocatorHelper helper = new PathLocatorHelper("test", throwingPathLocator); diff --git a/components/native-loader/src/test/java/datadog/nativeloader/TestLibraryLoadingListener.java b/components/native-loader/src/test/java/datadog/nativeloader/TestLibraryLoadingListener.java index 65af2e522a0..bb9db260c1e 100644 --- a/components/native-loader/src/test/java/datadog/nativeloader/TestLibraryLoadingListener.java +++ b/components/native-loader/src/test/java/datadog/nativeloader/TestLibraryLoadingListener.java @@ -21,12 +21,10 @@ public final class TestLibraryLoadingListener implements LibraryLoadingListener // By design, listeners are supposed to receive the underlying cause not a LibraryLoadException // directly - static final ThrowableCheck NOT_LIB_LOAD_EXCEPTION = - (t) -> { - assertFalse( - t instanceof LibraryLoadException, - "LibraryLoadException - instead of underlying cause"); - }; + static final ThrowableCheck NOT_LIB_LOAD_EXCEPTION = (t) -> { + assertFalse( + t instanceof LibraryLoadException, "LibraryLoadException - instead of underlying cause"); + }; public TestLibraryLoadingListener() { this.checks = new LinkedList<>(); @@ -51,18 +49,17 @@ public TestLibraryLoadingListener expectResolveDynamic( } private TestLibraryLoadingListener expectResolveDynamic(LibCheck libCheck) { - return this.addCheck( - new Check("onResolveDynamic %s", libCheck) { - @Override - public void onResolveDynamic( - PlatformSpec platformSpec, - String optionalComponent, - String libName, - boolean isPreloaded, - URL optionalUrl) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - } - }); + return this.addCheck(new Check("onResolveDynamic %s", libCheck) { + @Override + public void onResolveDynamic( + PlatformSpec platformSpec, + String optionalComponent, + String libName, + boolean isPreloaded, + URL optionalUrl) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + } + }); } public TestLibraryLoadingListener expectResolvePreloaded(String expectedLibName) { @@ -70,19 +67,18 @@ public TestLibraryLoadingListener expectResolvePreloaded(String expectedLibName) } private TestLibraryLoadingListener expectResolvePreloaded(LibCheck libCheck) { - return this.addCheck( - new Check("onResolveDynamic:preloaded %s", libCheck) { - @Override - public void onResolveDynamic( - PlatformSpec platformSpec, - String optionalComponent, - String libName, - boolean isPreloaded, - URL optionalUrl) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - assertTrue(isPreloaded); - } - }); + return this.addCheck(new Check("onResolveDynamic:preloaded %s", libCheck) { + @Override + public void onResolveDynamic( + PlatformSpec platformSpec, + String optionalComponent, + String libName, + boolean isPreloaded, + URL optionalUrl) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + assertTrue(isPreloaded); + } + }); } public TestLibraryLoadingListener expectResolveDynamicFailure(String expectedLibName) { @@ -101,18 +97,17 @@ private TestLibraryLoadingListener expectResolveDynamicFailure(LibCheck libCheck private TestLibraryLoadingListener expectResolveDynamicFailure( LibCheck libCheck, ThrowableCheck throwableCheck) { - return this.addCheck( - new Check("onResolveDynamicFailure %s", libCheck) { - @Override - public void onResolveDynamicFailure( - PlatformSpec platformSpec, - String optionalComponent, - String libName, - Throwable optionalCause) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - throwableCheck.assertMatches(optionalCause); - } - }); + return this.addCheck(new Check("onResolveDynamicFailure %s", libCheck) { + @Override + public void onResolveDynamicFailure( + PlatformSpec platformSpec, + String optionalComponent, + String libName, + Throwable optionalCause) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + throwableCheck.assertMatches(optionalCause); + } + }); } public TestLibraryLoadingListener expectLoad(String expectedLibName) { @@ -124,18 +119,17 @@ public TestLibraryLoadingListener expectLoad(String expectedComponent, String ex } private TestLibraryLoadingListener expectLoad(LibCheck libCheck) { - return this.addCheck( - new Check("onLoad %s", libCheck) { - @Override - public void onLoad( - PlatformSpec platformSpec, - String optionalComponent, - String libName, - boolean isPreloaded, - Path optionalLibPath) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - } - }); + return this.addCheck(new Check("onLoad %s", libCheck) { + @Override + public void onLoad( + PlatformSpec platformSpec, + String optionalComponent, + String libName, + boolean isPreloaded, + Path optionalLibPath) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + } + }); } public TestLibraryLoadingListener expectLoadPreloaded(String expectedLibName) { @@ -143,19 +137,18 @@ public TestLibraryLoadingListener expectLoadPreloaded(String expectedLibName) { } private TestLibraryLoadingListener expectLoadPreloaded(LibCheck libCheck) { - return this.addCheck( - new Check("onLoad:preloaded %s", libCheck) { - @Override - public void onLoad( - PlatformSpec platformSpec, - String optionalComponent, - String libName, - boolean isPreloaded, - Path optionalLibPath) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - assertTrue(isPreloaded); - } - }); + return this.addCheck(new Check("onLoad:preloaded %s", libCheck) { + @Override + public void onLoad( + PlatformSpec platformSpec, + String optionalComponent, + String libName, + boolean isPreloaded, + Path optionalLibPath) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + assertTrue(isPreloaded); + } + }); } public TestLibraryLoadingListener expectLoadFailure(String expectedLibName) { @@ -173,18 +166,17 @@ private TestLibraryLoadingListener expectLoadFailure(LibCheck libCheck) { private TestLibraryLoadingListener expectLoadFailure( LibCheck libCheck, ThrowableCheck throwableCheck) { - return this.addCheck( - new Check("onLoadFailure %s", libCheck) { - @Override - public void onLoadFailure( - PlatformSpec platformSpec, - String optionalComponent, - String libName, - Throwable optionalCause) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - throwableCheck.assertMatches(optionalCause); - } - }); + return this.addCheck(new Check("onLoadFailure %s", libCheck) { + @Override + public void onLoadFailure( + PlatformSpec platformSpec, + String optionalComponent, + String libName, + Throwable optionalCause) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + throwableCheck.assertMatches(optionalCause); + } + }); } public TestLibraryLoadingListener expectTempFileCreated(String expectedLibName) { @@ -197,15 +189,14 @@ public TestLibraryLoadingListener expectTempFileCreated( } private TestLibraryLoadingListener expectTempFileCreated(LibCheck libCheck) { - return this.addCheck( - new Check("onTempFileCreated %s", libCheck) { - @Override - public void onTempFileCreated( - PlatformSpec platformSpec, String optionalComponent, String libName, Path tempFile) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - assertNotNull(tempFile); - } - }); + return this.addCheck(new Check("onTempFileCreated %s", libCheck) { + @Override + public void onTempFileCreated( + PlatformSpec platformSpec, String optionalComponent, String libName, Path tempFile) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + assertNotNull(tempFile); + } + }); } public TestLibraryLoadingListener expectTempFileCreationFailure(String expectedLibName) { @@ -218,21 +209,20 @@ private TestLibraryLoadingListener expectTempFileCreationFailure(LibCheck libChe private TestLibraryLoadingListener expectTempFileCreationFailure( LibCheck libCheck, ThrowableCheck throwableCheck) { - return this.addCheck( - new Check("onTempFileCreationFailure %s", libCheck) { - @Override - public void onTempFileCreationFailure( - PlatformSpec platformSpec, - String optionalComponent, - String libName, - Path tempDir, - String libExt, - Throwable optionalCause) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - assertNotNull(tempDir); - assertNotNull(libExt); - } - }); + return this.addCheck(new Check("onTempFileCreationFailure %s", libCheck) { + @Override + public void onTempFileCreationFailure( + PlatformSpec platformSpec, + String optionalComponent, + String libName, + Path tempDir, + String libExt, + Throwable optionalCause) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + assertNotNull(tempDir); + assertNotNull(libExt); + } + }); } public TestLibraryLoadingListener expectTempFileCleanup(String expectedLibName) { @@ -245,15 +235,14 @@ public TestLibraryLoadingListener expectTempFileCleanup( } TestLibraryLoadingListener expectTempFileCleanup(LibCheck libCheck) { - return this.addCheck( - new Check("onTempFileCreationCleanup %s", libCheck) { - @Override - public void onTempFileCleanup( - PlatformSpec platformSpec, String optionalComponent, String libName, Path tempFile) { - libCheck.assertMatches(platformSpec, optionalComponent, libName); - assertNotNull(tempFile); - } - }); + return this.addCheck(new Check("onTempFileCreationCleanup %s", libCheck) { + @Override + public void onTempFileCleanup( + PlatformSpec platformSpec, String optionalComponent, String libName, Path tempFile) { + libCheck.assertMatches(platformSpec, optionalComponent, libName); + assertNotNull(tempFile); + } + }); } public TestLibraryLoadingListener copy() { @@ -282,10 +271,8 @@ public void onResolveDynamic( String libName, boolean isPreloaded, URL optionalUrl) { - this.nextCheck( - check -> - check.onResolveDynamic( - platformSpec, optionalComponent, libName, isPreloaded, optionalUrl)); + this.nextCheck(check -> + check.onResolveDynamic(platformSpec, optionalComponent, libName, isPreloaded, optionalUrl)); } @Override @@ -294,9 +281,8 @@ public void onResolveDynamicFailure( String optionalComponent, String libName, Throwable optionalCause) { - this.nextCheck( - check -> - check.onResolveDynamicFailure(platformSpec, optionalComponent, libName, optionalCause)); + this.nextCheck(check -> + check.onResolveDynamicFailure(platformSpec, optionalComponent, libName, optionalCause)); } @Override @@ -306,9 +292,8 @@ public void onLoad( String libName, boolean isPreloaded, Path optionalLibPath) { - this.nextCheck( - check -> - check.onLoad(platformSpec, optionalComponent, libName, isPreloaded, optionalLibPath)); + this.nextCheck(check -> + check.onLoad(platformSpec, optionalComponent, libName, isPreloaded, optionalLibPath)); } @Override @@ -336,10 +321,8 @@ public void onTempFileCreationFailure( Path tempDir, String libExt, Throwable optionalCause) { - this.nextCheck( - check -> - check.onTempFileCreationFailure( - platformSpec, optionalComponent, libName, tempDir, libExt, optionalCause)); + this.nextCheck(check -> check.onTempFileCreationFailure( + platformSpec, optionalComponent, libName, tempDir, libExt, optionalCause)); } @Override diff --git a/dd-java-agent/agent-aiguard/src/main/java/com/datadog/aiguard/AIGuardInternal.java b/dd-java-agent/agent-aiguard/src/main/java/com/datadog/aiguard/AIGuardInternal.java index d921be448d8..9bcc15e0214 100644 --- a/dd-java-agent/agent-aiguard/src/main/java/com/datadog/aiguard/AIGuardInternal.java +++ b/dd-java-agent/agent-aiguard/src/main/java/com/datadog/aiguard/AIGuardInternal.java @@ -100,19 +100,19 @@ public static void install() { if (isBlank(endpoint)) { endpoint = String.format("https://app.%s/api/v2/ai-guard", config.getSite()); } - final Map headers = - mapOf( - "DD-API-KEY", - apiKey, - "DD-APPLICATION-KEY", - appKey, - "DD-AI-GUARD-VERSION", - TRACER_VERSION, - "DD-AI-GUARD-SOURCE", - "SDK", - "DD-AI-GUARD-LANGUAGE", - "jvm"); - final HttpUrl url = HttpUrl.get(endpoint).newBuilder().addPathSegment("evaluate").build(); + final Map headers = mapOf( + "DD-API-KEY", + apiKey, + "DD-APPLICATION-KEY", + appKey, + "DD-AI-GUARD-VERSION", + TRACER_VERSION, + "DD-AI-GUARD-SOURCE", + "SDK", + "DD-AI-GUARD-LANGUAGE", + "jvm"); + final HttpUrl url = + HttpUrl.get(endpoint).newBuilder().addPathSegment("evaluate").build(); final int timeout = config.getAiGuardTimeout(); final OkHttpClient client = buildClient(url, timeout); Installer.install(new AIGuardInternal(url, headers, client)); @@ -210,7 +210,9 @@ private static String getToolName(final Message current, final List mes if (message.getToolCalls() != null) { for (final ToolCall toolCall : message.getToolCalls()) { if (toolCall.getId().equals(id)) { - return toolCall.getFunction() == null ? null : toolCall.getFunction().getName(); + return toolCall.getFunction() == null + ? null + : toolCall.getFunction().getName(); } } } @@ -297,10 +299,9 @@ public Evaluation evaluate(final List messages, final Options options) final Map metaStruct = new HashMap<>(2); metaStruct.put(META_STRUCT_MESSAGES, messagesForMetaStruct(messages)); span.setMetaStruct(META_STRUCT_TAG, metaStruct); - final Request.Builder request = - new Request.Builder() - .url(url) - .method("POST", new MoshiJsonRequestBody(moshi, messages, meta)); + final Request.Builder request = new Request.Builder() + .url(url) + .method("POST", new MoshiJsonRequestBody(moshi, messages, meta)); headers.forEach(request::header); try (final Response response = client.newCall(request.build()).execute()) { final Map result = parseResponseBody(response); @@ -347,9 +348,8 @@ public Evaluation evaluate(final List messages, final Options options) throw e; } catch (final Exception e) { WafMetricCollector.get().aiGuardError(); - final AIGuardClientError error = - new AIGuardClientError( - "AI Guard service returned unexpected response: " + e.getMessage(), e); + final AIGuardClientError error = new AIGuardClientError( + "AI Guard service returned unexpected response: " + e.getMessage(), e); span.addThrowable(error); throw error; } finally { diff --git a/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/buffer/InjectingPipeOutputStreamBenchmark.java b/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/buffer/InjectingPipeOutputStreamBenchmark.java index 8f52f13ee86..f9ee510d18b 100644 --- a/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/buffer/InjectingPipeOutputStreamBenchmark.java +++ b/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/buffer/InjectingPipeOutputStreamBenchmark.java @@ -49,9 +49,8 @@ public class InjectingPipeOutputStreamBenchmark { @Benchmark public void withPipe() throws Exception { - try (final PrintWriter out = - new PrintWriter( - new InjectingPipeOutputStream(new ByteArrayOutputStream(), marker, content))) { + try (final PrintWriter out = new PrintWriter( + new InjectingPipeOutputStream(new ByteArrayOutputStream(), marker, content))) { htmlContent.forEach(out::println); } } diff --git a/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java b/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java index e655c3213cd..7cca32e1a26 100644 --- a/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java +++ b/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java @@ -52,12 +52,10 @@ public class HttpServerDecoratorBenchmark { @Setup(Level.Trial) public void setUp() { request = new Request("GET", URI.create(url)); - CoreTracer tracer = - CoreTracer.builder() - .strictTraceWrites( - true) // Avoid any extra bookkeeping for traces since we write directly - .writer(new NoOpWriter()) // Avoid writing - .build(); + CoreTracer tracer = CoreTracer.builder() + .strictTraceWrites(true) // Avoid any extra bookkeeping for traces since we write directly + .writer(new NoOpWriter()) // Avoid writing + .build(); GlobalTracer.forceRegister(tracer); decorator = new BenchmarkHttpServerDecorator(); Context context = decorator.startSpan(emptyMap(), root()); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 1180c983990..8cb7333f63a 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -272,9 +272,8 @@ public static void start( appSecFullyDisabled = isFullyDisabled(AgentFeature.APPSEC); iastEnabled = isFeatureEnabled(AgentFeature.IAST); iastFullyDisabled = isIastFullyDisabled(appSecEnabled); - remoteConfigEnabled = - isFeatureEnabled(AgentFeature.REMOTE_CONFIG) - || isFeatureEnabled(AgentFeature.DEPRECATED_REMOTE_CONFIG); + remoteConfigEnabled = isFeatureEnabled(AgentFeature.REMOTE_CONFIG) + || isFeatureEnabled(AgentFeature.DEPRECATED_REMOTE_CONFIG); cwsEnabled = isFeatureEnabled(AgentFeature.CWS); telemetryEnabled = isFeatureEnabled(AgentFeature.TELEMETRY); dynamicInstrumentationEnabled = isFeatureEnabled(AgentFeature.DYNAMIC_INSTRUMENTATION); @@ -604,19 +603,16 @@ public void run() { * to load classes being transformed. To avoid this we start a thread here that calls the callback. * This seems to resolve this problem. */ - final Thread thread = - newAgentThread( - agentThread(), - new Runnable() { - @Override - public void run() { - try { - execute(); - } catch (final Exception e) { - log.error("Failed to run {}", agentThread(), e); - } - } - }); + final Thread thread = newAgentThread(agentThread(), new Runnable() { + @Override + public void run() { + try { + execute(); + } catch (final Exception e) { + log.error("Failed to run {}", agentThread(), e); + } + } + }); thread.start(); } @@ -840,9 +836,8 @@ private static synchronized void installDatadogTracer( // install global tracer final Class tracerInstallerClass = AGENT_CLASSLOADER.loadClass("datadog.trace.agent.tooling.TracerInstaller"); - final Method tracerInstallerMethod = - tracerInstallerClass.getMethod( - "installGlobalTracer", scoClass, ProfilingContextIntegration.class); + final Method tracerInstallerMethod = tracerInstallerClass.getMethod( + "installGlobalTracer", scoClass, ProfilingContextIntegration.class); tracerInstallerMethod.invoke(null, sco, createProfilingContextIntegration()); } catch (final FatalAgentMisconfigurationError ex) { throw ex; @@ -1461,28 +1456,25 @@ private static void startCwsAgent() { return; } log.debug("Scheduling scope event factory registration"); - WithGlobalTracer.registerOrExecute( - new WithGlobalTracer.Callback() { - @Override - public void withTracer(TracerAPI tracer) { - log.debug("Registering CWS scope tracker"); - try { - ScopeListener scopeListener = - (ScopeListener) - AGENT_CLASSLOADER - .loadClass("datadog.cws.tls.TlsScopeListener") - .getDeclaredConstructor() - .newInstance(); - tracer.addScopeListener(scopeListener); - log.debug("Scope event factory {} has been registered", scopeListener); - } catch (Throwable e) { - if (e instanceof InvocationTargetException) { - e = e.getCause(); - } - log.debug("CWS is not available. {}", e.getMessage()); - } + WithGlobalTracer.registerOrExecute(new WithGlobalTracer.Callback() { + @Override + public void withTracer(TracerAPI tracer) { + log.debug("Registering CWS scope tracker"); + try { + ScopeListener scopeListener = (ScopeListener) AGENT_CLASSLOADER + .loadClass("datadog.cws.tls.TlsScopeListener") + .getDeclaredConstructor() + .newInstance(); + tracer.addScopeListener(scopeListener); + log.debug("Scope event factory {} has been registered", scopeListener); + } catch (Throwable e) { + if (e instanceof InvocationTargetException) { + e = e.getCause(); } - }); + log.debug("CWS is not available. {}", e.getMessage()); + } + } + }); } /** @@ -1493,11 +1485,10 @@ private static ProfilingContextIntegration createProfilingContextIntegration() { if (Config.get().isProfilingEnabled()) { if (Config.get().isDatadogProfilerEnabled() && !OperatingSystem.isWindows()) { try { - return (ProfilingContextIntegration) - AGENT_CLASSLOADER - .loadClass("com.datadog.profiling.ddprof.DatadogProfilingIntegration") - .getDeclaredConstructor() - .newInstance(); + return (ProfilingContextIntegration) AGENT_CLASSLOADER + .loadClass("com.datadog.profiling.ddprof.DatadogProfilingIntegration") + .getDeclaredConstructor() + .newInstance(); } catch (Throwable t) { log.debug("ddprof-based profiling context labeling not available. {}", t.getMessage()); } @@ -1505,11 +1496,10 @@ private static ProfilingContextIntegration createProfilingContextIntegration() { if (Config.get().isProfilingTimelineEventsEnabled()) { // important: note that this will not initialise JFR until onStart is called try { - return (ProfilingContextIntegration) - AGENT_CLASSLOADER - .loadClass("com.datadog.profiling.controller.openjdk.JFREventContextIntegration") - .getDeclaredConstructor() - .newInstance(); + return (ProfilingContextIntegration) AGENT_CLASSLOADER + .loadClass("com.datadog.profiling.controller.openjdk.JFREventContextIntegration") + .getDeclaredConstructor() + .newInstance(); } catch (Throwable t) { log.debug("JFR event-based profiling context labeling not available. {}", t.getMessage()); } @@ -1558,11 +1548,10 @@ private static boolean startProfilingAgent( private static void initProfilerContext() { log.debug("Scheduling profiler context initialization"); - WithGlobalTracer.registerOrExecute( - tracer -> { - log.debug("Initializing profiler context integration"); - tracer.getProfilingContext().onStart(); - }); + WithGlobalTracer.registerOrExecute(tracer -> { + log.debug("Initializing profiler context integration"); + tracer.getProfilingContext().onStart(); + }); } private static boolean isAwsLambdaRuntime() { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/AgentJarIndex.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/AgentJarIndex.java index 5350933897c..48ade080f1d 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/AgentJarIndex.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/AgentJarIndex.java @@ -115,16 +115,15 @@ void buildIndex() throws IOException { .map(resourcesDir::relativize) .sorted() .filter(entry -> entry.getNameCount() >= 2) - .forEach( - entry -> { - String prefix = entry.getName(0) + "/"; - int prefixId = prefixIdFor(prefix); - String entryKey = computeEntryKey(entry.subpath(1, entry.getNameCount())); - if (null != entryKey && seen.add(prefixId + "\0" + entryKey)) { - collectedEntryKeys.add(entryKey); - collectedPrefixIds.add(prefixId); - } - }); + .forEach(entry -> { + String prefix = entry.getName(0) + "/"; + int prefixId = prefixIdFor(prefix); + String entryKey = computeEntryKey(entry.subpath(1, entry.getNameCount())); + if (null != entryKey && seen.add(prefixId + "\0" + entryKey)) { + collectedEntryKeys.add(entryKey); + collectedPrefixIds.add(prefixId); + } + }); } for (int i = 0; i < collectedEntryKeys.size(); i++) { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/InitializationTelemetry.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/InitializationTelemetry.java index e55ceb4f270..73f43de1943 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/InitializationTelemetry.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/InitializationTelemetry.java @@ -186,12 +186,11 @@ public void markIncomplete() { private final MethodHandle findBoundHandle(String name, Class paramType) { try { - MethodHandle virtualHandle = - MethodHandles.publicLookup() - .findVirtual( - bootstrapInitTelemetry.getClass(), - name, - MethodType.methodType(void.class, paramType)); + MethodHandle virtualHandle = MethodHandles.publicLookup() + .findVirtual( + bootstrapInitTelemetry.getClass(), + name, + MethodType.methodType(void.class, paramType)); return virtualHandle.bindTo(bootstrapInitTelemetry); } catch (NoSuchMethodException | IllegalAccessException e) { @@ -201,10 +200,9 @@ private final MethodHandle findBoundHandle(String name, Class paramType) { private final MethodHandle findBoundHandle(String name) { try { - MethodHandle virtualHandle = - MethodHandles.publicLookup() - .findVirtual( - bootstrapInitTelemetry.getClass(), name, MethodType.methodType(void.class)); + MethodHandle virtualHandle = MethodHandles.publicLookup() + .findVirtual( + bootstrapInitTelemetry.getClass(), name, MethodType.methodType(void.class)); return virtualHandle.bindTo(bootstrapInitTelemetry); } catch (NoSuchMethodException | IllegalAccessException e) { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java index 2d73624e9f6..46b358e4674 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/benchmark/StaticEventLogger.java @@ -92,12 +92,10 @@ public static void end(String event) { private static String getAgentVersion() { final StringBuilder sb = new StringBuilder(); - try (final BufferedReader reader = - new BufferedReader( - new InputStreamReader( - Objects.requireNonNull( - StaticEventLogger.class.getResourceAsStream("/dd-java-agent.version")), - StandardCharsets.UTF_8))) { + try (final BufferedReader reader = new BufferedReader(new InputStreamReader( + Objects.requireNonNull( + StaticEventLogger.class.getResourceAsStream("/dd-java-agent.version")), + StandardCharsets.UTF_8))) { for (int c = reader.read(); c != -1; c = reader.read()) { sb.append((char) c); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/blocking/BlockingActionHelper.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/blocking/BlockingActionHelper.java index e72a86a7098..38d053109d4 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/blocking/BlockingActionHelper.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/blocking/BlockingActionHelper.java @@ -151,13 +151,11 @@ public static String getContentType(TemplateType type) { return null; } - private static final Pattern MEDIA_TYPE_PATTERN = - Pattern.compile( - "(?x)^[\\ \\t]* ( [!\\#$%&'*+\\-.^_`|~\\da-zA-Z]+/[!\\#$%&'*+\\-.^_`|~\\da-zA-Z]+ )"); + private static final Pattern MEDIA_TYPE_PATTERN = Pattern.compile( + "(?x)^[\\ \\t]* ( [!\\#$%&'*+\\-.^_`|~\\da-zA-Z]+/[!\\#$%&'*+\\-.^_`|~\\da-zA-Z]+ )"); - private static final Pattern QUALITY_PATTERN = - Pattern.compile( - "(?x);[\\ \\t]* q=( (?:0(?:\\.\\d{0,3})?) | (?:1(?:\\.0{0,3})?) ) (?:$|,|;|[\\ \\t])"); + private static final Pattern QUALITY_PATTERN = Pattern.compile( + "(?x);[\\ \\t]* q=( (?:0(?:\\.\\d{0,3})?) | (?:1(?:\\.0{0,3})?) ) (?:$|,|;|[\\ \\t])"); private static String nextMediaRange(String s, int[] pos, float[] quality) { int initPos = pos[0]; @@ -227,9 +225,8 @@ public static void reset(Config config) { } private static byte[] readDefaultTemplate(String ext) { - try (InputStream is = - getSystemClassLoader() - .getResourceAsStream("datadog/trace/bootstrap/blocking/template." + ext)) { + try (InputStream is = getSystemClassLoader() + .getResourceAsStream("datadog/trace/bootstrap/blocking/template." + ext)) { if (is == null) { log.error("Could not open default {} template", ext); return new byte[] {'e', 'r', 'r', 'o', 'r'}; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java index c72533768ef..49a65475a36 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java @@ -32,21 +32,20 @@ public abstract class BaseDecorator { protected static final int UNSET_PORT = 0; - private static final QualifiedClassNameCache CLASS_NAMES = - new QualifiedClassNameCache( - new Function, CharSequence>() { - @Override - public String apply(Class clazz) { - String simpleName = clazz.getSimpleName(); - if (simpleName.isEmpty()) { - String name = clazz.getName(); - int start = name.lastIndexOf('.'); - return name.substring(start + 1); - } - return simpleName; - } - }, - Functions.PrefixJoin.of(".")); + private static final QualifiedClassNameCache CLASS_NAMES = new QualifiedClassNameCache( + new Function, CharSequence>() { + @Override + public String apply(Class clazz) { + String simpleName = clazz.getSimpleName(); + if (simpleName.isEmpty()) { + String name = clazz.getName(); + int start = name.lastIndexOf('.'); + return name.substring(start + 1); + } + return simpleName; + } + }, + Functions.PrefixJoin.of(".")); protected final boolean traceAnalyticsEnabled; protected final double traceAnalyticsSampleRate; @@ -60,18 +59,15 @@ protected BaseDecorator() { final Config config = Config.get(); final String[] instrumentationNames = instrumentationNames(); - this.traceAnalyticsEnabled = - instrumentationNames.length > 0 - && config.isTraceAnalyticsIntegrationEnabled( - traceAnalyticsDefault(), instrumentationNames); + this.traceAnalyticsEnabled = instrumentationNames.length > 0 + && config.isTraceAnalyticsIntegrationEnabled(traceAnalyticsDefault(), instrumentationNames); this.traceAnalyticsSampleRate = (double) config.getInstrumentationAnalyticsSampleRate(instrumentationNames); - this.traceAnalyticsEntry = - this.traceAnalyticsEnabled - ? TagMap.Entry.create(DDTags.ANALYTICS_SAMPLE_RATE, traceAnalyticsSampleRate) - : null; + this.traceAnalyticsEntry = this.traceAnalyticsEnabled + ? TagMap.Entry.create(DDTags.ANALYTICS_SAMPLE_RATE, traceAnalyticsSampleRate) + : null; } protected abstract String[] instrumentationNames(); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java index fa105776113..d20a749251c 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java @@ -29,7 +29,8 @@ protected static class NamingEntry { private final String dbType; private NamingEntry(String rawDbType) { - final NamingSchema.ForDatabase schema = SpanNaming.instance().namingSchema().database(); + final NamingSchema.ForDatabase schema = + SpanNaming.instance().namingSchema().database(); this.dbType = schema.normalizedName(rawDbType); this.service = schema.service(dbType); this.operation = UTF8BytesString.create(schema.operation(dbType)); @@ -103,10 +104,9 @@ public String dbService(final String dbType, final String instanceName) { public String dbClientService(final String instanceName) { String service = null; if (instanceName != null && Config.get().isDbClientSplitByInstance()) { - service = - Config.get().isDbClientSplitByInstanceTypeSuffix() - ? instanceName + "-" + dbType() - : instanceName; + service = Config.get().isDbClientSplitByInstanceTypeSuffix() + ? instanceName + "-" + dbType() + : instanceName; } return service; } @@ -121,10 +121,9 @@ public void onStatement(final AgentSpan span, final CharSequence statement) { */ public void onRawStatement(AgentSpan span, String sql) { if (Config.get().isAppSecRaspEnabled() && sql != null && !sql.isEmpty()) { - BiFunction> sqlQueryCallback = - AgentTracer.get() - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.databaseSqlQuery()); + BiFunction> sqlQueryCallback = AgentTracer.get() + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.databaseSqlQuery()); if (sqlQueryCallback != null) { RequestContext ctx = span.getRequestContext(); if (ctx != null) { @@ -149,10 +148,9 @@ protected void processDatabaseType(AgentSpan span, String dbType) { postProcessServiceAndOperationName(span, namingEntry); if (Config.get().isAppSecRaspEnabled() && dbType != null) { - BiConsumer connectDbCallback = - AgentTracer.get() - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.databaseConnection()); + BiConsumer connectDbCallback = AgentTracer.get() + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.databaseConnection()); if (connectDbCallback != null) { RequestContext ctx = span.getRequestContext(); if (ctx != null) { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecorator.java index df159f8f2e6..2fb90281e49 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecorator.java @@ -88,14 +88,13 @@ protected boolean shouldSetResourceName() { } private final DataStreamsTransactionTracker.TransactionSourceReader - DSM_TRANSACTION_SOURCE_READER = - (source, headerName) -> { - try { - return getRequestHeader((REQUEST) source, headerName); - } catch (Throwable ignored) { - return null; - } - }; + DSM_TRANSACTION_SOURCE_READER = (source, headerName) -> { + try { + return getRequestHeader((REQUEST) source, headerName); + } catch (Throwable ignored) { + return null; + } + }; public final void onRequest(final AgentSpan span, final REQUEST request) { try { @@ -243,10 +242,9 @@ protected void onHttpClientRequest(final AgentSpan span, final String url) { if (url == null) { return; } - final BiFunction> requestCb = - AgentTracer.get() - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.httpClientRequest()); + final BiFunction> requestCb = AgentTracer.get() + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.httpClientRequest()); if (requestCb == null) { return; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java index 76b46eacc9c..863dc48c5d8 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java @@ -229,14 +229,13 @@ private void resetServiceNameIfUnderInferredProxy(Context parentContext, AgentSp } private final DataStreamsTransactionTracker.TransactionSourceReader - DSM_TRANSACTION_SOURCE_READER = - (source, headerName) -> { - try { - return getRequestHeader((REQUEST) source, headerName); - } catch (Throwable ignored) { - return null; - } - }; + DSM_TRANSACTION_SOURCE_READER = (source, headerName) -> { + try { + return getRequestHeader((REQUEST) source, headerName); + } catch (Throwable ignored) { + return null; + } + }; public final void onRequest( final AgentSpan span, @@ -585,11 +584,10 @@ private Flow callIGCallbackRequestHeaders(AgentSpan span, REQUEST_CARRIER return Flow.ResultFlow.empty(); } if (cbp != null) { - IGKeyClassifier igKeyClassifier = - IGKeyClassifier.create( - requestContext, - cbp.getCallback(EVENTS.requestHeader()), - cbp.getCallback(EVENTS.requestHeaderDone())); + IGKeyClassifier igKeyClassifier = IGKeyClassifier.create( + requestContext, + cbp.getCallback(EVENTS.requestHeader()), + cbp.getCallback(EVENTS.requestHeaderDone())); if (null != igKeyClassifier) { getter.forEachKey(carrier, igKeyClassifier); return igKeyClassifier.done(); @@ -641,11 +639,10 @@ public Flow callIGCallbackResponseAndHeaders( if (contextVisitor == null) { return Flow.ResultFlow.empty(); } - IGKeyClassifier igKeyClassifier = - IGKeyClassifier.create( - requestContext, - cbp.getCallback(EVENTS.responseHeader()), - cbp.getCallback(EVENTS.responseHeaderDone())); + IGKeyClassifier igKeyClassifier = IGKeyClassifier.create( + requestContext, + cbp.getCallback(EVENTS.responseHeader()), + cbp.getCallback(EVENTS.responseHeaderDone())); if (null != igKeyClassifier) { contextVisitor.forEachKey(carrier, igKeyClassifier); return igKeyClassifier.done(); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/MessagingClientDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/MessagingClientDecorator.java index 1941dae7a2e..da43b9ca44f 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/MessagingClientDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/MessagingClientDecorator.java @@ -12,9 +12,8 @@ public abstract class MessagingClientDecorator extends ClientDecorator { protected MessagingClientDecorator() { final Config config = Config.get(); final String[] instrumentationNames = instrumentationNames(); - this.endToEndDurationsEnabled = - instrumentationNames.length > 0 - && config.isEndToEndDurationEnabled(endToEndDurationsDefault(), instrumentationNames); + this.endToEndDurationsEnabled = instrumentationNames.length > 0 + && config.isEndToEndDurationEnabled(endToEndDurationsDefault(), instrumentationNames); } protected boolean endToEndDurationsDefault() { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UrlConnectionDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UrlConnectionDecorator.java index a3c8be6dd5b..f070505b15e 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UrlConnectionDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UrlConnectionDecorator.java @@ -18,10 +18,8 @@ public class UrlConnectionDecorator extends UriBasedClientDecorator { private static final DDCache CACHE = DDCaches.newFixedSizeCache(16); - private static final Function ADDER = - protocol -> - UTF8BytesString.create( - SpanNaming.instance().namingSchema().client().operationForProtocol(protocol)); + private static final Function ADDER = protocol -> UTF8BytesString.create( + SpanNaming.instance().namingSchema().client().operationForProtocol(protocol)); private static final Logger LOGGER = LoggerFactory.getLogger(UrlConnectionDecorator.class); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/WebsocketDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/WebsocketDecorator.java index df2f4b6ddac..61f6a21ad96 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/WebsocketDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/WebsocketDecorator.java @@ -181,14 +181,13 @@ private AgentSpan onFrameStart( if (useDedicatedTraces || !traceStarter) { // the link is not added if the user wants to have receive frames on the same trace as the // handshake - wsSpan.addLink( - SpanLink.from( - inheritSampling - ? handshakeSpan.spanContext() - : new NotSampledSpanContext(handshakeSpan.spanContext()), - SpanLink.DEFAULT_FLAGS, - "", - linkAttributes)); + wsSpan.addLink(SpanLink.from( + inheritSampling + ? handshakeSpan.spanContext() + : new NotSampledSpanContext(handshakeSpan.spanContext()), + SpanLink.DEFAULT_FLAGS, + "", + linkAttributes)); } } return wsSpan; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/http/ClientIpAddressResolver.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/http/ClientIpAddressResolver.java index 6a4535ba9ac..3b875efa8cc 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/http/ClientIpAddressResolver.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/http/ClientIpAddressResolver.java @@ -248,33 +248,32 @@ public InetAddress apply(String headerValue) { state = ForwardedParseState.VALUE_TOKEN; } break; - case VALUE_TOKEN: - { - int tokenEnd; - if (c == ' ' || c == ';' || c == ',') { - tokenEnd = pos; - } else if (pos + 1 == end) { - tokenEnd = end; - } else { - break; - } + case VALUE_TOKEN: { + int tokenEnd; + if (c == ' ' || c == ';' || c == ',') { + tokenEnd = pos; + } else if (pos + 1 == end) { + tokenEnd = end; + } else { + break; + } - if (considerValue) { - InetAddress ipAddr = - parseIpAddressAndMaybePort(headerValue.substring(start, tokenEnd)); - if (ipAddr != null) { - if (isIpAddrPrivate(ipAddr)) { - if (resultPrivate == null) { - resultPrivate = ipAddr; - } - } else { - return ipAddr; + if (considerValue) { + InetAddress ipAddr = + parseIpAddressAndMaybePort(headerValue.substring(start, tokenEnd)); + if (ipAddr != null) { + if (isIpAddrPrivate(ipAddr)) { + if (resultPrivate == null) { + resultPrivate = ipAddr; } + } else { + return ipAddr; } } - state = ForwardedParseState.BETWEEN; - break; } + state = ForwardedParseState.BETWEEN; + break; + } case VALUE_QUOTED: if (c == '"') { if (considerValue) { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/iast/NamedContext.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/iast/NamedContext.java index 9132b703bf3..011b9be00dd 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/iast/NamedContext.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/iast/NamedContext.java @@ -55,12 +55,19 @@ public void setCurrentName(@Nullable final String name) {} } private static class NamedContextImpl extends NamedContext { - @Nonnull private final PropagationModule module; - @Nonnull private final Source source; - @Nullable private String currentName; + @Nonnull + private final PropagationModule module; + + @Nonnull + private final Source source; + + @Nullable + private String currentName; private boolean fetched; - @Nullable private IastContext context; + + @Nullable + private IastContext context; public NamedContextImpl(@Nonnull final PropagationModule module, @Nonnull final Source source) { this.module = module; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java index 6767c55ac77..8d9e89d8a88 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java @@ -26,9 +26,8 @@ public final class ConcurrentState { private volatile ContextContinuation continuation = null; private static final AtomicReferenceFieldUpdater - CONTINUATION = - AtomicReferenceFieldUpdater.newUpdater( - ConcurrentState.class, ContextContinuation.class, "continuation"); + CONTINUATION = AtomicReferenceFieldUpdater.newUpdater( + ConcurrentState.class, ContextContinuation.class, "continuation"); private ConcurrentState() {} diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/QueueTimerHelper.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/QueueTimerHelper.java index 2f77a3fb4bf..44364be16bf 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/QueueTimerHelper.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/QueueTimerHelper.java @@ -18,15 +18,13 @@ public class QueueTimerHelper { private static final class RateLimiterHolder { // indirection to prevent needing to instantiate the class and its transitive dependencies // in graal native image - private static final PerRecordingRateLimiter RATE_LIMITER = - new PerRecordingRateLimiter( - Duration.of(500, ChronoUnit.MILLIS), - 10_000, // hard limit on queue events - Duration.ofSeconds( - ConfigProvider.getInstance() - .getInteger( - ProfilingConfig.PROFILING_UPLOAD_PERIOD, - ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT))); + private static final PerRecordingRateLimiter RATE_LIMITER = new PerRecordingRateLimiter( + Duration.of(500, ChronoUnit.MILLIS), + 10_000, // hard limit on queue events + Duration.ofSeconds(ConfigProvider.getInstance() + .getInteger( + ProfilingConfig.PROFILING_UPLOAD_PERIOD, + ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT))); } public static void startQueuingTimer( diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/TPEHelper.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/TPEHelper.java index e95a6580849..ebc133fd75d 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/TPEHelper.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/TPEHelper.java @@ -27,15 +27,13 @@ public final class TPEHelper { // A ThreadLocal to store the Scope between beforeExecute and afterExecute if wrapping is not used private static final ThreadLocal threadLocalScope; - private static final ClassValue WRAP = - GenericClassValue.of( - input -> { - String className = input.getName(); - // We should always wrap anonymous lambda classes since we can't inject fields into - // them, and they can never be anything more than a _pure_ Runnable. They have '/' in - // their class name which is not allowed in 'normal' classes. - return className.indexOf('/', className.lastIndexOf('.')) > 0; - }); + private static final ClassValue WRAP = GenericClassValue.of(input -> { + String className = input.getName(); + // We should always wrap anonymous lambda classes since we can't inject fields into + // them, and they can never be anything more than a _pure_ Runnable. They have '/' in + // their class name which is not allowed in 'normal' classes. + return className.indexOf('/', className.lastIndexOf('.')) > 0; + }); static { InstrumenterConfig config = InstrumenterConfig.get(); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java index 0f08e5019b7..4470c58dd30 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java @@ -911,10 +911,9 @@ private static Map splitQuery(final String query, final char sep final int idx = pair.indexOf('='); final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair; if (!query_pairs.containsKey(key)) { - final String value = - idx > 0 && pair.length() > idx + 1 - ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") - : null; + final String value = idx > 0 && pair.length() > idx + 1 + ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") + : null; query_pairs.put(key, value); } } catch (final UnsupportedEncodingException e) { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java index be2179818ea..43b72b40de7 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java @@ -36,7 +36,8 @@ public final class SessionState { @Override public int compare(Map.Entry o1, Map.Entry o2) { // reverse natural order to sort start time by largest first (ie. youngest) - return Long.compare(o2.getValue().span.getStartTime(), o1.getValue().span.getStartTime()); + return Long.compare( + o2.getValue().span.getStartTime(), o1.getValue().span.getStartTime()); } }; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/log/UnionMap.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/log/UnionMap.java index 2449b62dc7d..5450922ef4e 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/log/UnionMap.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/log/UnionMap.java @@ -108,42 +108,41 @@ public void clear() { @Override public Set> entrySet() { if (null == entrySet) { - entrySet = - new AbstractSet>() { + entrySet = new AbstractSet>() { + @Override + public int size() { + return UnionMap.this.size(); + } + + @Override + public Iterator> iterator() { + UnionMap.this.dedup(); + + return new Iterator>() { + private Iterator> itr = primaryMap.entrySet().iterator(); + private volatile boolean trySecondaryNext = !secondaryMap.isEmpty(); + @Override - public int size() { - return UnionMap.this.size(); + public boolean hasNext() { + return itr.hasNext() || trySecondaryNext; } @Override - public Iterator> iterator() { - UnionMap.this.dedup(); - - return new Iterator>() { - private Iterator> itr = primaryMap.entrySet().iterator(); - private volatile boolean trySecondaryNext = !secondaryMap.isEmpty(); - - @Override - public boolean hasNext() { - return itr.hasNext() || trySecondaryNext; - } - - @Override - public Map.Entry next() { - if (!itr.hasNext() && trySecondaryNext) { - trySecondaryNext = false; - itr = secondaryMap.entrySet().iterator(); - } - return itr.next(); - } - - @Override - public void remove() { - itr.remove(); - } - }; + public Map.Entry next() { + if (!itr.hasNext() && trySecondaryNext) { + trySecondaryNext = false; + itr = secondaryMap.entrySet().iterator(); + } + return itr.next(); + } + + @Override + public void remove() { + itr.remove(); } }; + } + }; } return entrySet; } diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/ContextDispatcher.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/ContextDispatcher.java index 8e869d31604..f58e235efdd 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/ContextDispatcher.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/ContextDispatcher.java @@ -42,9 +42,8 @@ public void dispatch(final Remote obj, final RemoteCall call) throws IOException if (PROPAGATOR.isOperationWithPayload(operationId)) { final ContextPayload payload = ContextPayload.read(in); if (payload != null) { - final AgentSpanContext context = - extractContextAndGetSpanContext( - payload.getContext(), ContextVisitors.stringValuesMap()); + final AgentSpanContext context = extractContextAndGetSpanContext( + payload.getContext(), ContextVisitors.stringValuesMap()); THREAD_LOCAL_CONTEXT.set(context); } } diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiClientDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiClientDecorator.java index d89ddfb80b3..1cc8f7c4d30 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiClientDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiClientDecorator.java @@ -11,9 +11,8 @@ import java.lang.reflect.Method; public class RmiClientDecorator extends ClientDecorator { - public static final CharSequence RMI_INVOKE = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().client().operationForProtocol("rmi")); + public static final CharSequence RMI_INVOKE = UTF8BytesString.create( + SpanNaming.instance().namingSchema().client().operationForProtocol("rmi")); public static final CharSequence RMI_CLIENT = UTF8BytesString.create("rmi-client"); public static final RmiClientDecorator DECORATE = new RmiClientDecorator(); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiServerDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiServerDecorator.java index eb00dcc89f4..4c6ebdbc55b 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiServerDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/rmi/RmiServerDecorator.java @@ -11,9 +11,8 @@ public class RmiServerDecorator extends ServerDecorator { public static final CharSequence RMI_SERVER = UTF8BytesString.create("rmi-server"); public static final RmiServerDecorator DECORATE = new RmiServerDecorator(); - public static final CharSequence RMI_REQUEST = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().server().operationForProtocol("rmi")); + public static final CharSequence RMI_REQUEST = UTF8BytesString.create( + SpanNaming.instance().namingSchema().server().operationForProtocol("rmi")); @Override protected String[] instrumentationNames() { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterInputStream.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterInputStream.java index b8144a191e1..3784db2d577 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterInputStream.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterInputStream.java @@ -28,13 +28,12 @@ public UsmFilterInputStream(InputStream in, SSLSocket socket) { public int read(@Nonnull byte[] b, int off, int len) throws IOException { int bytesRead = super.read(b, off, len); boolean isIPv6 = socket.getLocalAddress() instanceof Inet6Address; - UsmConnection connection = - new UsmConnection( - socket.getLocalAddress(), - socket.getLocalPort(), - socket.getInetAddress(), - socket.getPort(), - isIPv6); + UsmConnection connection = new UsmConnection( + socket.getLocalAddress(), + socket.getLocalPort(), + socket.getInetAddress(), + socket.getPort(), + isIPv6); UsmMessage message = UsmMessageFactory.Supplier.getRequestMessage(connection, b, off, len); UsmExtractor.Supplier.send(message); return bytesRead; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterOutputStream.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterOutputStream.java index 1f9d6453ff0..296f2a2972c 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterOutputStream.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/sslsocket/UsmFilterOutputStream.java @@ -27,13 +27,12 @@ public UsmFilterOutputStream(OutputStream out, SSLSocket socket) { @Override public void write(@Nonnull byte[] b, int off, int len) throws IOException { boolean isIPv6 = this.socket.getLocalAddress() instanceof Inet6Address; - UsmConnection connection = - new UsmConnection( - socket.getLocalAddress(), - socket.getLocalPort(), - socket.getInetAddress(), - socket.getPort(), - isIPv6); + UsmConnection connection = new UsmConnection( + socket.getLocalAddress(), + socket.getLocalPort(), + socket.getInetAddress(), + socket.getPort(), + isIPv6); UsmMessage message = UsmMessageFactory.Supplier.getRequestMessage(connection, b, off, len); UsmExtractor.Supplier.send(message); super.write(b, off, len); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/HandlersExtractor.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/HandlersExtractor.java index 9d38b66f2ac..11f387f2212 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/HandlersExtractor.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/HandlersExtractor.java @@ -40,8 +40,11 @@ public int applyAsInt(Object ignored) { } public static class SizeCalculator { - @Nonnull private final ToIntFunction lengthFunction; - @Nonnull private final CharSequence format; + @Nonnull + private final ToIntFunction lengthFunction; + + @Nonnull + private final CharSequence format; SizeCalculator(@Nonnull ToIntFunction lengthFunction, @Nonnull CharSequence format) { this.lengthFunction = lengthFunction; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/ResourceNameExtractor.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/ResourceNameExtractor.java index b9fe9c179c0..14eac5df8b8 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/ResourceNameExtractor.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/websocket/ResourceNameExtractor.java @@ -10,21 +10,20 @@ public class ResourceNameExtractor { private static final String SPACE = " "; private static final String WEBSOCKET_SPACE = "websocket" + SPACE; private static final DDCache CACHE = DDCaches.newFixedSizeCache(128); - private static final Function EXTRACTOR = - s -> { - if (s == null || s.length() == 0) { - return HttpResourceNames.DEFAULT_RESOURCE_NAME; - } - int idx = s.toString().indexOf(SPACE); - if (idx < 0 || idx == s.length() - 1) { - return s; - } - final CharSequence ret = s.subSequence(idx + 1, s.length()); - if (ret.length() == 0) { - return HttpResourceNames.DEFAULT_RESOURCE_NAME; - } - return ret; - }; + private static final Function EXTRACTOR = s -> { + if (s == null || s.length() == 0) { + return HttpResourceNames.DEFAULT_RESOURCE_NAME; + } + int idx = s.toString().indexOf(SPACE); + if (idx < 0 || idx == s.length() - 1) { + return s; + } + final CharSequence ret = s.subSequence(idx + 1, s.length()); + if (ret.length() == 0) { + return HttpResourceNames.DEFAULT_RESOURCE_NAME; + } + return ret; + }; private static final Function ADDER = EXTRACTOR.andThen(new Functions.Prefix(WEBSOCKET_SPACE)); diff --git a/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/ffm/FFMNativeMethodDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/ffm/FFMNativeMethodDecorator.java index b7ce858c031..a9514c6f9ac 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/ffm/FFMNativeMethodDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/ffm/FFMNativeMethodDecorator.java @@ -18,14 +18,11 @@ public final class FFMNativeMethodDecorator extends BaseDecorator { private static final CharSequence TRACE_FFM = UTF8BytesString.create("trace-ffm"); private static final CharSequence OPERATION_NAME = UTF8BytesString.create("trace.native"); - private static final MethodHandle START_SPAN_MH = - safeFindStatic( - "startSpan", - MethodType.methodType(ContextScope.class, CharSequence.class, boolean.class)); - private static final MethodHandle END_SPAN_MH = - safeFindStatic( - "endSpan", - MethodType.methodType(Object.class, Throwable.class, ContextScope.class, Object.class)); + private static final MethodHandle START_SPAN_MH = safeFindStatic( + "startSpan", MethodType.methodType(ContextScope.class, CharSequence.class, boolean.class)); + private static final MethodHandle END_SPAN_MH = safeFindStatic( + "endSpan", + MethodType.methodType(Object.class, Throwable.class, ContextScope.class, Object.class)); public static final FFMNativeMethodDecorator DECORATE = new FFMNativeMethodDecorator(); @@ -87,25 +84,22 @@ public static MethodHandle wrap( * * So we first permute parameters to swap returnValue and ContextScope. */ - MethodHandle endPermuted = - MethodHandles.permuteArguments( - END_SPAN_MH, - MethodType.methodType( - Object.class, Throwable.class, Object.class, ContextScope.class), - 0, - 2, - 1); + MethodHandle endPermuted = MethodHandles.permuteArguments( + END_SPAN_MH, + MethodType.methodType(Object.class, Throwable.class, Object.class, ContextScope.class), + 0, + 2, + 1); // Accept original arguments (unused) after the required ones. MethodHandle endDropped = MethodHandles.dropArguments(endPermuted, 3, originalType.parameterList()); // Adapt return and result parameter types to match the original signature. - MethodType cleanupType = - endDropped - .type() - .changeParameterType(1, originalType.returnType()) - .changeReturnType(originalType.returnType()); + MethodType cleanupType = endDropped + .type() + .changeParameterType(1, originalType.returnType()) + .changeReturnType(originalType.returnType()); cleanup = endDropped.asType(cleanupType); } diff --git a/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogram.java b/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogram.java index 07056ff7c4e..35b54a11fc1 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogram.java +++ b/dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogram.java @@ -89,11 +89,10 @@ private void emit() { } void doEmit() { - Stream> items = - histogram.entrySet().stream() - .map(e -> Pair.of(e.getKey(), e.getValue().getAndSet(0))) - .filter(p -> p.getValue() != 0) - .sorted((l1, l2) -> Long.compare(l2.getValue(), l1.getValue())); + Stream> items = histogram.entrySet().stream() + .map(e -> Pair.of(e.getKey(), e.getValue().getAndSet(0))) + .filter(p -> p.getValue() != 0) + .sorted((l1, l2) -> Long.compare(l2.getValue(), l1.getValue())); if (maxTopItems > 0) { items = items.limit(maxTopItems); diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/SampleJavaClass.java b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/SampleJavaClass.java index 7897cd83037..091e801eaf6 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/SampleJavaClass.java +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/SampleJavaClass.java @@ -5,10 +5,9 @@ * anonymous class, so use a Java class instead. */ public class SampleJavaClass { - public static Class anonymousClass = - new Runnable() { + public static Class anonymousClass = new Runnable() { - @Override - public void run() {} - }.getClass(); + @Override + public void run() {} + }.getClass(); } diff --git a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/AgentFeatureFlaggingLifecycleTest.java b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/AgentFeatureFlaggingLifecycleTest.java index 75e9987c4da..8fdbb76be38 100644 --- a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/AgentFeatureFlaggingLifecycleTest.java +++ b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/AgentFeatureFlaggingLifecycleTest.java @@ -15,16 +15,15 @@ void reset() { @Test void shutdownInvokesFeatureFlaggingSystemStopThroughAgentClassLoader() { - final ClassLoader classLoader = - new ClassLoader(null) { - @Override - public Class loadClass(final String name) throws ClassNotFoundException { - if ("com.datadog.featureflag.FeatureFlaggingSystem".equals(name)) { - return FakeFeatureFlaggingSystem.class; - } - return super.loadClass(name); - } - }; + final ClassLoader classLoader = new ClassLoader(null) { + @Override + public Class loadClass(final String name) throws ClassNotFoundException { + if ("com.datadog.featureflag.FeatureFlaggingSystem".equals(name)) { + return FakeFeatureFlaggingSystem.class; + } + return super.loadClass(name); + } + }; Agent.shutdownFeatureFlagging(classLoader); diff --git a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/DatadogClassLoaderTest.java b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/DatadogClassLoaderTest.java index 376b035a043..1609bb25239 100644 --- a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/DatadogClassLoaderTest.java +++ b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/DatadogClassLoaderTest.java @@ -52,28 +52,26 @@ void agentClassloaderDoesNotLockClassloadingAroundInstance() throws Exception { Phaser acquireLockFromMainThreadPhase = new Phaser(2); // when - Thread thread1 = - new Thread() { - @Override - public void run() { - synchronized (lock1) { - threadHoldLockPhase.arrive(); - acquireLockFromMainThreadPhase.arriveAndAwaitAdvance(); - } - } - }; + Thread thread1 = new Thread() { + @Override + public void run() { + synchronized (lock1) { + threadHoldLockPhase.arrive(); + acquireLockFromMainThreadPhase.arriveAndAwaitAdvance(); + } + } + }; thread1.start(); - Thread thread2 = - new Thread() { - @Override - public void run() { - threadHoldLockPhase.arriveAndAwaitAdvance(); - synchronized (lock2) { - acquireLockFromMainThreadPhase.arrive(); - } - } - }; + Thread thread2 = new Thread() { + @Override + public void run() { + threadHoldLockPhase.arriveAndAwaitAdvance(); + synchronized (lock2) { + acquireLockFromMainThreadPhase.arrive(); + } + } + }; thread2.start(); thread1.join(); thread2.join(); @@ -90,12 +88,10 @@ void agentClassloaderSuccessfullyLoadsClassesConcurrently() throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); List> futures = new ArrayList<>(); for (int i = 0; i < 100; i++) { - futures.add( - executorService.submit( - () -> { - ddLoader.loadClass("a.A"); - return null; - })); + futures.add(executorService.submit(() -> { + ddLoader.loadClass("a.A"); + return null; + })); } for (Future future : futures) { try { @@ -160,12 +156,11 @@ void findResourceUsesAgentJarUrlAsPrefix(@org.junit.jupiter.api.io.TempDir File String expectedPrefix = "jar:" + spacedJarUrl + "!/"; assertTrue( resource.toString().startsWith(expectedPrefix), - () -> - "resource URL (" - + resource - + ") should start with the agent jar URL prefix (" - + expectedPrefix - + ") — pre-fix code derives the prefix from JarFile.getName()," - + " which leaves the space unencoded and on Windows produces a malformed URL."); + () -> "resource URL (" + + resource + + ") should start with the agent jar URL prefix (" + + expectedPrefix + + ") — pre-fix code derives the prefix from JarFile.getName()," + + " which leaves the space unencoded and on Windows produces a malformed URL."); } } diff --git a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/classloading/ClassDefiningTest.java b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/classloading/ClassDefiningTest.java index b3941727472..3b268a0d295 100644 --- a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/classloading/ClassDefiningTest.java +++ b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/classloading/ClassDefiningTest.java @@ -49,13 +49,12 @@ void observerReceivesCorrectArguments() { int[] capturedOffset = new int[1]; int[] capturedLength = new int[1]; - ClassDefining.observe( - (l, b, o, len) -> { - capturedLoader[0] = l; - capturedBytecode[0] = b; - capturedOffset[0] = o; - capturedLength[0] = len; - }); + ClassDefining.observe((l, b, o, len) -> { + capturedLoader[0] = l; + capturedBytecode[0] = b; + capturedOffset[0] = o; + capturedLength[0] = len; + }); ClassDefining.begin(loader, bytecode, 1, 3); diff --git a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorIsAgentRequestTest.java b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorIsAgentRequestTest.java index 5d4f2c9e6ae..731f504771d 100644 --- a/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorIsAgentRequestTest.java +++ b/dd-java-agent/agent-bootstrap/src/test/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorIsAgentRequestTest.java @@ -14,43 +14,42 @@ class HttpClientDecoratorIsAgentRequestTest { // datadog.trace.instrumentation.httpclient.SendAsyncAdvice. @Test void isAgentRequestOfNullRequestReturnsFalseInsteadOfThrowing() { - HttpClientDecorator decorator = - new HttpClientDecorator() { - @Override - protected String[] instrumentationNames() { - return new String[] {"test"}; - } - - @Override - protected CharSequence component() { - return "test-component"; - } - - @Override - protected String method(Object request) { - return null; - } - - @Override - protected URI url(Object request) throws URISyntaxException { - return null; - } - - @Override - protected int status(Object response) { - return 0; - } - - @Override - protected String getRequestHeader(Object request, String headerName) { - throw new NullPointerException("should not be reached for a null request"); - } - - @Override - protected String getResponseHeader(Object response, String headerName) { - return null; - } - }; + HttpClientDecorator decorator = new HttpClientDecorator() { + @Override + protected String[] instrumentationNames() { + return new String[] {"test"}; + } + + @Override + protected CharSequence component() { + return "test-component"; + } + + @Override + protected String method(Object request) { + return null; + } + + @Override + protected URI url(Object request) throws URISyntaxException { + return null; + } + + @Override + protected int status(Object response) { + return 0; + } + + @Override + protected String getRequestHeader(Object request, String headerName) { + throw new NullPointerException("should not be reached for a null request"); + } + + @Override + protected String getResponseHeader(Object response, String headerName) { + return null; + } + }; assertFalse(decorator.isAgentRequest(null)); } diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java index 859f95c917c..4211772d885 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilitySmokeTest.java @@ -26,9 +26,8 @@ public abstract class CiVisibilitySmokeTest { - public static final List SMOKE_IGNORED_TAGS = - Collections.unmodifiableList( - Arrays.asList("content.meta.['_dd.integration']", "content.meta.['_dd.svc_src']")); + public static final List SMOKE_IGNORED_TAGS = Collections.unmodifiableList( + Arrays.asList("content.meta.['_dd.integration']", "content.meta.['_dd.svc_src']")); protected static final String AGENT_JAR = System.getProperty("datadog.smoketest.agent.shadowJar.path"); @@ -40,7 +39,8 @@ public abstract class CiVisibilitySmokeTest { private static final Map DEFAULT_TRACER_CONFIG = defaultJvmArguments(); - @TempDir protected Path prefsDir; + @TempDir + protected Path prefsDir; protected static String buildJavaHome() { String javaHome = System.getProperty("java.home"); @@ -124,10 +124,9 @@ protected List buildJvmArguments( argMap.put(GeneralConfig.TRACE_DEBUG, "true"); } - String agentArgs = - argMap.entrySet().stream() - .map(e -> propertyNameToSystemPropertyName(e.getKey()) + "=" + e.getValue()) - .collect(Collectors.joining(",")); + String agentArgs = argMap.entrySet().stream() + .map(e -> propertyNameToSystemPropertyName(e.getKey()) + "=" + e.getValue()) + .collect(Collectors.joining(",")); arguments.add("-javaagent:" + AGENT_JAR + "=" + agentArgs); return arguments; @@ -150,8 +149,8 @@ protected String preventJulPrefsFileLock() { } private static Path tempUserPrefsPath() { - String uniqueId = - System.currentTimeMillis() + "_" + System.nanoTime() + "_" + Thread.currentThread().getId(); + String uniqueId = System.currentTimeMillis() + "_" + System.nanoTime() + "_" + + Thread.currentThread().getId(); return Paths.get(System.getProperty("java.io.tmpdir"), "gradle-test-userPrefs", uniqueId); } @@ -179,13 +178,12 @@ protected void verifyEventsAndCoverages( if (System.getenv("GENERATE_TEST_FIXTURES") != null) { String baseTemplatesPath; try { - baseTemplatesPath = - CiVisibilitySmokeTest.class - .getClassLoader() - .getResource(projectName) - .toURI() - .getSchemeSpecificPart() - .replace("build/resources/test", "src/test/resources"); + baseTemplatesPath = CiVisibilitySmokeTest.class + .getClassLoader() + .getResource(projectName) + .toURI() + .getSchemeSpecificPart() + .replace("build/resources/test", "src/test/resources"); } catch (Exception e) { throw new RuntimeException(e); } @@ -272,16 +270,15 @@ protected static void verifySnapshotLogs( } private static void verifyProbeStatuses(List> logs, int expectedCount) { - long received = - logs.stream() - .filter(log -> ((String) log.get("message")).startsWith("Received probe")) - .count(); - long installed = - logs.stream() - .filter(log -> ((String) log.get("message")).startsWith("Installed probe")) - .count(); - long emitting = - logs.stream().filter(log -> ((String) log.get("message")).endsWith("is emitting.")).count(); + long received = logs.stream() + .filter(log -> ((String) log.get("message")).startsWith("Received probe")) + .count(); + long installed = logs.stream() + .filter(log -> ((String) log.get("message")).startsWith("Installed probe")) + .count(); + long emitting = logs.stream() + .filter(log -> ((String) log.get("message")).endsWith("is emitting.")) + .count(); assertEquals(expectedCount, received); assertEquals(expectedCount, installed); assertEquals(expectedCount, emitting); @@ -305,10 +302,8 @@ protected static void verifySnapshots(List> logs, int expect Map snapshotContent = (Map) debuggerMap.get("snapshot"); assertNotNull(snapshotContent, "snapshot must not be null"); - requiredSnapshotFields.forEach( - field -> - assertTrue( - snapshotContent.containsKey(field), "snapshot must contain field: " + field)); + requiredSnapshotFields.forEach(field -> + assertTrue(snapshotContent.containsKey(field), "snapshot must contain field: " + field)); } } } diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilityTestUtils.java b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilityTestUtils.java index fb9ff951a88..2571a3007a5 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilityTestUtils.java +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/java/datadog/trace/civisibility/CiVisibilityTestUtils.java @@ -47,62 +47,57 @@ public abstract class CiVisibilityTestUtils { public static final List EVENT_DYNAMIC_PATHS = - Collections.unmodifiableList( - Arrays.asList( - path("content.trace_id"), - path("content.span_id"), - path("content.parent_id"), - path("content.test_session_id"), - path("content.test_module_id"), - path("content.test_suite_id"), - path("content.metrics.process_id"), - path("content.meta.['os.architecture']"), - path("content.meta.['os.platform']"), - path("content.meta.['os.version']"), - path("content.meta.['runtime.name']"), - path("content.meta.['runtime.vendor']"), - path("content.meta.['runtime.version']"), - path("content.meta.['ci.workspace_path']"), - path("content.meta.['error.message']"), - path("content.meta.library_version"), - path("content.meta.runtime-id"), - path("content.meta.['_dd.tracer_host']"), - // Different events might or might not have the same start or duration. Regardless, - // the values of these fields should be treated as different. - path("content.start", false), - path("content.duration", false), - path("content.metrics.['_dd.host.vcpu_count']", false), - path("content.meta.['_dd.p.tid']", false), - path("content.meta.['error.stack']", false))); + Collections.unmodifiableList(Arrays.asList( + path("content.trace_id"), + path("content.span_id"), + path("content.parent_id"), + path("content.test_session_id"), + path("content.test_module_id"), + path("content.test_suite_id"), + path("content.metrics.process_id"), + path("content.meta.['os.architecture']"), + path("content.meta.['os.platform']"), + path("content.meta.['os.version']"), + path("content.meta.['runtime.name']"), + path("content.meta.['runtime.vendor']"), + path("content.meta.['runtime.version']"), + path("content.meta.['ci.workspace_path']"), + path("content.meta.['error.message']"), + path("content.meta.library_version"), + path("content.meta.runtime-id"), + path("content.meta.['_dd.tracer_host']"), + // Different events might or might not have the same start or duration. Regardless, + // the values of these fields should be treated as different. + path("content.start", false), + path("content.duration", false), + path("content.metrics.['_dd.host.vcpu_count']", false), + path("content.meta.['_dd.p.tid']", false), + path("content.meta.['error.stack']", false))); // ignored tags on assertion and fixture build public static final List IGNORED_TAGS; static { - List ignored = - Arrays.stream(LibraryCapability.values()) - .map(c -> "content.meta.['" + c.asTag() + "']") - .collect(Collectors.toList()); + List ignored = Arrays.stream(LibraryCapability.values()) + .map(c -> "content.meta.['" + c.asTag() + "']") + .collect(Collectors.toList()); ignored.add("content.meta.['_dd.integration']"); ignored.add("content.meta.['_dd.svc_src']"); IGNORED_TAGS = Collections.unmodifiableList(ignored); } - public static final List COVERAGE_DYNAMIC_PATHS = - Collections.unmodifiableList( - Arrays.asList(path("test_session_id"), path("test_suite_id"), path("span_id"))); + public static final List COVERAGE_DYNAMIC_PATHS = Collections.unmodifiableList( + Arrays.asList(path("test_session_id"), path("test_suite_id"), path("span_id"))); private static final Comparator> EVENT_RESOURCE_COMPARATOR = - Comparator., String>comparing( - m -> { - Map content = (Map) m.get("content"); - return (String) content.get("resource"); - }) - .thenComparing( - Comparator., String>comparing( - // module and session have the same resource name in headless mode - m -> (String) m.get("type")) - .reversed()); + Comparator., String>comparing(m -> { + Map content = (Map) m.get("content"); + return (String) content.get("resource"); + }) + .thenComparing(Comparator., String>comparing( + // module and session have the same resource name in headless mode + m -> (String) m.get("type")) + .reversed()); /** Use this method to generate expected data templates. */ public static void generateTemplates( @@ -184,13 +179,12 @@ private static void compareXml(String expectedXml, String actualXml) throws Exce Document expected = Convert.toDocument(Input.fromString(expectedXml).build(), dbf); Document actual = Convert.toDocument(Input.fromString(actualXml).build(), dbf); - Diff diff = - DiffBuilder.compare(Input.fromDocument(actual)) - .withTest(Input.fromDocument(expected)) - .ignoreComments() - .ignoreWhitespace() - .checkForSimilar() - .build(); + Diff diff = DiffBuilder.compare(Input.fromDocument(actual)) + .withTest(Input.fromDocument(expected)) + .ignoreComments() + .ignoreWhitespace() + .checkForSimilar() + .build(); if (diff.hasDifferences()) { throw new AssertionError("XML mismatch: " + diff.toString()); @@ -293,9 +287,8 @@ public static boolean assertTestsOrder( public static List getTestIdentifiers(List> events) { List> sorted = new ArrayList<>(events); - sorted.sort( - Comparator.comparing( - it -> ((Number) ((Map) it.get("content")).get("start")).longValue())); + sorted.sort(Comparator.comparing( + it -> ((Number) ((Map) it.get("content")).get("start")).longValue())); List testIdentifiers = new ArrayList<>(); for (Map event : sorted) { Map content = (Map) event.get("content"); @@ -436,19 +429,19 @@ String generateTemplate(Collection> objects, List object : objects) { DocumentContext ctx = JsonPath.parse(object, JSON_PATH_CONFIG); for (DynamicPath dynamicPath : dynamicPaths) { - ctx.map( - dynamicPath.path, - (currentValue, config) -> { - if (dynamicPath.unique) { - return uniqueValues.computeIfAbsent( - String.valueOf(currentValue), k -> label.forTemplateKey(dynamicPath.rawPath)); - } - return label.forTemplateKey(dynamicPath.rawPath); - }); + ctx.map(dynamicPath.path, (currentValue, config) -> { + if (dynamicPath.unique) { + return uniqueValues.computeIfAbsent( + String.valueOf(currentValue), k -> label.forTemplateKey(dynamicPath.rawPath)); + } + return label.forTemplateKey(dynamicPath.rawPath); + }); } } // remove quotes around placeholders - return PLACEHOLDER_PATTERN.matcher(JSON_MAPPER.writeValueAsString(objects)).replaceAll("$1"); + return PLACEHOLDER_PATTERN + .matcher(JSON_MAPPER.writeValueAsString(objects)) + .replaceAll("$1"); } Map generateReplacementMap( diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityCoverageServices.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityCoverageServices.java index 205dba8ae72..60a011d8e6a 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityCoverageServices.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityCoverageServices.java @@ -43,13 +43,12 @@ static class Parent { services.metricCollector) : null; - coverageProcessorFactory = - new JacocoCoverageProcessor.Factory( - services.config, - repoServices.repoIndexProvider, - coverageReportUploader, - repoServices.repoRoot, - moduleSignalRouter); + coverageProcessorFactory = new JacocoCoverageProcessor.Factory( + services.config, + repoServices.repoIndexProvider, + coverageReportUploader, + repoServices.repoRoot, + moduleSignalRouter); } } @@ -77,13 +76,11 @@ private static CoverageStore.Factory buildCoverageStoreFactory( if (!services.config.isCiVisibilityCodeCoverageEnabled()) { factory = new NoOpCoverageStore.Factory(); } else if (services.config.isCiVisibilityCoverageLinesEnabled()) { - factory = - new LineCoverageStore.Factory( - services.metricCollector, repoServices.sourcePathResolver); + factory = new LineCoverageStore.Factory( + services.metricCollector, repoServices.sourcePathResolver); } else { - factory = - new FileCoverageStore.Factory( - services.metricCollector, repoServices.sourcePathResolver); + factory = new FileCoverageStore.Factory( + services.metricCollector, repoServices.sourcePathResolver); } if (executionSettings.isItrEnabled()) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityRepoServices.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityRepoServices.java index eada54f014c..b05be4c9f0d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityRepoServices.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityRepoServices.java @@ -52,7 +52,9 @@ public class CiVisibilityRepoServices { private static final Logger LOGGER = LoggerFactory.getLogger(CiVisibilityRepoServices.class); - @Nullable final String repoRoot; + @Nullable + final String repoRoot; + final String moduleName; final Provider ciProvider; final Map ciTags; @@ -73,9 +75,8 @@ public class CiVisibilityRepoServices { GitClient gitClient = services.gitClientFactory.create(repoRoot); GitRepoUnshallow gitRepoUnshallow = new GitRepoUnshallow(services.config, gitClient); - PullRequestInfo pullRequestInfo = - buildPullRequestInfo( - services.config, services.environment, ciProviderInfo, gitClient, gitRepoUnshallow); + PullRequestInfo pullRequestInfo = buildPullRequestInfo( + services.config, services.environment, ciProviderInfo, gitClient, gitRepoUnshallow); if (!pullRequestInfo.isEmpty()) { LOGGER.info("PR detected: {}", pullRequestInfo); @@ -88,15 +89,14 @@ public class CiVisibilityRepoServices { LOGGER.info("[bazel mode] Skipping git data upload"); gitDataUploader = () -> CompletableFuture.completedFuture(null); } else { - gitDataUploader = - buildGitDataUploader( - services.config, - services.metricCollector, - services.gitInfoProvider, - gitClient, - gitRepoUnshallow, - services.backendApi, - repoRoot); + gitDataUploader = buildGitDataUploader( + services.config, + services.metricCollector, + services.gitInfoProvider, + gitClient, + gitRepoUnshallow, + services.backendApi, + repoRoot); } repoIndexProvider = services.repoIndexProviderFactory.create(repoRoot); @@ -106,17 +106,16 @@ public class CiVisibilityRepoServices { if (services.processHierarchy.isChild()) { executionSettingsFactory = buildExecutionSettingsFetcher(services.signalClientFactory); } else { - executionSettingsFactory = - buildExecutionSettingsFactory( - services.processHierarchy, - services.config, - services.metricCollector, - services.backendApi, - gitClient, - gitRepoUnshallow, - gitDataUploader, - pullRequestInfo, - repoRoot); + executionSettingsFactory = buildExecutionSettingsFactory( + services.processHierarchy, + services.config, + services.metricCollector, + services.backendApi, + gitClient, + gitRepoUnshallow, + gitDataUploader, + pullRequestInfo, + repoRoot); } } @@ -152,13 +151,12 @@ static PullRequestInfo buildPullRequestInfo( @Nonnull private static PullRequestInfo buildUserPullRequestInfo( Config config, CiEnvironment environment, GitClient gitClient) { - PullRequestInfo userInfo = - new PullRequestInfo( - config.getGitPullRequestBaseBranch(), - config.getGitPullRequestBaseBranchSha(), - null, - new CommitInfo(config.getGitCommitHeadSha()), - null); + PullRequestInfo userInfo = new PullRequestInfo( + config.getGitPullRequestBaseBranch(), + config.getGitPullRequestBaseBranchSha(), + null, + new CommitInfo(config.getGitCommitHeadSha()), + null); if (userInfo.isComplete()) { return userInfo; @@ -177,13 +175,12 @@ private static PullRequestInfo buildUserPullRequestInfo( } } - PullRequestInfo ddCiInfo = - new PullRequestInfo( - null, - mergeBase, - null, - new CommitInfo(environment.get(Constants.DDCI_PULL_REQUEST_SOURCE_SHA)), - null); + PullRequestInfo ddCiInfo = new PullRequestInfo( + null, + mergeBase, + null, + new CommitInfo(environment.get(Constants.DDCI_PULL_REQUEST_SOURCE_SHA)), + null); return PullRequestInfo.coalesce(userInfo, ddCiInfo); } @@ -264,13 +261,12 @@ private static ExecutionSettingsFactory buildExecutionSettingsFactory( BazelMode bazelMode = BazelMode.get(); if (bazelMode.isManifestModeEnabled()) { LOGGER.info("[bazel mode] Manifest mode detected. Using file-based configuration API"); - configurationApi = - new FileBasedConfigurationApi( - toPathOrNull(bazelMode.getSettingsPath()), - null, - toPathOrNull(bazelMode.getFlakyTestsPath()), - toPathOrNull(bazelMode.getKnownTestsPath()), - toPathOrNull(bazelMode.getTestManagementPath())); + configurationApi = new FileBasedConfigurationApi( + toPathOrNull(bazelMode.getSettingsPath()), + null, + toPathOrNull(bazelMode.getFlakyTestsPath()), + toPathOrNull(bazelMode.getKnownTestsPath()), + toPathOrNull(bazelMode.getTestManagementPath())); } else if (backendApi == null) { LOGGER.warn( "Remote config and skippable tests requests will be skipped since backend API client could not be created"); @@ -279,15 +275,14 @@ private static ExecutionSettingsFactory buildExecutionSettingsFactory( configurationApi = new ConfigurationApiImpl(backendApi, metricCollector); } - ExecutionSettingsFactoryImpl factory = - new ExecutionSettingsFactoryImpl( - config, - configurationApi, - gitClient, - gitRepoUnshallow, - gitDataUploader, - pullRequestInfo, - repoRoot); + ExecutionSettingsFactoryImpl factory = new ExecutionSettingsFactoryImpl( + config, + configurationApi, + gitClient, + gitRepoUnshallow, + gitDataUploader, + pullRequestInfo, + repoRoot); if (processHierarchy.isHeadless()) { return factory; } else { @@ -339,10 +334,9 @@ private static GitDataUploader buildGitDataUploader( private static SourcePathResolver buildSourcePathResolver( @Nullable String repoRoot, RepoIndexProvider indexProvider) { - SourcePathResolver compilerAidedResolver = - repoRoot != null - ? new CompilerAidedSourcePathResolver(repoRoot) - : NoOpSourcePathResolver.INSTANCE; + SourcePathResolver compilerAidedResolver = repoRoot != null + ? new CompilerAidedSourcePathResolver(repoRoot) + : NoOpSourcePathResolver.INSTANCE; RepoIndexSourcePathResolver indexResolver = new RepoIndexSourcePathResolver(indexProvider); return new BestEffortSourcePathResolver(compilerAidedResolver, indexResolver); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java index 12dfa0709d7..01da32c77b0 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java @@ -71,7 +71,9 @@ public class CiVisibilityServices { final GitInfoProvider gitInfoProvider; final LinesResolver linesResolver; final RepoIndexProvider.Factory repoIndexProviderFactory; - @Nullable final SignalClient.Factory signalClientFactory; + + @Nullable + final SignalClient.Factory signalClientFactory; CiVisibilityServices( Config config, @@ -116,9 +118,8 @@ public class CiVisibilityServices { FileSystem fileSystem = FileSystems.getDefault(); PackageResolver packageResolver = new PackageResolverImpl(fileSystem); - ResourceResolver resourceResolver = - new ConventionBasedResourceResolver( - fileSystem, config.getCiVisibilityResourceFolderNames()); + ResourceResolver resourceResolver = new ConventionBasedResourceResolver( + fileSystem, config.getCiVisibilityResourceFolderNames()); this.repoIndexProviderFactory = new CachingRepoIndexBuilderFactory(config, packageResolver, resourceResolver, fileSystem); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilitySystem.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilitySystem.java index af7f653e921..de70a1c1830 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilitySystem.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilitySystem.java @@ -79,10 +79,9 @@ public static void start(Instrumentation inst, SharedCommunicationObjects sco) { inst.addTransformer(new CompilerModuleExporter(inst)); } - CiVisibilityMetricCollector metricCollector = - config.isCiVisibilityTelemetryEnabled() - ? new CiVisibilityMetricCollectorImpl() - : NoOpMetricCollector.INSTANCE; + CiVisibilityMetricCollector metricCollector = config.isCiVisibilityTelemetryEnabled() + ? new CiVisibilityMetricCollectorImpl() + : NoOpMetricCollector.INSTANCE; InstrumentationBridge.registerMetricCollector(metricCollector); CiVisibilityServices services = @@ -94,9 +93,8 @@ public static void start(Instrumentation inst, SharedCommunicationObjects sco) { if (services.processHierarchy.isChild() || services.processHierarchy.isHeadless()) { CiVisibilityRepoServices repoServices = services.repoServices(getCurrentPath()); - ExecutionSettings executionSettings = - repoServices.executionSettingsFactory.create( - JvmInfo.CURRENT_JVM, repoServices.moduleName); + ExecutionSettings executionSettings = repoServices.executionSettingsFactory.create( + JvmInfo.CURRENT_JVM, repoServices.moduleName); if (executionSettings.isCodeCoverageEnabled() && // lines coverage is built on top of Jacoco, @@ -173,13 +171,11 @@ private TestEventsHandlerFactory( this.services = services; this.repoServices = repoServices; if (services.processHierarchy.isChild()) { - sessionFactory = - childTestFrameworkSessionFactory( - services, repoServices, coverageServices, executionSettings); + sessionFactory = childTestFrameworkSessionFactory( + services, repoServices, coverageServices, executionSettings); } else { - sessionFactory = - headlessTestFrameworkSessionFactory( - services, repoServices, coverageServices, executionSettings); + sessionFactory = headlessTestFrameworkSessionFactory( + services, repoServices, coverageServices, executionSettings); } } @@ -190,16 +186,13 @@ public TestEventsHandler create( @Nullable ContextStore testStore, Collection capabilities) { boolean eagerSessionStart = !services.processHierarchy.isHeadless(); - TestEventsHandler handler = - new TestEventsHandlerImpl<>( - services.metricCollector, - () -> - sessionFactory.startSession( - repoServices.moduleName, component, null, capabilities), - repoServices.moduleName, - eagerSessionStart, - suiteStore != null ? suiteStore : new StrongMapContextStore<>(), - testStore != null ? testStore : new StrongMapContextStore<>()); + TestEventsHandler handler = new TestEventsHandlerImpl<>( + services.metricCollector, + () -> sessionFactory.startSession(repoServices.moduleName, component, null, capabilities), + repoServices.moduleName, + eagerSessionStart, + suiteStore != null ? suiteStore : new StrongMapContextStore<>(), + testStore != null ? testStore : new StrongMapContextStore<>()); handlers.add(handler); return handler; } @@ -271,12 +264,11 @@ private static TestFrameworkSession.Factory childTestFrameworkSessionFactory( TestDecorator testDecorator = new TestDecoratorImpl(component, sessionName, testCommand, repoServices.ciTags); - ExecutionStrategy executionStrategy = - new ExecutionStrategy( - services.config, - executionSettings, - repoServices.sourcePathResolver, - services.linesResolver); + ExecutionStrategy executionStrategy = new ExecutionStrategy( + services.config, + executionSettings, + repoServices.sourcePathResolver, + services.linesResolver); // only add report upload capability for children sessions, // because report upload is only supported when the build system is instrumented @@ -314,12 +306,11 @@ private static TestFrameworkSession.Factory headlessTestFrameworkSessionFactory( TestDecorator testDecorator = new TestDecoratorImpl(component, sessionName, projectName, repoServices.ciTags); - ExecutionStrategy executionStrategy = - new ExecutionStrategy( - services.config, - executionSettings, - repoServices.sourcePathResolver, - services.linesResolver); + ExecutionStrategy executionStrategy = new ExecutionStrategy( + services.config, + executionSettings, + repoServices.sourcePathResolver, + services.linesResolver); return new HeadlessTestSession( projectName, startTime, diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java index 5029bd5677b..3a732d5ccb2 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java @@ -31,12 +31,12 @@ public void forEachKey(Map carrier, AgentPropagation.KeyClassifi } } - @Nullable public final AgentSpanContext.Extracted parentProcessModuleContext; + @Nullable + public final AgentSpanContext.Extracted parentProcessModuleContext; ProcessHierarchy() { - parentProcessModuleContext = - extractContextAndGetSpanContext( - SystemProperties.asStringMap(), SystemPropertiesPropagationGetter.INSTANCE); + parentProcessModuleContext = extractContextAndGetSpanContext( + SystemProperties.asStringMap(), SystemPropertiesPropagationGetter.INSTANCE); } /** diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CITagsProvider.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CITagsProvider.java index af34741a638..40c9cfa3d31 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CITagsProvider.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/CITagsProvider.java @@ -154,12 +154,14 @@ public CITagsBuilder withPullRequestBaseBranchHeadSha(final PullRequestInfo pull } public CITagsBuilder withGitCommitHeadSha(final PullRequestInfo pullRequestInfo) { - return putTagValue(Tags.GIT_COMMIT_HEAD_SHA, pullRequestInfo.getHeadCommit().getSha()); + return putTagValue( + Tags.GIT_COMMIT_HEAD_SHA, pullRequestInfo.getHeadCommit().getSha()); } public CITagsBuilder withGitCommitHeadAuthorName(final PullRequestInfo pullRequestInfo) { return putTagValue( - Tags.GIT_COMMIT_HEAD_AUTHOR_NAME, pullRequestInfo.getHeadCommit().getAuthor().getName()); + Tags.GIT_COMMIT_HEAD_AUTHOR_NAME, + pullRequestInfo.getHeadCommit().getAuthor().getName()); } public CITagsBuilder withGitCommitHeadAuthorEmail(final PullRequestInfo pullRequestInfo) { @@ -218,11 +220,13 @@ public CITagsBuilder withGitTag(final GitInfo gitInfo) { } public CITagsBuilder withGitCommitAuthorName(final GitInfo gitInfo) { - return putTagValue(Tags.GIT_COMMIT_AUTHOR_NAME, gitInfo.getCommit().getAuthor().getName()); + return putTagValue( + Tags.GIT_COMMIT_AUTHOR_NAME, gitInfo.getCommit().getAuthor().getName()); } public CITagsBuilder withGitCommitAuthorEmail(final GitInfo gitInfo) { - return putTagValue(Tags.GIT_COMMIT_AUTHOR_EMAIL, gitInfo.getCommit().getAuthor().getEmail()); + return putTagValue( + Tags.GIT_COMMIT_AUTHOR_EMAIL, gitInfo.getCommit().getAuthor().getEmail()); } public CITagsBuilder withGitCommitAuthorDate(final GitInfo gitInfo) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java index 856e280b933..62529759dc2 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java @@ -93,9 +93,8 @@ public CIInfo buildCIInfo() { String pipelineId = environment.get(GHACTIONS_PIPELINE_ID); String commit = environment.get(GHACTIONS_SHA); - final String pipelineUrl = - buildPipelineUrl( - serverUrl, repository, pipelineId, environment.get(GHACTIONS_PIPELINE_RETRY)); + final String pipelineUrl = buildPipelineUrl( + serverUrl, repository, pipelineId, environment.get(GHACTIONS_PIPELINE_RETRY)); // Try to get numeric job ID for better job URL String numericJobId = getNumericJobId(); @@ -262,7 +261,10 @@ private String parseJobIdFromDirectory(Path directory) { Path mostRecentLog = null; for (Path workerLog : stream) { if (mostRecentLog == null - || workerLog.getFileName().toString().compareTo(mostRecentLog.getFileName().toString()) + || workerLog + .getFileName() + .toString() + .compareTo(mostRecentLog.getFileName().toString()) > 0) { mostRecentLog = workerLog; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/PullRequestInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/PullRequestInfo.java index a6319a014c5..4c4109d2811 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/PullRequestInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/PullRequestInfo.java @@ -13,7 +13,10 @@ public class PullRequestInfo { private final String baseBranch; private final String baseBranchSha; private final String baseBranchHeadSha; - @Nonnull private final CommitInfo headCommit; + + @Nonnull + private final CommitInfo headCommit; + private final String pullRequestNumber; public PullRequestInfo( diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/UnknownCIInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/UnknownCIInfo.java index df6ade9a13e..a7df4f24099 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/UnknownCIInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/UnknownCIInfo.java @@ -58,7 +58,9 @@ public CIInfo buildCIInfo() { LOGGER.debug("Could not get real path for workspace folder {}", workspace, e); } - return CIInfo.builder(environment).ciWorkspace(workspace.toAbsolutePath().toString()).build(); + return CIInfo.builder(environment) + .ciWorkspace(workspace.toAbsolutePath().toString()) + .build(); } @Nonnull diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java index d7502ccec48..899dd4412aa 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java @@ -8,37 +8,35 @@ public class CiVisibilitySettings { - public static final CiVisibilitySettings DEFAULT = - new CiVisibilitySettings( - false, - false, - false, - false, - false, - false, - false, - false, - false, - EarlyFlakeDetectionSettings.DEFAULT, - TestManagementSettings.DEFAULT, - null, - false); - - public static final CiVisibilitySettings SETTINGS_REQUEST_ERROR = - new CiVisibilitySettings( - false, - false, - false, - false, - false, - false, - false, - false, - false, - EarlyFlakeDetectionSettings.DEFAULT, - TestManagementSettings.DEFAULT, - null, - true); + public static final CiVisibilitySettings DEFAULT = new CiVisibilitySettings( + false, + false, + false, + false, + false, + false, + false, + false, + false, + EarlyFlakeDetectionSettings.DEFAULT, + TestManagementSettings.DEFAULT, + null, + false); + + public static final CiVisibilitySettings SETTINGS_REQUEST_ERROR = new CiVisibilitySettings( + false, + false, + false, + false, + false, + false, + false, + false, + false, + EarlyFlakeDetectionSettings.DEFAULT, + TestManagementSettings.DEFAULT, + null, + true); private final boolean itrEnabled; private final boolean codeCoverage; @@ -51,7 +49,10 @@ public class CiVisibilitySettings { private final boolean failedTestReplayEnabled; private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings; private final TestManagementSettings testManagementSettings; - @Nullable private final String defaultBranch; + + @Nullable + private final String defaultBranch; + private final boolean settingsRequestError; CiVisibilitySettings( diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java index ba174b60ffb..bd5110f4b79 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java @@ -10,36 +10,35 @@ public interface ConfigurationApi { - ConfigurationApi NO_OP = - new ConfigurationApi() { - @Override - public CiVisibilitySettings getSettings(TracerEnvironment tracerEnvironment) { - return CiVisibilitySettings.DEFAULT; - } - - @Override - public SkippableTests getSkippableTests(TracerEnvironment tracerEnvironment) { - return SkippableTests.EMPTY; - } - - @Override - public Map> getFlakyTestsByModule( - TracerEnvironment tracerEnvironment) { - return Collections.emptyMap(); - } - - @Override - public Map> getKnownTestsByModule( - TracerEnvironment tracerEnvironment) { - return Collections.emptyMap(); - } - - @Override - public Map>> getTestManagementTestsByModule( - TracerEnvironment tracerEnvironment, String commitSha, String commitMessage) { - return Collections.emptyMap(); - } - }; + ConfigurationApi NO_OP = new ConfigurationApi() { + @Override + public CiVisibilitySettings getSettings(TracerEnvironment tracerEnvironment) { + return CiVisibilitySettings.DEFAULT; + } + + @Override + public SkippableTests getSkippableTests(TracerEnvironment tracerEnvironment) { + return SkippableTests.EMPTY; + } + + @Override + public Map> getFlakyTestsByModule( + TracerEnvironment tracerEnvironment) { + return Collections.emptyMap(); + } + + @Override + public Map> getKnownTestsByModule( + TracerEnvironment tracerEnvironment) { + return Collections.emptyMap(); + } + + @Override + public Map>> getTestManagementTestsByModule( + TracerEnvironment tracerEnvironment, String commitSha, String commitMessage) { + return Collections.emptyMap(); + } + }; CiVisibilitySettings getSettings(TracerEnvironment tracerEnvironment) throws IOException; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java index 49665328c12..1ebb65ed71e 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java @@ -104,26 +104,23 @@ private static ParameterizedType multiEnvelopeOf(Class attributesType) { @Override public CiVisibilitySettings getSettings(TracerEnvironment tracerEnvironment) throws IOException { String uuid = uuidGenerator.get(); - Envelope settingsRequest = - new Envelope<>( - new Data<>(uuid, "ci_app_test_service_libraries_settings", tracerEnvironment)); + Envelope settingsRequest = new Envelope<>( + new Data<>(uuid, "ci_app_test_service_libraries_settings", tracerEnvironment)); String json = requestAdapter.toJson(settingsRequest); RequestBody requestBody = RequestBody.create(JSON, json); - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.GIT_REQUESTS_SETTINGS) - .requestErrors(CiVisibilityCountMetric.GIT_REQUESTS_SETTINGS_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.GIT_REQUESTS_SETTINGS_MS) - .build(); - - CiVisibilitySettings settings = - backendApi.post( - SETTINGS_URI, - requestBody, - is -> settingsResponseAdapter.fromJson(Okio.buffer(Okio.source(is))).data.attributes, - telemetryListener, - false); + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.GIT_REQUESTS_SETTINGS) + .requestErrors(CiVisibilityCountMetric.GIT_REQUESTS_SETTINGS_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.GIT_REQUESTS_SETTINGS_MS) + .build(); + + CiVisibilitySettings settings = backendApi.post( + SETTINGS_URI, + requestBody, + is -> settingsResponseAdapter.fromJson(Okio.buffer(Okio.source(is))).data.attributes, + telemetryListener, + false); metricCollector.add( CiVisibilityCountMetric.GIT_REQUESTS_SETTINGS_RESPONSE, @@ -146,26 +143,24 @@ public CiVisibilitySettings getSettings(TracerEnvironment tracerEnvironment) thr @Override public SkippableTests getSkippableTests(TracerEnvironment tracerEnvironment) throws IOException { - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.ITR_SKIPPABLE_TESTS_REQUEST) - .requestErrors(CiVisibilityCountMetric.ITR_SKIPPABLE_TESTS_REQUEST_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.ITR_SKIPPABLE_TESTS_REQUEST_MS) - .responseBytes(CiVisibilityDistributionMetric.ITR_SKIPPABLE_TESTS_RESPONSE_BYTES) - .build(); + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.ITR_SKIPPABLE_TESTS_REQUEST) + .requestErrors(CiVisibilityCountMetric.ITR_SKIPPABLE_TESTS_REQUEST_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.ITR_SKIPPABLE_TESTS_REQUEST_MS) + .responseBytes(CiVisibilityDistributionMetric.ITR_SKIPPABLE_TESTS_RESPONSE_BYTES) + .build(); String uuid = uuidGenerator.get(); Envelope request = new Envelope<>(new Data<>(uuid, "test_params", tracerEnvironment)); String json = requestAdapter.toJson(request); RequestBody requestBody = RequestBody.create(JSON, json); - MultiEnvelope response = - backendApi.post( - SKIPPABLE_TESTS_URI, - requestBody, - is -> testIdentifiersResponseAdapter.fromJson(Okio.buffer(Okio.source(is))), - telemetryListener, - false); + MultiEnvelope response = backendApi.post( + SKIPPABLE_TESTS_URI, + requestBody, + is -> testIdentifiersResponseAdapter.fromJson(Okio.buffer(Okio.source(is))), + telemetryListener, + false); metricCollector.add( CiVisibilityCountMetric.ITR_SKIPPABLE_TESTS_RESPONSE_TESTS, response.data.size()); @@ -176,32 +171,31 @@ public SkippableTests getSkippableTests(TracerEnvironment tracerEnvironment) thr @Override public Map> getFlakyTestsByModule(TracerEnvironment tracerEnvironment) throws IOException { - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.FLAKY_TESTS_REQUEST) - .requestErrors(CiVisibilityCountMetric.FLAKY_TESTS_REQUEST_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.FLAKY_TESTS_REQUEST_MS) - .responseBytes(CiVisibilityDistributionMetric.FLAKY_TESTS_RESPONSE_BYTES) - .build(); + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.FLAKY_TESTS_REQUEST) + .requestErrors(CiVisibilityCountMetric.FLAKY_TESTS_REQUEST_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.FLAKY_TESTS_REQUEST_MS) + .responseBytes(CiVisibilityDistributionMetric.FLAKY_TESTS_RESPONSE_BYTES) + .build(); String uuid = uuidGenerator.get(); Envelope request = new Envelope<>(new Data<>(uuid, "flaky_test_from_libraries_params", tracerEnvironment)); String json = requestAdapter.toJson(request); RequestBody requestBody = RequestBody.create(JSON, json); - Collection> response = - backendApi.post( - FLAKY_TESTS_URI, - requestBody, - is -> testIdentifiersResponseAdapter.fromJson(Okio.buffer(Okio.source(is))).data, - telemetryListener, - false); + Collection> response = backendApi.post( + FLAKY_TESTS_URI, + requestBody, + is -> testIdentifiersResponseAdapter.fromJson(Okio.buffer(Okio.source(is))).data, + telemetryListener, + false); LOGGER.debug("Received {} flaky tests in total", response.size()); Map> testsByModule = TestIdentifierJson.toTestFQNsByModule(response, tracerEnvironment); - int flakyTestsCount = testsByModule.values().stream().mapToInt(Collection::size).sum(); + int flakyTestsCount = + testsByModule.values().stream().mapToInt(Collection::size).sum(); metricCollector.add(CiVisibilityDistributionMetric.FLAKY_TESTS_RESPONSE_TESTS, flakyTestsCount); return testsByModule; } @@ -210,13 +204,12 @@ public Map> getFlakyTestsByModule(TracerEnvironment @Override public Map> getKnownTestsByModule(TracerEnvironment tracerEnvironment) throws IOException { - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.KNOWN_TESTS_REQUEST) - .requestErrors(CiVisibilityCountMetric.KNOWN_TESTS_REQUEST_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.KNOWN_TESTS_REQUEST_MS) - .responseBytes(CiVisibilityDistributionMetric.KNOWN_TESTS_RESPONSE_BYTES) - .build(); + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.KNOWN_TESTS_REQUEST) + .requestErrors(CiVisibilityCountMetric.KNOWN_TESTS_REQUEST_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.KNOWN_TESTS_REQUEST_MS) + .responseBytes(CiVisibilityDistributionMetric.KNOWN_TESTS_RESPONSE_BYTES) + .build(); // Aggregate tests map across all pages: module -> suite -> tests Map>> aggregateTests = new HashMap<>(); @@ -233,16 +226,12 @@ public Map> getKnownTestsByModule(TracerEnvironment new Envelope<>(new Data<>(uuid, "ci_app_libraries_tests_request", requestDto)); String json = knownTestsRequestAdapter.toJson(request); RequestBody requestBody = RequestBody.create(JSON, json); - KnownTestsResponse knownTests = - backendApi.post( - KNOWN_TESTS_URI, - requestBody, - is -> - testFullNamesResponseAdapter.fromJson(Okio.buffer(Okio.source(is))) - .data - .attributes, - telemetryListener, - false); + KnownTestsResponse knownTests = backendApi.post( + KNOWN_TESTS_URI, + requestBody, + is -> testFullNamesResponseAdapter.fromJson(Okio.buffer(Okio.source(is))).data.attributes, + telemetryListener, + false); mergeKnownTests(aggregateTests, knownTests.tests); @@ -260,10 +249,9 @@ public Map> getKnownTestsByModule(TracerEnvironment Map> testsByModule = KnownTestsResponse.toTestFQNsByModule(aggregateTests); - int knownTestsCount = - testsByModule != null - ? testsByModule.values().stream().mapToInt(Collection::size).sum() - : 0; + int knownTestsCount = testsByModule != null + ? testsByModule.values().stream().mapToInt(Collection::size).sum() + : 0; LOGGER.debug("Received {} known tests in total", knownTestsCount); metricCollector.add(CiVisibilityDistributionMetric.KNOWN_TESTS_RESPONSE_TESTS, knownTestsCount); // returning null disables features that rely on known tests; this is intentional on the very @@ -288,13 +276,10 @@ private void mergeKnownTests( String suiteName = suiteEntry.getKey(); List pageTests = suiteEntry.getValue(); - aggregateSuites.merge( - suiteName, - pageTests, - (existingTests, newTests) -> { - existingTests.addAll(newTests); - return existingTests; - }); + aggregateSuites.merge(suiteName, pageTests, (existingTests, newTests) -> { + existingTests.addAll(newTests); + return existingTests; + }); } } } @@ -303,38 +288,33 @@ private void mergeKnownTests( public Map>> getTestManagementTestsByModule( TracerEnvironment tracerEnvironment, String commitSha, String commitMessage) throws IOException { - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.TEST_MANAGEMENT_TESTS_REQUEST) - .requestErrors(CiVisibilityCountMetric.TEST_MANAGEMENT_TESTS_REQUEST_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.TEST_MANAGEMENT_TESTS_REQUEST_MS) - .responseBytes(CiVisibilityDistributionMetric.TEST_MANAGEMENT_TESTS_RESPONSE_BYTES) - .build(); + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.TEST_MANAGEMENT_TESTS_REQUEST) + .requestErrors(CiVisibilityCountMetric.TEST_MANAGEMENT_TESTS_REQUEST_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.TEST_MANAGEMENT_TESTS_REQUEST_MS) + .responseBytes(CiVisibilityDistributionMetric.TEST_MANAGEMENT_TESTS_RESPONSE_BYTES) + .build(); String uuid = uuidGenerator.get(); - Envelope request = - new Envelope<>( - new Data<>( - uuid, - "ci_app_libraries_tests_request", - new TestManagementRequest( - tracerEnvironment.getRepositoryUrl(), - commitMessage, - tracerEnvironment.getConfigurations().getTestBundle(), - commitSha, - tracerEnvironment.getBranch()))); + Envelope request = new Envelope<>(new Data<>( + uuid, + "ci_app_libraries_tests_request", + new TestManagementRequest( + tracerEnvironment.getRepositoryUrl(), + commitMessage, + tracerEnvironment.getConfigurations().getTestBundle(), + commitSha, + tracerEnvironment.getBranch()))); String json = testManagementRequestAdapter.toJson(request); RequestBody requestBody = RequestBody.create(JSON, json); - TestManagementTestsResponse response = - backendApi.post( - TEST_MANAGEMENT_TESTS_URI, - requestBody, - is -> - testManagementTestsResponseAdapter.fromJson(Okio.buffer(Okio.source(is))) - .data - .attributes, - telemetryListener, - false); + TestManagementTestsResponse response = backendApi.post( + TEST_MANAGEMENT_TESTS_URI, + requestBody, + is -> testManagementTestsResponseAdapter.fromJson(Okio.buffer(Okio.source(is))) + .data + .attributes, + telemetryListener, + false); int testsCount = response.totalTestsCount(); LOGGER.debug("Received {} test management tests in total", testsCount); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationErrors.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationErrors.java index f488468f2f4..06060bd4f22 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationErrors.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationErrors.java @@ -60,13 +60,11 @@ public void applyTags(AgentSpan span) { } public static void serialize(Serializer s, ConfigurationErrors errors) { - byte flags = - (byte) - ((errors.settings ? SETTINGS_FLAG : 0) - | (errors.skippableTests ? SKIPPABLE_TESTS_FLAG : 0) - | (errors.flakyTests ? FLAKY_TESTS_FLAG : 0) - | (errors.knownTests ? KNOWN_TESTS_FLAG : 0) - | (errors.testManagementTests ? TEST_MANAGEMENT_TESTS_FLAG : 0)); + byte flags = (byte) ((errors.settings ? SETTINGS_FLAG : 0) + | (errors.skippableTests ? SKIPPABLE_TESTS_FLAG : 0) + | (errors.flakyTests ? FLAKY_TESTS_FLAG : 0) + | (errors.knownTests ? KNOWN_TESTS_FLAG : 0) + | (errors.testManagementTests ? TEST_MANAGEMENT_TESTS_FLAG : 0)); s.write(flags); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettings.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettings.java index 36e48401132..3d1ef75ee99 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettings.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettings.java @@ -19,49 +19,47 @@ /** Settings and tests data received from the backend. */ public class ExecutionSettings { - public static final ExecutionSettings EMPTY = - new ExecutionSettings( - false, - false, - false, - false, - false, - false, - false, - EarlyFlakeDetectionSettings.DEFAULT, - TestManagementSettings.DEFAULT, - null, - Collections.emptyMap(), - Collections.emptyMap(), - null, - null, - Collections.emptyList(), - Collections.emptyList(), - Collections.emptyList(), - LineDiff.EMPTY, - ConfigurationErrors.NONE); - - public static final ExecutionSettings SETTINGS_REQUEST_ERROR = - new ExecutionSettings( - false, - false, - false, - false, - false, - false, - false, - EarlyFlakeDetectionSettings.DEFAULT, - TestManagementSettings.DEFAULT, - null, - Collections.emptyMap(), - Collections.emptyMap(), - null, - null, - Collections.emptyList(), - Collections.emptyList(), - Collections.emptyList(), - LineDiff.EMPTY, - new ConfigurationErrors(true, false, false, false, false)); + public static final ExecutionSettings EMPTY = new ExecutionSettings( + false, + false, + false, + false, + false, + false, + false, + EarlyFlakeDetectionSettings.DEFAULT, + TestManagementSettings.DEFAULT, + null, + Collections.emptyMap(), + Collections.emptyMap(), + null, + null, + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), + LineDiff.EMPTY, + ConfigurationErrors.NONE); + + public static final ExecutionSettings SETTINGS_REQUEST_ERROR = new ExecutionSettings( + false, + false, + false, + false, + false, + false, + false, + EarlyFlakeDetectionSettings.DEFAULT, + TestManagementSettings.DEFAULT, + null, + Collections.emptyMap(), + Collections.emptyMap(), + null, + null, + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), + LineDiff.EMPTY, + new ConfigurationErrors(true, false, false, false, false)); private final boolean itrEnabled; private final boolean codeCoverageEnabled; @@ -70,15 +68,33 @@ public class ExecutionSettings { private final boolean impactedTestsDetectionEnabled; private final boolean codeCoverageReportUploadEnabled; private final boolean failedTestReplayEnabled; - @Nonnull private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings; - @Nonnull private final TestManagementSettings testManagementSettings; - @Nullable private final String itrCorrelationId; - @Nonnull private final Map skippableTests; - @Nonnull private final Map skippableTestsCoverage; - @Nonnull private final Map testSettings; - @Nonnull private final Map settingsCount; - @Nonnull private final Diff pullRequestDiff; - @Nonnull private final ConfigurationErrors configurationErrors; + + @Nonnull + private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings; + + @Nonnull + private final TestManagementSettings testManagementSettings; + + @Nullable + private final String itrCorrelationId; + + @Nonnull + private final Map skippableTests; + + @Nonnull + private final Map skippableTestsCoverage; + + @Nonnull + private final Map testSettings; + + @Nonnull + private final Map settingsCount; + + @Nonnull + private final Diff pullRequestDiff; + + @Nonnull + private final ConfigurationErrors configurationErrors; public ExecutionSettings( boolean itrEnabled, @@ -344,19 +360,15 @@ public static ByteBuffer serialize(ExecutionSettings settings) { datadog.trace.civisibility.ipc.serialization.Serializer s = new datadog.trace.civisibility.ipc.serialization.Serializer(); - byte flags = - (byte) - ((settings.itrEnabled ? ITR_ENABLED_FLAG : 0) - | (settings.codeCoverageEnabled ? CODE_COVERAGE_ENABLED_FLAG : 0) - | (settings.testSkippingEnabled ? TEST_SKIPPING_ENABLED_FLAG : 0) - | (settings.flakyTestRetriesEnabled ? FLAKY_TEST_RETRIES_ENABLED_FLAG : 0) - | (settings.impactedTestsDetectionEnabled - ? IMPACTED_TESTS_DETECTION_ENABLED_FLAG - : 0) - | (settings.codeCoverageReportUploadEnabled - ? CODE_COVERAGE_REPORT_UPLOAD_ENABLED_FLAG - : 0) - | (settings.failedTestReplayEnabled ? FAILED_TEST_REPLAY_ENABLED_FLAG : 0)); + byte flags = (byte) ((settings.itrEnabled ? ITR_ENABLED_FLAG : 0) + | (settings.codeCoverageEnabled ? CODE_COVERAGE_ENABLED_FLAG : 0) + | (settings.testSkippingEnabled ? TEST_SKIPPING_ENABLED_FLAG : 0) + | (settings.flakyTestRetriesEnabled ? FLAKY_TEST_RETRIES_ENABLED_FLAG : 0) + | (settings.impactedTestsDetectionEnabled ? IMPACTED_TESTS_DETECTION_ENABLED_FLAG : 0) + | (settings.codeCoverageReportUploadEnabled + ? CODE_COVERAGE_REPORT_UPLOAD_ENABLED_FLAG + : 0) + | (settings.failedTestReplayEnabled ? FAILED_TEST_REPLAY_ENABLED_FLAG : 0)); s.write(flags); ConfigurationErrors.serialize(s, settings.configurationErrors); @@ -428,13 +440,12 @@ public static ExecutionSettings deserialize(ByteBuffer buffer) { TestFQNSerializer::deserialize, datadog.trace.civisibility.ipc.serialization.Serializer::readInt); - EnumMap settingsCount = - (EnumMap) - datadog.trace.civisibility.ipc.serialization.Serializer.readMap( - buffer, - () -> new EnumMap<>(TestSetting.class), - TestSetting.Serializer::deserialize, - datadog.trace.civisibility.ipc.serialization.Serializer::readInt); + EnumMap settingsCount = (EnumMap) + datadog.trace.civisibility.ipc.serialization.Serializer.readMap( + buffer, + () -> new EnumMap<>(TestSetting.class), + TestSetting.Serializer::deserialize, + datadog.trace.civisibility.ipc.serialization.Serializer::readInt); Diff diff = Diff.SERIALIZER.deserialize(buffer); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java index b5ff526b2c4..c2bd0081176 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java @@ -56,7 +56,9 @@ public class ExecutionSettingsFactoryImpl implements ExecutionSettingsFactory { private final GitRepoUnshallow gitRepoUnshallow; private final GitDataUploader gitDataUploader; private final PullRequestInfo pullRequestInfo; - @Nullable private final String repositoryRoot; + + @Nullable + private final String repositoryRoot; public ExecutionSettingsFactoryImpl( Config config, @@ -152,49 +154,40 @@ private Map doCreate( return Collections.singletonMap(DEFAULT_SETTINGS, ExecutionSettings.SETTINGS_REQUEST_ERROR); } - boolean itrEnabled = - isFeatureEnabled( - settings, CiVisibilitySettings::isItrEnabled, Config::isCiVisibilityItrEnabled); - boolean codeCoverageEnabled = - isFeatureEnabled( - settings, - CiVisibilitySettings::isCodeCoverageEnabled, - Config::isCiVisibilityCodeCoverageEnabled); - boolean testSkippingEnabled = - isFeatureEnabled( - settings, - CiVisibilitySettings::isTestsSkippingEnabled, - Config::isCiVisibilityTestSkippingEnabled); - boolean flakyTestRetriesEnabled = - isFeatureEnabled( - settings, - CiVisibilitySettings::isFlakyTestRetriesEnabled, - Config::isCiVisibilityFlakyRetryEnabled); - boolean impactedTestsEnabled = - isFeatureEnabled( - settings, - CiVisibilitySettings::isImpactedTestsDetectionEnabled, - Config::isCiVisibilityImpactedTestsDetectionEnabled); - boolean earlyFlakeDetectionEnabled = - isFeatureEnabled( - settings, - s -> s.getEarlyFlakeDetectionSettings().isEnabled(), - Config::isCiVisibilityEarlyFlakeDetectionEnabled); - boolean knownTestsRequest = - isFeatureEnabled( - settings, - CiVisibilitySettings::isKnownTestsEnabled, - Config::isCiVisibilityKnownTestsRequestEnabled); - boolean codeCoverageReportUpload = - isFeatureEnabled( - settings, - CiVisibilitySettings::isCoverageReportUploadEnabled, - Config::isCiVisibilityCodeCoverageReportUploadEnabled); - boolean failedTestReplayEnabled = - isFeatureEnabled( - settings, - CiVisibilitySettings::isFailedTestReplayEnabled, - Config::isCiVisibilityFailedTestReplayEnabled); + boolean itrEnabled = isFeatureEnabled( + settings, CiVisibilitySettings::isItrEnabled, Config::isCiVisibilityItrEnabled); + boolean codeCoverageEnabled = isFeatureEnabled( + settings, + CiVisibilitySettings::isCodeCoverageEnabled, + Config::isCiVisibilityCodeCoverageEnabled); + boolean testSkippingEnabled = isFeatureEnabled( + settings, + CiVisibilitySettings::isTestsSkippingEnabled, + Config::isCiVisibilityTestSkippingEnabled); + boolean flakyTestRetriesEnabled = isFeatureEnabled( + settings, + CiVisibilitySettings::isFlakyTestRetriesEnabled, + Config::isCiVisibilityFlakyRetryEnabled); + boolean impactedTestsEnabled = isFeatureEnabled( + settings, + CiVisibilitySettings::isImpactedTestsDetectionEnabled, + Config::isCiVisibilityImpactedTestsDetectionEnabled); + boolean earlyFlakeDetectionEnabled = isFeatureEnabled( + settings, + s -> s.getEarlyFlakeDetectionSettings().isEnabled(), + Config::isCiVisibilityEarlyFlakeDetectionEnabled); + boolean knownTestsRequest = isFeatureEnabled( + settings, + CiVisibilitySettings::isKnownTestsEnabled, + Config::isCiVisibilityKnownTestsRequestEnabled); + boolean codeCoverageReportUpload = isFeatureEnabled( + settings, + CiVisibilitySettings::isCoverageReportUploadEnabled, + Config::isCiVisibilityCodeCoverageReportUploadEnabled); + boolean failedTestReplayEnabled = isFeatureEnabled( + settings, + CiVisibilitySettings::isFailedTestReplayEnabled, + Config::isCiVisibilityFailedTestReplayEnabled); TestManagementSettings testManagementSettings = getTestManagementSettings(settings); @@ -230,26 +223,17 @@ private Map doCreate( AtomicBoolean knownTestsError = new AtomicBoolean(); AtomicBoolean testManagementTestsError = new AtomicBoolean(); - Future skippableTestsFuture = - executor.submit( - () -> getSkippableTests(tracerEnvironment, itrEnabled, skippableTestsError)); - Future>> flakyTestsFuture = - executor.submit( - () -> - getFlakyTestsByModule(tracerEnvironment, flakyTestRetriesEnabled, flakyTestsError)); - Future>> knownTestsFuture = - executor.submit( - () -> getKnownTestsByModule(tracerEnvironment, knownTestsRequest, knownTestsError)); + Future skippableTestsFuture = executor.submit( + () -> getSkippableTests(tracerEnvironment, itrEnabled, skippableTestsError)); + Future>> flakyTestsFuture = executor.submit( + () -> getFlakyTestsByModule(tracerEnvironment, flakyTestRetriesEnabled, flakyTestsError)); + Future>> knownTestsFuture = executor.submit( + () -> getKnownTestsByModule(tracerEnvironment, knownTestsRequest, knownTestsError)); Future>>> testManagementTestsFuture = - executor.submit( - () -> - getTestManagementTestsByModule( - tracerEnvironment, - testManagementSettings.isEnabled(), - testManagementTestsError)); - Future pullRequestDiffFuture = - executor.submit( - () -> getPullRequestDiff(impactedTestsEnabled, settings.getDefaultBranch())); + executor.submit(() -> getTestManagementTestsByModule( + tracerEnvironment, testManagementSettings.isEnabled(), testManagementTestsError)); + Future pullRequestDiffFuture = executor.submit( + () -> getPullRequestDiff(impactedTestsEnabled, settings.getDefaultBranch())); SkippableTests skippableTests = skippableTestsFuture.get(); Map> flakyTestsByModule = flakyTestsFuture.get(); @@ -267,23 +251,21 @@ private Map doCreate( Diff pullRequestDiff = pullRequestDiffFuture.get(); - ConfigurationErrors configurationErrors = - new ConfigurationErrors( - false, - skippableTestsError.get(), - flakyTestsError.get(), - knownTestsError.get(), - testManagementTestsError.get()); + ConfigurationErrors configurationErrors = new ConfigurationErrors( + false, + skippableTestsError.get(), + flakyTestsError.get(), + knownTestsError.get(), + testManagementTestsError.get()); Map settingsByModule = new HashMap<>(); - Set moduleNames = - getModuleNames( - skippableTests, - flakyTestsByModule, - knownTestsByModule, - quarantinedTestsByModule, - disabledTestsByModule, - attemptToFixTestsByModule); + Set moduleNames = getModuleNames( + skippableTests, + flakyTestsByModule, + knownTestsByModule, + quarantinedTestsByModule, + disabledTestsByModule, + attemptToFixTestsByModule); for (String moduleName : moduleNames) { settingsByModule.put( @@ -347,11 +329,10 @@ private boolean isFeatureEnabled( @Nonnull private TestManagementSettings getTestManagementSettings(CiVisibilitySettings settings) { - boolean testManagementEnabled = - isFeatureEnabled( - settings, - s -> s.getTestManagementSettings().isEnabled(), - Config::isCiVisibilityTestManagementEnabled); + boolean testManagementEnabled = isFeatureEnabled( + settings, + s -> s.getTestManagementSettings().isEnabled(), + Config::isCiVisibilityTestManagementEnabled); if (!testManagementEnabled) { return TestManagementSettings.DEFAULT; @@ -380,11 +361,10 @@ private SkippableTests getSkippableTests( SkippableTests skippableTests = configurationApi.getSkippableTests(tracerEnvironment); if (LOGGER.isDebugEnabled()) { - int totalSkippableTests = - skippableTests.getIdentifiersByModule().values().stream() - .filter(Objects::nonNull) - .mapToInt(Map::size) - .sum(); + int totalSkippableTests = skippableTests.getIdentifiersByModule().values().stream() + .filter(Objects::nonNull) + .mapToInt(Map::size) + .sum(); LOGGER.debug( "Received {} skippable tests in total for {}", totalSkippableTests, @@ -478,9 +458,9 @@ private Diff getPullRequestDiff(boolean impactedTestsDetectionEnabled, String de String baseCommitSha = pullRequestInfo.getBaseBranchSha(); if (baseCommitSha == null && pullRequestInfo.getBaseBranchHeadSha() != null) { - baseCommitSha = - gitClient.getMergeBase( - pullRequestInfo.getBaseBranchHeadSha(), pullRequestInfo.getHeadCommit().getSha()); + baseCommitSha = gitClient.getMergeBase( + pullRequestInfo.getBaseBranchHeadSha(), + pullRequestInfo.getHeadCommit().getSha()); } if (baseCommitSha == null) { @@ -488,7 +468,8 @@ private Diff getPullRequestDiff(boolean impactedTestsDetectionEnabled, String de gitClient.getBaseCommitSha(pullRequestInfo.getBaseBranch(), defaultBranch); } - Diff diff = gitClient.getGitDiff(baseCommitSha, pullRequestInfo.getHeadCommit().getSha()); + Diff diff = + gitClient.getGitDiff(baseCommitSha, pullRequestInfo.getHeadCommit().getSha()); if (diff != null) { return diff; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/FileBasedConfigurationApi.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/FileBasedConfigurationApi.java index 9e28ea35c35..d79f679ee04 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/FileBasedConfigurationApi.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/FileBasedConfigurationApi.java @@ -32,11 +32,20 @@ public class FileBasedConfigurationApi implements ConfigurationApi { private static final Logger LOGGER = LoggerFactory.getLogger(FileBasedConfigurationApi.class); - @Nullable private final Path settingsPath; - @Nullable private final Path skippableTestsPath; - @Nullable private final Path flakyTestsPath; - @Nullable private final Path knownTestsPath; - @Nullable private final Path testManagementPath; + @Nullable + private final Path settingsPath; + + @Nullable + private final Path skippableTestsPath; + + @Nullable + private final Path flakyTestsPath; + + @Nullable + private final Path knownTestsPath; + + @Nullable + private final Path testManagementPath; private final JsonAdapter> settingsAdapter; private final JsonAdapter> knownTestsAdapter; @@ -114,7 +123,8 @@ public Map> getFlakyTestsByModule(TracerEnvironment Map> result = TestIdentifierJson.toTestFQNsByModule(envelope.data, tracerEnvironment); LOGGER.debug( - "Read {} flaky tests from file", result.values().stream().mapToInt(Collection::size).sum()); + "Read {} flaky tests from file", + result.values().stream().mapToInt(Collection::size).sum()); return result; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/JvmInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/JvmInfo.java index 919a53df2ed..0aebab054a1 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/JvmInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/JvmInfo.java @@ -13,11 +13,10 @@ public class JvmInfo { static { Config config = Config.get(); CiVisibilityWellKnownTags wellKnownTags = config.getCiVisibilityWellKnownTags(); - CURRENT_JVM = - new JvmInfo( - wellKnownTags.getRuntimeName().toString(), - wellKnownTags.getRuntimeVersion().toString(), - wellKnownTags.getRuntimeVendor().toString()); + CURRENT_JVM = new JvmInfo( + wellKnownTags.getRuntimeName().toString(), + wellKnownTags.getRuntimeVersion().toString(), + wellKnownTags.getRuntimeVendor().toString()); } private final String name; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/SkippableTests.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/SkippableTests.java index 9e146766d6f..bceb4f04654 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/SkippableTests.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/SkippableTests.java @@ -65,10 +65,9 @@ public static SkippableTests from( } String correlationId = envelope.meta != null ? envelope.meta.correlationId : null; - Map coverage = - envelope.meta != null && envelope.meta.coverage != null - ? envelope.meta.coverage - : Collections.emptyMap(); + Map coverage = envelope.meta != null && envelope.meta.coverage != null + ? envelope.meta.coverage + : Collections.emptyMap(); return new SkippableTests(correlationId, identifiersByModule, coverage); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/MultiEnvelope.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/MultiEnvelope.java index 2138be6960a..fd399cde5ae 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/MultiEnvelope.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/MultiEnvelope.java @@ -6,7 +6,9 @@ public final class MultiEnvelope { public final Collection> data; - @Nullable public final Meta meta; + + @Nullable + public final Meta meta; public MultiEnvelope(Collection> data, @Nullable Meta meta) { this.data = data; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/Meta.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/Meta.java index db52634ebb7..3fbd8deb9e3 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/Meta.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/Meta.java @@ -11,8 +11,11 @@ public final class Meta { - @Nullable public final String correlationId; - @Nullable public final Map coverage; + @Nullable + public final String correlationId; + + @Nullable + public final Map coverage; public Meta(@Nullable String correlationId, @Nullable Map coverage) { this.correlationId = correlationId; @@ -36,10 +39,9 @@ public Meta fromJson(Map json) { coverage = new HashMap<>(); for (Map.Entry e : encodedCoverage.entrySet()) { String relativeSourceFilePath = e.getKey(); - String normalizedPath = - relativeSourceFilePath.startsWith(File.separator) - ? relativeSourceFilePath.substring(1) - : relativeSourceFilePath; + String normalizedPath = relativeSourceFilePath.startsWith(File.separator) + ? relativeSourceFilePath.substring(1) + : relativeSourceFilePath; byte[] decodedLines = Base64.getDecoder().decode(e.getValue()); coverage.put(normalizedPath, BitSet.valueOf(decodedLines)); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/TestManagementTestsResponse.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/TestManagementTestsResponse.java index 1370f9de162..b658b740759 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/TestManagementTestsResponse.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/api/dto/response/TestManagementTestsResponse.java @@ -12,7 +12,8 @@ public final class TestManagementTestsResponse { - @Nullable public Map modules; + @Nullable + public Map modules; public Map getModules() { return modules != null ? modules : Collections.emptyMap(); @@ -31,7 +32,8 @@ public Map>> toTestFQNsBySetting() for (Map.Entry moduleEntry : getModules().entrySet()) { String moduleName = moduleEntry.getKey(); - for (Map.Entry suiteEntry : moduleEntry.getValue().getSuites().entrySet()) { + for (Map.Entry suiteEntry : + moduleEntry.getValue().getSuites().entrySet()) { String suiteName = suiteEntry.getKey(); for (Map.Entry testEntry : suiteEntry.getValue().getTests().entrySet()) { @@ -74,7 +76,8 @@ public int totalTestsCount() { } public static final class Properties { - @Nullable public Map properties; + @Nullable + public Map properties; public boolean isQuarantined() { return properties != null @@ -92,7 +95,8 @@ public boolean isAttemptToFix() { } public static final class Tests { - @Nullable public Map tests; + @Nullable + public Map tests; public Map getTests() { return tests != null ? tests : Collections.emptyMap(); @@ -100,7 +104,8 @@ public Map getTests() { } public static final class Suites { - @Nullable public Map suites; + @Nullable + public Map suites; public Map getSuites() { return suites != null ? suites : Collections.emptyMap(); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java index bde89521dd5..15ef0fda817 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java @@ -84,7 +84,8 @@ protected TestReport report( Collection combinedNonCodeResources = new HashSet<>(); for (LineProbes probe : probes) { - for (Map.Entry, ExecutionDataAdapter> e : probe.getExecutionData().entrySet()) { + for (Map.Entry, ExecutionDataAdapter> e : + probe.getExecutionData().entrySet()) { combinedExecutionData.merge(e.getKey(), e.getValue(), ExecutionDataAdapter::merge); } combinedNonCodeResources.addAll(probe.getNonCodeResources()); @@ -112,7 +113,9 @@ protected TestReport report( BitSet coveredLines = analyzeClass(clazz, executionDataAdapter); if (coveredLines != null) { - coveredLinesBySourcePath.computeIfAbsent(sourcePath, key -> new BitSet()).or(coveredLines); + coveredLinesBySourcePath + .computeIfAbsent(sourcePath, key -> new BitSet()) + .or(coveredLines); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineProbes.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineProbes.java index f99c78e2c29..dff087ef9b1 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineProbes.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineProbes.java @@ -45,10 +45,9 @@ public void record(Class clazz, long classId, int probeId) { try { if (lastCoveredClass != clazz) { // optimization to avoid map lookup if activating several probes for same class in a row - lastCoveredExecutionData = - executionData.computeIfAbsent( - lastCoveredClass = clazz, - k -> new ExecutionDataAdapter(classId, k.getName(), probeCounts.get(k.getName()))); + lastCoveredExecutionData = executionData.computeIfAbsent( + lastCoveredClass = clazz, + k -> new ExecutionDataAdapter(classId, k.getName(), probeCounts.get(k.getName()))); } lastCoveredExecutionData.record(probeId); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/CoverageReportUploader.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/CoverageReportUploader.java index 7777a972a2a..1ea13690887 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/CoverageReportUploader.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/CoverageReportUploader.java @@ -62,20 +62,18 @@ public void upload(String format, InputStream reportStream) throws IOException { RequestBody coverageBody = new GzipMultipartRequestBody(reportStream); - MultipartBody multipartBody = - new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart("coverage", "coverage.gz", coverageBody) - .addFormDataPart("event", "event.json", eventBody) - .build(); - - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.COVERAGE_UPLOAD_REQUEST) - .requestBytes(CiVisibilityDistributionMetric.COVERAGE_UPLOAD_REQUEST_BYTES) - .requestErrors(CiVisibilityCountMetric.COVERAGE_UPLOAD_REQUEST_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.COVERAGE_UPLOAD_REQUEST_MS) - .build(); + MultipartBody multipartBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("coverage", "coverage.gz", coverageBody) + .addFormDataPart("event", "event.json", eventBody) + .build(); + + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.COVERAGE_UPLOAD_REQUEST) + .requestBytes(CiVisibilityDistributionMetric.COVERAGE_UPLOAD_REQUEST_BYTES) + .requestErrors(CiVisibilityCountMetric.COVERAGE_UPLOAD_REQUEST_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.COVERAGE_UPLOAD_REQUEST_MS) + .build(); backendApi.post("cicovreprt", multipartBody, responseStream -> null, telemetryListener, false); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/JacocoCoverageProcessor.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/JacocoCoverageProcessor.java index 0514dde7ab1..021827f5a98 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/JacocoCoverageProcessor.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/JacocoCoverageProcessor.java @@ -60,7 +60,10 @@ public static final class Factory implements CoverageProcessor.Factory getFrameworks(AgentSpan span) { } } else { - throw new IllegalArgumentException( - "Unexpected tag type(s): " - + Tags.TEST_FRAMEWORK - + " (" - + nameTag - + ") " - + Tags.TEST_FRAMEWORK_VERSION - + " (" - + versionTag - + ")"); + throw new IllegalArgumentException("Unexpected tag type(s): " + + Tags.TEST_FRAMEWORK + + " (" + + nameTag + + ") " + + Tags.TEST_FRAMEWORK_VERSION + + " (" + + versionTag + + ")"); } return frameworks; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java index e8f4aaf9f69..2b6a8cd02ca 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java @@ -109,12 +109,11 @@ public TestImpl( this.context = new TestContextImpl(coverageStore); AgentSpanContext traceContext = new TagContext(CIConstants.CIAPP_TEST_ORIGIN, null); - AgentTracer.SpanBuilder spanBuilder = - AgentTracer.get() - .buildSpan(CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test") - .ignoreActiveSpan() - .asChildOf(traceContext) - .withRequestContextData(RequestContextSlot.CI_VISIBILITY, context); + AgentTracer.SpanBuilder spanBuilder = AgentTracer.get() + .buildSpan(CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test") + .ignoreActiveSpan() + .asChildOf(traceContext) + .withRequestContextData(RequestContextSlot.CI_VISIBILITY, context); if (startTime != null) { startMicros = startTime; @@ -264,15 +263,14 @@ public void end(@Nullable Long endTime) { } if (activeSpan != this.span) { - throw new IllegalStateException( - "Active span does not correspond to the finished test, " - + "it is possible that end() was called multiple times " - + "or an operation that was started by the test is still in progress; " - + "active span is: " - + activeSpan - + "; " - + "expected span is: " - + this.span); + throw new IllegalStateException("Active span does not correspond to the finished test, " + + "it is possible that end() was called multiple times " + + "or an operation that was started by the test is still in progress; " + + "active span is: " + + activeSpan + + "; " + + "expected span is: " + + this.span); } InstrumentationTestBridge.fireBeforeTestEnd(context); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java index 3c4a6dc4242..f70aec168df 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java @@ -101,11 +101,9 @@ public TestSuiteImpl( this.capabilities = capabilities; this.onSpanFinish = onSpanFinish; - AgentTracer.SpanBuilder spanBuilder = - AgentTracer.get() - .buildSpan( - CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test_suite") - .asChildOf(moduleSpanContext); + AgentTracer.SpanBuilder spanBuilder = AgentTracer.get() + .buildSpan(CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test_suite") + .asChildOf(moduleSpanContext); if (startTime != null) { spanBuilder = spanBuilder.withStartTimestamp(startTime); @@ -214,15 +212,14 @@ public void end(@Nullable Long endTime) { } if (activeSpan != this.span) { - throw new IllegalStateException( - "Active span does not correspond to the finished suite, " - + "it is possible that end() was called multiple times " - + "or an operation that was started by the suite is still in progress; " - + "active span is: " - + activeSpan - + "; " - + "expected span is: " - + this.span); + throw new IllegalStateException("Active span does not correspond to the finished suite, " + + "it is possible that end() was called multiple times " + + "or an operation that was started by the suite is still in progress; " + + "active span is: " + + activeSpan + + "; " + + "expected span is: " + + this.span); } AgentTracer.closeActive(); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java index 48915cdb479..23686146854 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java @@ -86,9 +86,8 @@ public BuildSystemModuleImpl( codeowners, linesResolver, onSpanFinish); - this.coverageProcessor = - coverageProcessorFactory.moduleCoverage( - span.getSpanId(), moduleLayout, executionSettings, sessionCoverageCalculator); + this.coverageProcessor = coverageProcessorFactory.moduleCoverage( + span.getSpanId(), moduleLayout, executionSettings, sessionCoverageCalculator); this.moduleSignalRouter = moduleSignalRouter; moduleSignalRouter.registerModuleHandler( @@ -96,18 +95,16 @@ public BuildSystemModuleImpl( SignalType.MODULE_EXECUTION_RESULT, this::onModuleExecutionResultReceived); - settings = - new BuildModuleSettings( - getPropertiesPropagatedToChildProcess( - config.getServiceName(), - config.isServiceNameSetByUser(), - moduleName, - startCommand, - classpath, - jacocoAgent, - signalServerAddress, - executionSettings, - sessionSettings)); + settings = new BuildModuleSettings(getPropertiesPropagatedToChildProcess( + config.getServiceName(), + config.isServiceNameSetByUser(), + moduleName, + startCommand, + classpath, + jacocoAgent, + signalServerAddress, + executionSettings, + sessionSettings)); setTag(Tags.TEST_COMMAND, startCommand); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemSessionImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemSessionImpl.java index 5d050036e9b..799a2008750 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemSessionImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemSessionImpl.java @@ -89,11 +89,10 @@ public BuildSystemSessionImpl( ExecutionSettings executionSettings = executionSettingsFactory.create(JvmInfo.CURRENT_JVM, null); - this.settings = - new BuildSessionSettings( - executionSettings.isCodeCoverageReportUploadEnabled(), - getCoverageIncludedPackages(config, repoIndexProvider), - config.getCiVisibilityCodeCoverageExcludes()); + this.settings = new BuildSessionSettings( + executionSettings.isCodeCoverageReportUploadEnabled(), + getCoverageIncludedPackages(config, repoIndexProvider), + config.getCiVisibilityCodeCoverageExcludes()); signalServer.registerSignalHandler( SignalType.MODULE_EXECUTION_RESULT, moduleSignalRouter::onModuleSignalReceived); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ModuleSignalRouter.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ModuleSignalRouter.java index a0c1e6ee595..7e653f4deb0 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ModuleSignalRouter.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ModuleSignalRouter.java @@ -40,10 +40,9 @@ public SignalResponse onModuleSignalReceived(ModuleSignal result) { Map> handlersByType = moduleHandlersById.get(moduleId); if (handlersByType == null) { - String message = - String.format( - "Could not find signal handlers for module ID %s, test execution result will be ignored: %s", - moduleId, result); + String message = String.format( + "Could not find signal handlers for module ID %s, test execution result will be ignored: %s", + moduleId, result); LOGGER.warn(message); return new ErrorResponse(message); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java index 41107bbe923..048580b5adc 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java @@ -148,9 +148,8 @@ private void sendModuleExecutionResult() { long parentProcessModuleId = parentProcessModuleContext.getSpanId(); try (SignalClient signalClient = signalClientFactory.create()) { - ModuleSignal coverageSignal = - childProcessCoverageReporter.createCoverageSignal( - parentProcessSessionId, parentProcessModuleId); + ModuleSignal coverageSignal = childProcessCoverageReporter.createCoverageSignal( + parentProcessSessionId, parentProcessModuleId); if (coverageSignal != null) { signalClient.send(coverageSignal); } @@ -169,18 +168,17 @@ private void sendModuleExecutionResult() { boolean hasFailedTestReplayTests = executionResults.hasFailedTestReplayTests(); long testsSkippedTotal = executionResults.getTestsSkippedByItr(); - signalClient.send( - new ModuleExecutionResult( - parentProcessSessionId, - parentProcessModuleId, - coverageEnabled, - testSkippingEnabled, - earlyFlakeDetectionEnabled, - earlyFlakeDetectionFaulty, - testManagementEnabled, - hasFailedTestReplayTests, - testsSkippedTotal, - new TreeSet<>(testFrameworks))); + signalClient.send(new ModuleExecutionResult( + parentProcessSessionId, + parentProcessModuleId, + coverageEnabled, + testSkippingEnabled, + earlyFlakeDetectionEnabled, + earlyFlakeDetectionFaulty, + testManagementEnabled, + hasFailedTestReplayTests, + testsSkippedTotal, + new TreeSet<>(testFrameworks))); } catch (Exception e) { log.error("Error while reporting module execution result", e); @@ -219,9 +217,7 @@ public TestSuiteImpl testSuiteStart( } private void propagateTestFrameworkData(AgentSpan childSpan) { - testFrameworks.add( - new TestFramework( - (String) childSpan.getTag(Tags.TEST_FRAMEWORK), - (String) childSpan.getTag(Tags.TEST_FRAMEWORK_VERSION))); + testFrameworks.add(new TestFramework((String) childSpan.getTag(Tags.TEST_FRAMEWORK), (String) + childSpan.getTag(Tags.TEST_FRAMEWORK_VERSION))); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java index 8ca29a07079..47af756134e 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java @@ -63,29 +63,28 @@ public ManualApiTestSuite testSuiteStart( @Nullable Class testClass, @Nullable Long startTime, boolean parallelized) { - TestSuiteImpl suite = - new TestSuiteImpl( - span.spanContext(), - moduleName, - testSuiteName, - null, - false, - testClass, - startTime, - parallelized, - InstrumentationType.MANUAL_API, - TestFrameworkInstrumentation.OTHER, // for metric purposes, framework is OTHER - config, - metricCollector, - testDecorator, - sourcePathResolver, - codeowners, - linesResolver, - coverageStoreFactory, - executionResults, - ConfigurationErrors.NONE, - Collections.emptyList(), - tagsPropagator::propagateCiVisibilityTags); + TestSuiteImpl suite = new TestSuiteImpl( + span.spanContext(), + moduleName, + testSuiteName, + null, + false, + testClass, + startTime, + parallelized, + InstrumentationType.MANUAL_API, + TestFrameworkInstrumentation.OTHER, // for metric purposes, framework is OTHER + config, + metricCollector, + testDecorator, + sourcePathResolver, + codeowners, + linesResolver, + coverageStoreFactory, + executionResults, + ConfigurationErrors.NONE, + Collections.emptyList(), + tagsPropagator::propagateCiVisibilityTags); String frameworkName = testDecorator.component().toString(); suite.setTag(Tags.TEST_FRAMEWORK, frameworkName); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/BuildEventsHandlerImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/BuildEventsHandlerImpl.java index 75ea9a4291b..a74768b85eb 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/BuildEventsHandlerImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/BuildEventsHandlerImpl.java @@ -101,11 +101,8 @@ public void onBuildTaskStart( public void onBuildTaskFail(SessionKey sessionKey, String taskName, Throwable throwable) { AgentSpan buildTask = inProgressBuildTasks.get(new BuildTaskDescriptor<>(sessionKey, taskName)); if (buildTask == null) { - throw new IllegalStateException( - "Could not find build task span for session key " - + sessionKey - + " and task name " - + taskName); + throw new IllegalStateException("Could not find build task span for session key " + sessionKey + + " and task name " + taskName); } buildTask.setError(true); buildTask.addThrowable(throwable); @@ -115,11 +112,8 @@ public void onBuildTaskFail(SessionKey sessionKey, String taskName, Throwable th public void onBuildTaskFinish(SessionKey sessionKey, String taskName) { AgentSpan buildTask = inProgressBuildTasks.get(new BuildTaskDescriptor<>(sessionKey, taskName)); if (buildTask == null) { - throw new IllegalStateException( - "Could not find build task span for session key " - + sessionKey - + " and task name " - + taskName); + throw new IllegalStateException("Could not find build task span for session key " + sessionKey + + " and task name " + taskName); } buildTask.finish(); } @@ -136,9 +130,8 @@ public BuildModuleSettings onTestModuleStart( BuildSystemSession testSession = inProgressTestSessions.get(sessionKey); JvmInfo jvmInfo = jvmInfoFactory.getJvmInfo(jvmExecutable); - BuildSystemModule testModule = - testSession.testModuleStart( - moduleName, null, moduleLayout, jvmInfo, classpath, jacocoAgent); + BuildSystemModule testModule = testSession.testModuleStart( + moduleName, null, moduleLayout, jvmInfo, classpath, jacocoAgent); testModule.setTag(Tags.TEST_STATUS, TestStatus.pass); if (additionalTags != null) { @@ -187,11 +180,8 @@ public void onTestModuleFinish(SessionKey sessionKey, String moduleName) { new BuildTaskDescriptor<>(sessionKey, moduleName); BuildSystemModule testModule = inProgressTestModules.remove(testModuleDescriptor); if (testModule == null) { - throw new IllegalStateException( - "Could not find module span for session key " - + sessionKey - + " and module name " - + moduleName); + throw new IllegalStateException("Could not find module span for session key " + sessionKey + + " and module name " + moduleName); } testModule.end(null); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java index 0e237f02abb..930fd844daf 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java @@ -96,9 +96,8 @@ public void onTestSuiteStart( return; } - TestSuiteImpl testSuite = - testModule.testSuiteStart( - testSuiteName, testClass, startTime, parallelized, instrumentation); + TestSuiteImpl testSuite = testModule.testSuiteStart( + testSuiteName, testClass, startTime, parallelized, instrumentation); if (testFramework != null) { testSuite.setTag(Tags.TEST_FRAMEWORK, testFramework); @@ -176,11 +175,10 @@ public void onTestStart( TestSuiteImpl testSuite = inProgressTestSuites.get(suiteDescriptor); if (testSuite == null) { - throw new IllegalStateException( - "Could not find test suite with descriptor " - + suiteDescriptor - + "; test descriptor: " - + descriptor); + throw new IllegalStateException("Could not find test suite with descriptor " + + suiteDescriptor + + "; test descriptor: " + + descriptor); } TestImpl test = diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/LocalFSGitInfoExtractor.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/LocalFSGitInfoExtractor.java index 55832a06836..4a27d178e88 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/LocalFSGitInfoExtractor.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/LocalFSGitInfoExtractor.java @@ -130,14 +130,12 @@ private CommitInfo findCommit(final String gitFolder, final String sha) private GitPackObject readPackObject(final String gitFolder, final String sha) throws IOException { final File packFolder = Paths.get(gitFolder, "objects", "pack").toFile(); - final File[] idxFiles = - packFolder.listFiles( - new FilenameFilter() { - @Override - public boolean accept(final File dir, final String name) { - return name.endsWith(".idx"); - } - }); + final File[] idxFiles = packFolder.listFiles(new FilenameFilter() { + @Override + public boolean accept(final File dir, final String name) { + return name.endsWith(".idx"); + } + }); if (idxFiles == null) { return null; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataApi.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataApi.java index 9e70d1ffd34..6fc512def2b 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataApi.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataApi.java @@ -66,20 +66,18 @@ public Collection searchCommits(String gitRemoteUrl, List commit String json = searchCommitsRequestAdapter.toJson(searchCommitsRequest); RequestBody requestBody = RequestBody.create(JSON, json); - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.GIT_REQUESTS_SEARCH_COMMITS) - .requestErrors(CiVisibilityCountMetric.GIT_REQUESTS_SEARCH_COMMITS_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.GIT_REQUESTS_SEARCH_COMMITS_MS) - .build(); - - SearchCommitsResponse response = - backendApi.post( - SEARCH_COMMITS_URI, - requestBody, - is -> searchCommitsResponseAdapter.fromJson(Okio.buffer(Okio.source(is))), - telemetryListener, - false); + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.GIT_REQUESTS_SEARCH_COMMITS) + .requestErrors(CiVisibilityCountMetric.GIT_REQUESTS_SEARCH_COMMITS_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.GIT_REQUESTS_SEARCH_COMMITS_MS) + .build(); + + SearchCommitsResponse response = backendApi.post( + SEARCH_COMMITS_URI, + requestBody, + is -> searchCommitsResponseAdapter.fromJson(Okio.buffer(Okio.source(is))), + telemetryListener, + false); return response.data.stream().map(Commit::getId).collect(Collectors.toSet()); } @@ -104,24 +102,21 @@ public void uploadPackFile(String gitRemoteUrl, String currentCommitHash, Path p String packFileName = packFile.getFileName().toString(); String packFileNameWithoutRandomPrefix = packFileName.substring(packFileName.indexOf('-') + 1); - RequestBody requestBody = - new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart("pushedSha", "pushedSha.json", pushedShaBody) - .addFormDataPart("packfile", packFileNameWithoutRandomPrefix, packFileBody) - .build(); - - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.GIT_REQUESTS_OBJECTS_PACK) - .requestErrors(CiVisibilityCountMetric.GIT_REQUESTS_OBJECTS_PACK_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.GIT_REQUESTS_OBJECTS_PACK_MS) - .requestBytes(CiVisibilityDistributionMetric.GIT_REQUESTS_OBJECTS_PACK_BYTES) - .build(); - - String response = - backendApi.post( - UPLOAD_PACKFILES_URI, requestBody, IOUtils::readFully, telemetryListener, false); + RequestBody requestBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("pushedSha", "pushedSha.json", pushedShaBody) + .addFormDataPart("packfile", packFileNameWithoutRandomPrefix, packFileBody) + .build(); + + OkHttpUtils.CustomListener telemetryListener = new TelemetryListener.Builder(metricCollector) + .requestCount(CiVisibilityCountMetric.GIT_REQUESTS_OBJECTS_PACK) + .requestErrors(CiVisibilityCountMetric.GIT_REQUESTS_OBJECTS_PACK_ERRORS) + .requestDuration(CiVisibilityDistributionMetric.GIT_REQUESTS_OBJECTS_PACK_MS) + .requestBytes(CiVisibilityDistributionMetric.GIT_REQUESTS_OBJECTS_PACK_BYTES) + .build(); + + String response = backendApi.post( + UPLOAD_PACKFILES_URI, requestBody, IOUtils::readFully, telemetryListener, false); LOGGER.debug("Uploading pack file {} returned response {}", packFile, response); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataUploaderImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataUploaderImpl.java index 5cbc46a51c9..45cb9250c1b 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataUploaderImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDataUploaderImpl.java @@ -56,11 +56,10 @@ public GitDataUploaderImpl( // maven has a way of calling System.exit() when the build is done. // this is a hack to make it wait until git data upload has finished - uploadFinishedShutdownHook = - AgentThreadFactory.newAgentThread( - AgentThreadFactory.AgentThread.CI_GIT_DATA_SHUTDOWN_HOOK, - this::waitForUploadToFinish, - false); + uploadFinishedShutdownHook = AgentThreadFactory.newAgentThread( + AgentThreadFactory.AgentThread.CI_GIT_DATA_SHUTDOWN_HOOK, + this::waitForUploadToFinish, + false); } /** @@ -76,9 +75,8 @@ public Future startOrObserveGitDataUpload() { callback = new CompletableFuture<>(); Runtime.getRuntime().addShutdownHook(uploadFinishedShutdownHook); - Thread gitDataUploadThread = - AgentThreadFactory.newAgentThread( - AgentThreadFactory.AgentThread.CI_GIT_DATA_UPLOADER, this::uploadGitData, false); + Thread gitDataUploadThread = AgentThreadFactory.newAgentThread( + AgentThreadFactory.AgentThread.CI_GIT_DATA_UPLOADER, this::uploadGitData, false); gitDataUploadThread.start(); } } @@ -136,11 +134,9 @@ private void uploadGitData() { Path packFilesDirectory = gitClient.createPackFiles(objectHashes); try { - List packFiles = - Files.list(packFilesDirectory) - .filter( - pf -> pf.getFileName().toString().endsWith(".pack")) // skipping ".idx" files - .collect(Collectors.toList()); + List packFiles = Files.list(packFilesDirectory) + .filter(pf -> pf.getFileName().toString().endsWith(".pack")) // skipping ".idx" files + .collect(Collectors.toList()); metricCollector.add( CiVisibilityDistributionMetric.GIT_REQUESTS_OBJECTS_PACK_FILES, packFiles.size()); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDiffParser.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDiffParser.java index e1f8aefdb73..590119b3755 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDiffParser.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitDiffParser.java @@ -45,10 +45,9 @@ public class GitDiffParser { String stringCount = changedLinesMatcher.group("count"); int count = stringCount != null ? Integer.parseInt(stringCount) : 1; if (changedLines == null) { - throw new IllegalStateException( - "Line " - + line - + " contains changed lines information, but no changed file info is available"); + throw new IllegalStateException("Line " + + line + + " contains changed lines information, but no changed file info is available"); } changedLines.set(startLine, startLine + count); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java index 8f63a088b28..5fe3baceff8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java @@ -129,16 +129,13 @@ private String[] buildGitCommand(String... gitArgs) { */ @Override public boolean isShallow() throws IOException, TimeoutException, InterruptedException { - return executeCommand( - Command.CHECK_SHALLOW, - () -> { - String output = - commandExecutor - .executeCommand( - IOUtils::readFully, buildGitCommand("rev-parse", "--is-shallow-repository")) - .trim(); - return Boolean.parseBoolean(output); - }); + return executeCommand(Command.CHECK_SHALLOW, () -> { + String output = commandExecutor + .executeCommand( + IOUtils::readFully, buildGitCommand("rev-parse", "--is-shallow-repository")) + .trim(); + return Boolean.parseBoolean(output); + }); } /** @@ -159,10 +156,9 @@ public boolean isShallow() throws IOException, TimeoutException, InterruptedExce public String getUpstreamBranchSha() throws IOException, TimeoutException, InterruptedException { return executeCommand( Command.OTHER, - () -> - commandExecutor - .executeCommand(IOUtils::readFully, buildGitCommand("rev-parse", "@{upstream}")) - .trim()); + () -> commandExecutor + .executeCommand(IOUtils::readFully, buildGitCommand("rev-parse", "@{upstream}")) + .trim()); } /** @@ -179,38 +175,36 @@ public String getUpstreamBranchSha() throws IOException, TimeoutException, Inter @Override public void unshallow(@Nullable String remoteCommitReference) throws IOException, TimeoutException, InterruptedException { - executeCommand( - Command.UNSHALLOW, - () -> { - String remote = getRemoteName(); - - // refetch data from the server for the given period of time - if (remoteCommitReference != null && GitUtils.isValidRef(remoteCommitReference)) { - String commitSha = getSha(remoteCommitReference); - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - buildGitCommand( - "fetch", - "--update-shallow", - "--filter=blob:none", - "--recurse-submodules=no", - String.format("--shallow-since='%s'", latestCommitsSince), - remote, - commitSha)); - } else { - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - buildGitCommand( - "fetch", - "--update-shallow", - "--filter=blob:none", - "--recurse-submodules=no", - String.format("--shallow-since='%s'", latestCommitsSince), - remote)); - } + executeCommand(Command.UNSHALLOW, () -> { + String remote = getRemoteName(); - return (Void) null; - }); + // refetch data from the server for the given period of time + if (remoteCommitReference != null && GitUtils.isValidRef(remoteCommitReference)) { + String commitSha = getSha(remoteCommitReference); + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + buildGitCommand( + "fetch", + "--update-shallow", + "--filter=blob:none", + "--recurse-submodules=no", + String.format("--shallow-since='%s'", latestCommitsSince), + remote, + commitSha)); + } else { + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + buildGitCommand( + "fetch", + "--update-shallow", + "--filter=blob:none", + "--recurse-submodules=no", + String.format("--shallow-since='%s'", latestCommitsSince), + remote)); + } + + return (Void) null; + }); } /** @@ -227,11 +221,9 @@ public void unshallow(@Nullable String remoteCommitReference) public String getGitFolder() throws IOException, TimeoutException, InterruptedException { return executeCommand( Command.OTHER, - () -> - commandExecutor - .executeCommand( - IOUtils::readFully, buildGitCommand("rev-parse", "--absolute-git-dir")) - .trim()); + () -> commandExecutor + .executeCommand(IOUtils::readFully, buildGitCommand("rev-parse", "--absolute-git-dir")) + .trim()); } /** @@ -248,10 +240,9 @@ public String getGitFolder() throws IOException, TimeoutException, InterruptedEx public String getRepoRoot() throws IOException, TimeoutException, InterruptedException { return executeCommand( Command.OTHER, - () -> - commandExecutor - .executeCommand(IOUtils::readFully, buildGitCommand("rev-parse", "--show-toplevel")) - .trim()); + () -> commandExecutor + .executeCommand(IOUtils::readFully, buildGitCommand("rev-parse", "--show-toplevel")) + .trim()); } /** @@ -273,12 +264,11 @@ public String getRemoteUrl(String remoteName) } return executeCommand( Command.GET_REPOSITORY, - () -> - commandExecutor - .executeCommand( - IOUtils::readFully, - buildGitCommand("config", "--get", "remote." + remoteName + ".url")) - .trim()); + () -> commandExecutor + .executeCommand( + IOUtils::readFully, + buildGitCommand("config", "--get", "remote." + remoteName + ".url")) + .trim()); } /** @@ -295,10 +285,9 @@ public String getRemoteUrl(String remoteName) public String getCurrentBranch() throws IOException, TimeoutException, InterruptedException { return executeCommand( Command.GET_BRANCH, - () -> - commandExecutor - .executeCommand(IOUtils::readFully, buildGitCommand("branch", "--show-current")) - .trim()); + () -> commandExecutor + .executeCommand(IOUtils::readFully, buildGitCommand("branch", "--show-current")) + .trim()); } /** @@ -318,18 +307,16 @@ public List getTags(String commit) if (GitUtils.isNotValidCommit(commit)) { return Collections.emptyList(); } - return executeCommand( - Command.OTHER, - () -> { - try { - return commandExecutor.executeCommand( - IOUtils::readLines, buildGitCommand("describe", "--tags", "--exact-match", commit)); - } catch (ShellCommandExecutor.ShellCommandFailedException e) { - // if provided commit is not tagged, - // command will fail because "--exact-match" is specified - return Collections.emptyList(); - } - }); + return executeCommand(Command.OTHER, () -> { + try { + return commandExecutor.executeCommand( + IOUtils::readLines, buildGitCommand("describe", "--tags", "--exact-match", commit)); + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + // if provided commit is not tagged, + // command will fail because "--exact-match" is specified + return Collections.emptyList(); + } + }); } /** @@ -351,10 +338,9 @@ public String getSha(String reference) } return executeCommand( Command.OTHER, - () -> - commandExecutor - .executeCommand(IOUtils::readFully, buildGitCommand("rev-parse", reference)) - .trim()); + () -> commandExecutor + .executeCommand(IOUtils::readFully, buildGitCommand("rev-parse", reference)) + .trim()); } /** Checks whether the provided reference object is present or not. */ @@ -363,18 +349,16 @@ private boolean isCommitPresent(String commitReference) if (GitUtils.isNotValidCommit(commitReference)) { return false; } - return executeCommand( - Command.OTHER, - () -> { - try { - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - buildGitCommand("cat-file", "-e", commitReference + "^{commit}")); - return true; - } catch (ShellCommandExecutor.ShellCommandFailedException ignored) { - return false; - } - }); + return executeCommand(Command.OTHER, () -> { + try { + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + buildGitCommand("cat-file", "-e", commitReference + "^{commit}")); + return true; + } catch (ShellCommandExecutor.ShellCommandFailedException ignored) { + return false; + } + }); } /** Fetches provided commit object from the server. */ @@ -383,22 +367,20 @@ private void fetchCommit(String remoteCommitReference) if (GitUtils.isNotValidCommit(remoteCommitReference)) { return; } - executeCommand( - Command.FETCH_COMMIT, - () -> { - String remote = getRemoteName(); - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - buildGitCommand( - "fetch", - "--filter=blob:none", - "--recurse-submodules=no", - "--no-write-fetch-head", - remote, - remoteCommitReference)); + executeCommand(Command.FETCH_COMMIT, () -> { + String remote = getRemoteName(); + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + buildGitCommand( + "fetch", + "--filter=blob:none", + "--recurse-submodules=no", + "--no-write-fetch-head", + remote, + remoteCommitReference)); - return (Void) null; - }); + return (Void) null; + }); } /** @@ -425,37 +407,34 @@ public CommitInfo getCommitInfo(String commit, boolean fetchIfNotPresent) fetchCommit(commit); } } - return executeCommand( - Command.OTHER, - () -> { - String info = ""; - try { - info = - commandExecutor - .executeCommand( - IOUtils::readFully, - buildGitCommand( - "show", - commit, - "-s", - "--format=%H\",\"%an\",\"%ae\",\"%aI\",\"%cn\",\"%ce\",\"%cI\",\"%B")) - .trim(); - } catch (ShellCommandExecutor.ShellCommandFailedException e) { - LOGGER.error("Failed to fetch commit info", e); - return CommitInfo.NOOP; - } - - String[] fields = COMMIT_INFO_SPLIT.split(info); - if (fields.length < 8) { - LOGGER.error("Could not parse commit info: {}", info); - return CommitInfo.NOOP; - } - return new CommitInfo( - fields[0], - new PersonInfo(fields[1], fields[2], fields[3]), - new PersonInfo(fields[4], fields[5], fields[6]), - fields[7]); - }); + return executeCommand(Command.OTHER, () -> { + String info = ""; + try { + info = commandExecutor + .executeCommand( + IOUtils::readFully, + buildGitCommand( + "show", + commit, + "-s", + "--format=%H\",\"%an\",\"%ae\",\"%aI\",\"%cn\",\"%ce\",\"%cI\",\"%B")) + .trim(); + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + LOGGER.error("Failed to fetch commit info", e); + return CommitInfo.NOOP; + } + + String[] fields = COMMIT_INFO_SPLIT.split(info); + if (fields.length < 8) { + LOGGER.error("Could not parse commit info: {}", info); + return CommitInfo.NOOP; + } + return new CommitInfo( + fields[0], + new PersonInfo(fields[1], fields[2], fields[3]), + new PersonInfo(fields[4], fields[5], fields[6]), + fields[7]); + }); } /** @@ -474,15 +453,14 @@ public List getLatestCommits() throws IOException, TimeoutException, InterruptedException { return executeCommand( Command.GET_LOCAL_COMMITS, - () -> - commandExecutor.executeCommand( - IOUtils::readLines, - buildGitCommand( - "log", - "--format=%H", - "-n", - String.valueOf(latestCommitsLimit), - String.format("--since='%s'", latestCommitsSince)))); + () -> commandExecutor.executeCommand( + IOUtils::readLines, + buildGitCommand( + "log", + "--format=%H", + "-n", + String.valueOf(latestCommitsLimit), + String.format("--since='%s'", latestCommitsSince)))); } /** @@ -502,26 +480,24 @@ public List getLatestCommits() public List getObjects( Collection commitsToSkip, Collection commitsToInclude) throws IOException, TimeoutException, InterruptedException { - return executeCommand( - Command.GET_OBJECTS, - () -> { - String[] gitArgs = new String[5 + commitsToSkip.size() + commitsToInclude.size()]; - gitArgs[0] = "rev-list"; - gitArgs[1] = "--objects"; - gitArgs[2] = "--no-object-names"; - gitArgs[3] = "--filter=blob:none"; - gitArgs[4] = String.format("--since='%s'", latestCommitsSince); - - int count = 5; - for (String commitToSkip : commitsToSkip) { - gitArgs[count++] = "^" + commitToSkip; - } - for (String commitToInclude : commitsToInclude) { - gitArgs[count++] = commitToInclude; - } - - return commandExecutor.executeCommand(IOUtils::readLines, buildGitCommand(gitArgs)); - }); + return executeCommand(Command.GET_OBJECTS, () -> { + String[] gitArgs = new String[5 + commitsToSkip.size() + commitsToInclude.size()]; + gitArgs[0] = "rev-list"; + gitArgs[1] = "--objects"; + gitArgs[2] = "--no-object-names"; + gitArgs[3] = "--filter=blob:none"; + gitArgs[4] = String.format("--since='%s'", latestCommitsSince); + + int count = 5; + for (String commitToSkip : commitsToSkip) { + gitArgs[count++] = "^" + commitToSkip; + } + for (String commitToInclude : commitsToInclude) { + gitArgs[count++] = commitToInclude; + } + + return commandExecutor.executeCommand(IOUtils::readLines, buildGitCommand(gitArgs)); + }); } /** @@ -538,21 +514,19 @@ public List getObjects( @Override public Path createPackFiles(List objectHashes) throws IOException, TimeoutException, InterruptedException { - return executeCommand( - Command.PACK_OBJECTS, - () -> { - byte[] input = String.join("\n", objectHashes).getBytes(Charset.defaultCharset()); + return executeCommand(Command.PACK_OBJECTS, () -> { + byte[] input = String.join("\n", objectHashes).getBytes(Charset.defaultCharset()); - Path tempDirectory = createTempDirectory(); - String basename = Strings.random(8); - String path = tempDirectory.toString() + File.separator + basename; + Path tempDirectory = createTempDirectory(); + String basename = Strings.random(8); + String path = tempDirectory.toString() + File.separator + basename; - commandExecutor.executeCommand( - ShellCommandExecutor.OutputParser.IGNORE, - input, - buildGitCommand("pack-objects", "--compression=9", "--max-pack-size=3m", path)); - return tempDirectory; - }); + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + input, + buildGitCommand("pack-objects", "--compression=9", "--max-pack-size=3m", path)); + return tempDirectory; + }); } private Path createTempDirectory() throws IOException { @@ -594,38 +568,33 @@ public String getBaseCommitSha( || (settingsDefaultBranch != null && !GitUtils.isValidRef(settingsDefaultBranch))) { return null; } - return executeCommand( - Command.BASE_COMMIT_SHA, - () -> { - String sourceBranch = getCurrentBranch(); - if (Strings.isBlank(sourceBranch)) { - return null; - } - LOGGER.debug("Source branch: {}", sourceBranch); - - String remoteName = getRemoteName(); - LOGGER.debug("Remote name: {}", remoteName); - - if (baseBranch != null) { - tryFetchingIfNotFoundLocally(baseBranch, remoteName); - String fullBaseBranchName = - remoteName + "/" + removeRemotePrefix(baseBranch, remoteName); - return getMergeBase(fullBaseBranchName, sourceBranch); - } else { - return guessBestBaseBranchSha(sourceBranch, remoteName, settingsDefaultBranch); - } - }); + return executeCommand(Command.BASE_COMMIT_SHA, () -> { + String sourceBranch = getCurrentBranch(); + if (Strings.isBlank(sourceBranch)) { + return null; + } + LOGGER.debug("Source branch: {}", sourceBranch); + + String remoteName = getRemoteName(); + LOGGER.debug("Remote name: {}", remoteName); + + if (baseBranch != null) { + tryFetchingIfNotFoundLocally(baseBranch, remoteName); + String fullBaseBranchName = remoteName + "/" + removeRemotePrefix(baseBranch, remoteName); + return getMergeBase(fullBaseBranchName, sourceBranch); + } else { + return guessBestBaseBranchSha(sourceBranch, remoteName, settingsDefaultBranch); + } + }); } String getRemoteName() throws IOException, InterruptedException, TimeoutException { try { - String remote = - commandExecutor - .executeCommand( - IOUtils::readFully, - buildGitCommand( - "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}")) - .trim(); + String remote = commandExecutor + .executeCommand( + IOUtils::readFully, + buildGitCommand("rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}")) + .trim(); int slashIdx = remote.indexOf('/'); return slashIdx != -1 ? remote.substring(0, slashIdx) : remote; @@ -667,10 +636,9 @@ String guessBestBaseBranchSha( return null; } - String defaultBranch = - Strings.isNotBlank(settingsDefaultBranch) - ? settingsDefaultBranch - : detectDefaultBranch(remoteName); + String defaultBranch = Strings.isNotBlank(settingsDefaultBranch) + ? settingsDefaultBranch + : detectDefaultBranch(remoteName); List sortedMetrics = sortBaseBranchCandidates(metrics, defaultBranch, remoteName); @@ -707,12 +675,11 @@ void tryFetchingIfNotFoundLocally(String branch, String remoteName) // check if branch exists in remote String remoteHeads = null; try { - remoteHeads = - commandExecutor - .executeCommand( - IOUtils::readFully, - buildGitCommand("ls-remote", "--heads", remoteName, shortBranchName)) - .trim(); + remoteHeads = commandExecutor + .executeCommand( + IOUtils::readFully, + buildGitCommand("ls-remote", "--heads", remoteName, shortBranchName)) + .trim(); } catch (ShellCommandExecutor.ShellCommandFailedException ignored) { } @@ -737,11 +704,10 @@ List getBaseBranchCandidates(@Nullable String defaultBranch, String remo List candidates = new ArrayList<>(); try { // only consider remote branches - List branches = - commandExecutor.executeCommand( - IOUtils::readLines, - buildGitCommand( - "for-each-ref", "--format=%(refname:short)", "refs/remotes/" + remoteName)); + List branches = commandExecutor.executeCommand( + IOUtils::readLines, + buildGitCommand( + "for-each-ref", "--format=%(refname:short)", "refs/remotes/" + remoteName)); for (String branch : branches) { if (isBaseLikeBranch(branch, remoteName) || branchesEquals(branch, defaultBranch, remoteName)) { @@ -787,13 +753,12 @@ boolean isBaseLikeBranch(@Nonnull String branch, @Nonnull String remoteName) { String detectDefaultBranch(String remoteName) throws IOException, InterruptedException, TimeoutException { try { - String defaultRef = - commandExecutor - .executeCommand( - IOUtils::readFully, - buildGitCommand( - "symbolic-ref", "--quiet", "--short", "refs/remotes/" + remoteName + "/HEAD")) - .trim(); + String defaultRef = commandExecutor + .executeCommand( + IOUtils::readFully, + buildGitCommand( + "symbolic-ref", "--quiet", "--short", "refs/remotes/" + remoteName + "/HEAD")) + .trim(); if (Strings.isNotBlank(defaultRef)) { return removeRemotePrefix(defaultRef, remoteName); } @@ -843,15 +808,8 @@ public int hashCode() { @Override public String toString() { - return "BaseBranchMetric{" - + "branch='" - + branch - + '\'' - + ", behind=" - + behind - + ", ahead=" - + ahead - + '}'; + return "BaseBranchMetric{" + "branch='" + branch + '\'' + ", behind=" + behind + ", ahead=" + + ahead + '}'; } } @@ -861,13 +819,12 @@ List computeBranchMetrics(List candidates, String sour for (String candidate : candidates) { try { - String countsResult = - commandExecutor - .executeCommand( - IOUtils::readFully, - buildGitCommand( - "rev-list", "--left-right", "--count", candidate + "..." + sourceBranch)) - .trim(); + String countsResult = commandExecutor + .executeCommand( + IOUtils::readFully, + buildGitCommand( + "rev-list", "--left-right", "--count", candidate + "..." + sourceBranch)) + .trim(); String[] counts = WHITESPACE_PATTERN.split(countsResult); int behind = Integer.parseInt(counts[0]); @@ -891,9 +848,9 @@ boolean isDefaultBranch(String branch, @Nullable String defaultBranch, String re List sortBaseBranchCandidates( List metrics, String defaultBranch, String remoteName) { - Comparator comparator = - Comparator.comparingInt((BaseBranchMetric b) -> b.ahead) - .thenComparing(b -> !isDefaultBranch(b.branch, defaultBranch, remoteName)); + Comparator comparator = Comparator.comparingInt( + (BaseBranchMetric b) -> b.ahead) + .thenComparing(b -> !isDefaultBranch(b.branch, defaultBranch, remoteName)); return metrics.stream().sorted(comparator).collect(Collectors.toList()); } @@ -941,24 +898,21 @@ public LineDiff getGitDiff(String baseCommit, String targetCommit) } else if (Strings.isNotBlank(targetCommit) && GitUtils.isValidCommitSha(targetCommit)) { return executeCommand( Command.DIFF, - () -> - commandExecutor.executeCommand( - GitDiffParser::parse, - buildGitCommand( - "diff", - "-U0", - "--word-diff=porcelain", - "--no-prefix", - baseCommit, - targetCommit))); + () -> commandExecutor.executeCommand( + GitDiffParser::parse, + buildGitCommand( + "diff", + "-U0", + "--word-diff=porcelain", + "--no-prefix", + baseCommit, + targetCommit))); } else { return executeCommand( Command.DIFF, - () -> - commandExecutor.executeCommand( - GitDiffParser::parse, - buildGitCommand( - "diff", "-U0", "--word-diff=porcelain", "--no-prefix", baseCommit))); + () -> commandExecutor.executeCommand( + GitDiffParser::parse, + buildGitCommand("diff", "-U0", "--word-diff=porcelain", "--no-prefix", baseCommit))); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/ModuleCoverageDataJacoco.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/ModuleCoverageDataJacoco.java index 5e0da399514..f0f6818efa8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/ModuleCoverageDataJacoco.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/ModuleCoverageDataJacoco.java @@ -9,7 +9,8 @@ public class ModuleCoverageDataJacoco extends ModuleSignal { - @Nonnull private final byte[] coverageData; + @Nonnull + private final byte[] coverageData; public ModuleCoverageDataJacoco( DDTraceId sessionId, long moduleId, @Nonnull byte[] coverageData) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/SignalServer.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/SignalServer.java index 8199aa7671a..029810a8390 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/SignalServer.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ipc/SignalServer.java @@ -61,9 +61,8 @@ public synchronized void start() { SignalServerRunnable signalServerRunnable = new SignalServerRunnable(selector, DEFAULT_BUFFER_CAPACITY, signalHandlers); - signalServerThread = - AgentThreadFactory.newAgentThread( - AgentThreadFactory.AgentThread.CI_SIGNAL_SERVER, signalServerRunnable); + signalServerThread = AgentThreadFactory.newAgentThread( + AgentThreadFactory.AgentThread.CI_SIGNAL_SERVER, signalServerRunnable); signalServerThread.start(); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndex.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndex.java index 76a758d3af6..f8c46798a90 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndex.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndex.java @@ -24,12 +24,11 @@ public class RepoIndex { - static final RepoIndex EMPTY = - new RepoIndex( - ClassNameTrie.EMPTY_TRIE, - Collections.emptyMap(), - Collections.emptyList(), - Collections.emptyList()); + static final RepoIndex EMPTY = new RepoIndex( + ClassNameTrie.EMPTY_TRIE, + Collections.emptyMap(), + Collections.emptyList(), + Collections.emptyList()); private static final Logger log = LoggerFactory.getLogger(RepoIndex.class); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndexBuilder.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndexBuilder.java index 2c223c34f90..eb159600065 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndexBuilder.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndexBuilder.java @@ -169,10 +169,9 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { language.isNonCode() ? getNonCodeSourceRoot(file) : getCodeSourceRoot(language, file); if (sourceRoot != null) { String relativeSourceRoot = repoRoot.relativize(sourceRoot).toString(); - int sourceRootIdx = - sourceRoots.computeIfAbsent( - new RepoIndex.SourceRoot(relativeSourceRoot, language), - sr -> sourceRootCounter.getAndIncrement()); + int sourceRootIdx = sourceRoots.computeIfAbsent( + new RepoIndex.SourceRoot(relativeSourceRoot, language), + sr -> sourceRootCounter.getAndIncrement()); String relativePath = sourceRoot.relativize(file).toString(); if (!relativePath.isEmpty()) { @@ -183,13 +182,11 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { if (existingSourceRootIdx != null) { log.debug("Duplicate repo index key: {}", key); duplicateSourceRootIndices - .computeIfAbsent( - key, - k -> { - List indices = new ArrayList<>(); - indices.add(existingSourceRootIdx); // Initialize with original source root - return indices; - }) + .computeIfAbsent(key, k -> { + List indices = new ArrayList<>(); + indices.add(existingSourceRootIdx); // Initialize with original source root + return indices; + }) .add(sourceRootIdx); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java index dc89fbe7d97..7a70f7646ea 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java @@ -34,10 +34,17 @@ public class ExecutionStrategy { private final AtomicInteger earlyFlakeDetectionsUsed = new AtomicInteger(0); private final AtomicInteger autoRetriesUsed = new AtomicInteger(0); - @Nonnull private final Config config; - @Nonnull private final ExecutionSettings executionSettings; - @Nonnull private final SourcePathResolver sourcePathResolver; - @Nonnull private final LinesResolver linesResolver; + @Nonnull + private final Config config; + + @Nonnull + private final ExecutionSettings executionSettings; + + @Nonnull + private final SourcePathResolver sourcePathResolver; + + @Nonnull + private final LinesResolver linesResolver; public ExecutionStrategy( @Nonnull Config config, @@ -182,10 +189,9 @@ public boolean isEFDLimitReached() { int totalTests = executionSettings.getSettingCount(TestSetting.KNOWN) + detectionsUsed; EarlyFlakeDetectionSettings earlyFlakeDetectionSettings = executionSettings.getEarlyFlakeDetectionSettings(); - int threshold = - Math.max( - config.getCiVisibilityEarlyFlakeDetectionLowerLimit(), - totalTests * earlyFlakeDetectionSettings.getFaultySessionThreshold() / 100); + int threshold = Math.max( + config.getCiVisibilityEarlyFlakeDetectionLowerLimit(), + totalTests * earlyFlakeDetectionSettings.getFaultySessionThreshold() / 100); return detectionsUsed > threshold; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java index eb668ac8b4b..05f7d5b4420 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/FileUtils.java @@ -20,22 +20,19 @@ public abstract class FileUtils { private FileUtils() {} public static void delete(Path directory) throws IOException { - Files.walkFileTree( - directory, - new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } + Files.walkFileTree(directory, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } - }); + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); } /** diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java index 92103b75fd4..f2b0dbf59cb 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/utils/ShellCommandExecutor.java @@ -109,21 +109,19 @@ private T executeCommand( p = processBuilder.start(); StreamConsumer inputStreamConsumer = new StreamConsumer(p.getInputStream()); - Thread inputStreamThread = - AgentThreadFactory.newAgentThread( - AgentThread.CI_SHELL_COMMAND, - "-input-stream-consumer-" + command[0], - inputStreamConsumer, - true); + Thread inputStreamThread = AgentThreadFactory.newAgentThread( + AgentThread.CI_SHELL_COMMAND, + "-input-stream-consumer-" + command[0], + inputStreamConsumer, + true); inputStreamThread.start(); StreamConsumer errorStreamConsumer = new StreamConsumer(p.getErrorStream()); - Thread errorStreamThread = - AgentThreadFactory.newAgentThread( - AgentThread.CI_SHELL_COMMAND, - "-error-stream-consumer-" + command[0], - errorStreamConsumer, - true); + Thread errorStreamThread = AgentThreadFactory.newAgentThread( + AgentThread.CI_SHELL_COMMAND, + "-error-stream-consumer-" + command[0], + errorStreamConsumer, + true); errorStreamThread.start(); if (input != null) { @@ -158,15 +156,14 @@ private T executeCommand( } else { terminate(p); - throw new TimeoutException( - "Timeout while waiting for '" - + String.join(" ", command) - + "'; in " - + executionFolder - + "\n StdOut: \n" - + IOUtils.readFully(inputStreamConsumer.read(), Charset.defaultCharset()) - + "\n StdErr: \n " - + IOUtils.readFully(errorStreamConsumer.read(), Charset.defaultCharset())); + throw new TimeoutException("Timeout while waiting for '" + + String.join(" ", command) + + "'; in " + + executionFolder + + "\n StdOut: \n" + + IOUtils.readFully(inputStreamConsumer.read(), Charset.defaultCharset()) + + "\n StdErr: \n " + + IOUtils.readFully(errorStreamConsumer.read(), Charset.defaultCharset())); } } catch (InterruptedException e) { terminate(p); diff --git a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/ConfigurationApiImplTest.java b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/ConfigurationApiImplTest.java index 117e4e4e48c..10a17da53fa 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/ConfigurationApiImplTest.java +++ b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/ConfigurationApiImplTest.java @@ -71,35 +71,28 @@ void closeServers() { @Override protected ConfigurationApi apiReturning(Endpoint endpoint, String responseBody) { - JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.prefix( - ENDPOINT_PATHS.get(endpoint), - api -> sendResponseBody(api, responseBody.getBytes())))); + JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.prefix( + ENDPOINT_PATHS.get(endpoint), api -> sendResponseBody(api, responseBody.getBytes())))); servers.add(server); return givenConfigurationApi(server, true, true); } // A response payload that exists only to keep the round-trip happy: parse correctness for the // settings endpoint is covered by AbstractConfigurationApiContractTest#parsesSettings. - private static final CiVisibilitySettings CANONICAL_SETTINGS_RESPONSE = - new CiVisibilitySettings( - false, - false, - false, - false, - false, - false, - false, - false, - false, - EarlyFlakeDetectionSettings.DEFAULT, - TestManagementSettings.DEFAULT, - null, - false); + private static final CiVisibilitySettings CANONICAL_SETTINGS_RESPONSE = new CiVisibilitySettings( + false, + false, + false, + false, + false, + false, + false, + false, + false, + EarlyFlakeDetectionSettings.DEFAULT, + TestManagementSettings.DEFAULT, + null, + false); static Stream testSettingsRequestArguments() { return Stream.of( @@ -121,13 +114,12 @@ void testSettingsRequest(String scenario, boolean agentless, boolean compression Map responseData = new HashMap<>(); responseData.put("settings", CANONICAL_SETTINGS_RESPONSE); - JavaTestHttpServer intakeServer = - givenBackendEndpoint( - "/api/v2/libraries/tests/services/setting", - "settings-request.ftl", - requestData, - "settings-response.ftl", - responseData); + JavaTestHttpServer intakeServer = givenBackendEndpoint( + "/api/v2/libraries/tests/services/setting", + "settings-request.ftl", + requestData, + "settings-response.ftl", + responseData); ConfigurationApi configurationApi = givenConfigurationApi(intakeServer, agentless, compression); configurationApi.getSettings(tracerEnvironment); @@ -149,13 +141,12 @@ void testSkippableTestsRequest(String scenario, String testBundle, String reques requestData.put("uid", REQUEST_UID); requestData.put("tracerEnvironment", tracerEnvironment); - JavaTestHttpServer intakeServer = - givenBackendEndpoint( - "/api/v2/ci/tests/skippable", - requestTemplate, - requestData, - "skippable-response.ftl", - new HashMap<>()); + JavaTestHttpServer intakeServer = givenBackendEndpoint( + "/api/v2/ci/tests/skippable", + requestTemplate, + requestData, + "skippable-response.ftl", + new HashMap<>()); ConfigurationApi configurationApi = givenConfigurationApi(intakeServer, true, true); configurationApi.getSkippableTests(tracerEnvironment); @@ -177,13 +168,12 @@ void testFlakyTestsRequest(String scenario, String testBundle, String requestTem requestData.put("uid", REQUEST_UID); requestData.put("tracerEnvironment", tracerEnvironment); - JavaTestHttpServer intakeServer = - givenBackendEndpoint( - "/api/v2/ci/libraries/tests/flaky", - requestTemplate, - requestData, - "flaky-response.ftl", - new HashMap<>()); + JavaTestHttpServer intakeServer = givenBackendEndpoint( + "/api/v2/ci/libraries/tests/flaky", + requestTemplate, + requestData, + "flaky-response.ftl", + new HashMap<>()); ConfigurationApi configurationApi = givenConfigurationApi(intakeServer, true, true); configurationApi.getFlakyTestsByModule(tracerEnvironment); @@ -202,17 +192,11 @@ void testKnownTestsRequestWithPagination() throws IOException { "{\"data\":{\"id\":\"page3\",\"type\":\"ci_app_libraries_tests\",\"attributes\":{\"tests\":{\"module-c\":{\"suite-c\":[\"test-5\",\"test-6\"]}},\"page_info\":{\"size\":2,\"has_next\":false}}}}"; List responses = Arrays.asList(page1, page2, page3); - JavaTestHttpServer intakeServer = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.prefix( - "/api/v2/ci/libraries/tests", - api -> { - int current = requestCount.incrementAndGet(); - sendResponseBody(api, responses.get(current - 1).getBytes()); - }))); + JavaTestHttpServer intakeServer = JavaTestHttpServer.httpServer(s -> + s.handlers(h -> h.prefix("/api/v2/ci/libraries/tests", api -> { + int current = requestCount.incrementAndGet(); + sendResponseBody(api, responses.get(current - 1).getBytes()); + }))); servers.add(intakeServer); ConfigurationApi configurationApi = givenConfigurationApi(intakeServer, true, true); @@ -237,10 +221,9 @@ void testKnownTestsRequestWithPagination() throws IOException { private ConfigurationApi givenConfigurationApi( JavaTestHttpServer intakeServer, boolean agentless, boolean compression) { - BackendApi api = - agentless - ? givenIntakeApi(intakeServer.getAddress(), compression) - : givenEvpProxy(intakeServer.getAddress(), compression); + BackendApi api = agentless + ? givenIntakeApi(intakeServer.getAddress(), compression) + : givenEvpProxy(intakeServer.getAddress(), compression); return new ConfigurationApiImpl(api, NoOpMetricCollector.INSTANCE, () -> REQUEST_UID); } @@ -254,26 +237,19 @@ private JavaTestHttpServer givenBackendEndpoint( String expectedRequestBody = render(requestTemplate, requestData); byte[] responseBody = render(responseTemplate, responseData).getBytes(); JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.prefix( - path, - api -> { - JavaTestHttpServer.HandlerApi.ResponseApi response = - api.getResponse(); - try { - JSONAssert.assertEquals( - expectedRequestBody, - new String(api.getRequest().getBody()), - JSONCompareMode.LENIENT); - } catch (AssertionError error) { - response.status(400).send(error.getMessage().getBytes()); - return; - } - sendResponseBody(api, responseBody); - }))); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.prefix(path, api -> { + JavaTestHttpServer.HandlerApi.ResponseApi response = api.getResponse(); + try { + JSONAssert.assertEquals( + expectedRequestBody, + new String(api.getRequest().getBody()), + JSONCompareMode.LENIENT); + } catch (AssertionError error) { + response.status(400).send(error.getMessage().getBytes()); + return; + } + sendResponseBody(api, responseBody); + }))); servers.add(server); return server; } diff --git a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/FileBasedConfigurationApiTest.java b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/FileBasedConfigurationApiTest.java index 3aa3df05763..410aaf88675 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/FileBasedConfigurationApiTest.java +++ b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/config/FileBasedConfigurationApiTest.java @@ -13,7 +13,8 @@ class FileBasedConfigurationApiTest extends AbstractConfigurationApiContractTest { - @TempDir Path tmp; + @TempDir + Path tmp; @Override protected ConfigurationApi apiReturning(Endpoint endpoint, String responseBody) diff --git a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/file/FileCoverageStoreTest.java b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/file/FileCoverageStoreTest.java index fef10b98639..fbd3d867629 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/file/FileCoverageStoreTest.java +++ b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/file/FileCoverageStoreTest.java @@ -31,10 +31,9 @@ void duplicateKeyClassReturnsAllCandidatePathsInCoverageReport() { when(sourcePathResolver.getSourcePaths(ResolvableClassA.class)) .thenReturn(singletonList("src/main/java/com/example/ClassA.java")); when(sourcePathResolver.getSourcePaths(DuplicateKeyClass.class)) - .thenReturn( - asList( - "src/debug/java/com/example/DuplicateKeyClass.java", - "src/release/java/com/example/DuplicateKeyClass.java")); + .thenReturn(asList( + "src/debug/java/com/example/DuplicateKeyClass.java", + "src/release/java/com/example/DuplicateKeyClass.java")); when(sourcePathResolver.getSourcePaths(ResolvableClassC.class)) .thenReturn(singletonList("src/main/java/com/example/ClassC.java")); diff --git a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/report/CoverageReportUploaderTest.java b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/report/CoverageReportUploaderTest.java index 0a2c82c18dc..a183bf45c6d 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/report/CoverageReportUploaderTest.java +++ b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/coverage/report/CoverageReportUploaderTest.java @@ -71,31 +71,20 @@ void uploadsCoverageReportWithOrderedDuplicateFlags() throws IOException { private static CapturedRequest uploadCoverageReport(List flags) throws IOException { CapturedRequest capturedRequest = new CapturedRequest(); try (JavaTestHttpServer server = - httpServer( - s -> - s.handlers( - h -> - h.prefix( - "/api/v2/cicovreprt", - api -> { - Map> multipart = - MultipartRequestParser.parseRequest( - api.getRequest().getBody(), - api.getRequest().getHeader("Content-Type")); - capturedRequest.event = - JSON_MAPPER.readValue( - multipart.get("event").get(0).get(), EVENT_TYPE); - capturedRequest.coverage = - gunzip(multipart.get("coverage").get(0).get()); - api.getResponse().status(200).send(); - })))) { + httpServer(s -> s.handlers(h -> h.prefix("/api/v2/cicovreprt", api -> { + Map> multipart = MultipartRequestParser.parseRequest( + api.getRequest().getBody(), api.getRequest().getHeader("Content-Type")); + capturedRequest.event = + JSON_MAPPER.readValue(multipart.get("event").get(0).get(), EVENT_TYPE); + capturedRequest.coverage = gunzip(multipart.get("coverage").get(0).get()); + api.getResponse().status(200).send(); + })))) { BackendApi backendApi = givenIntakeApi(server.getAddress()); - CoverageReportUploader uploader = - new CoverageReportUploader( - backendApi, - Collections.singletonMap(CI_TAG_KEY, CI_TAG_VALUE), - flags, - NoOpMetricCollector.INSTANCE); + CoverageReportUploader uploader = new CoverageReportUploader( + backendApi, + Collections.singletonMap(CI_TAG_KEY, CI_TAG_VALUE), + flags, + NoOpMetricCollector.INSTANCE); uploader.upload( JACOCO_FORMAT, diff --git a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/events/TestEventsHandlerImplTest.java b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/events/TestEventsHandlerImplTest.java index 4c20bba1d2b..1479dad9628 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/events/TestEventsHandlerImplTest.java +++ b/dd-java-agent/agent-ci-visibility/src/test/java/datadog/trace/civisibility/events/TestEventsHandlerImplTest.java @@ -24,12 +24,10 @@ class TestEventsHandlerImplTest { @Test void doesNotCreateSessionWhenUnused() { AtomicInteger creations = new AtomicInteger(); - TestEventsHandlerImpl handler = - handler( - () -> { - creations.incrementAndGet(); - return mock(TestFrameworkSession.class); - }); + TestEventsHandlerImpl handler = handler(() -> { + creations.incrementAndGet(); + return mock(TestFrameworkSession.class); + }); handler.close(); @@ -44,12 +42,10 @@ void createsSessionAndModuleOnceAndClosesThem() { TestIdentifier test = new TestIdentifier("suite", "test", null); when(module.skipReason(test)).thenReturn(SkipReason.ITR); AtomicInteger creations = new AtomicInteger(); - TestEventsHandlerImpl handler = - handler( - () -> { - creations.incrementAndGet(); - return session; - }); + TestEventsHandlerImpl handler = handler(() -> { + creations.incrementAndGet(); + return session; + }); assertSame(SkipReason.ITR, handler.skipReason(test)); assertSame(SkipReason.ITR, handler.skipReason(test)); @@ -68,13 +64,12 @@ void createsSessionImmediatelyWhenRequested() { when(session.testModuleStart("module", null)).thenReturn(module); AtomicInteger creations = new AtomicInteger(); - TestEventsHandlerImpl handler = - handler( - () -> { - creations.incrementAndGet(); - return session; - }, - true); + TestEventsHandlerImpl handler = handler( + () -> { + creations.incrementAndGet(); + return session; + }, + true); assertEquals(1, creations.get()); handler.close(); diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java index 99e6235a6b2..176211edae3 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java @@ -201,9 +201,8 @@ static void writeConfigToFile(Config config, File cfgFile, String... additionalE final WellKnownTags wellKnownTags = config.getWellKnownTags(); LOGGER.debug("Writing config file: {}", cfgFile); - try (BufferedWriter bw = - new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(cfgFile), StandardCharsets.UTF_8))) { + try (BufferedWriter bw = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(cfgFile), StandardCharsets.UTF_8))) { for (int i = 0; i < additionalEntries.length; i += 2) { writeEntry(bw, additionalEntries[i], additionalEntries[i + 1]); } @@ -219,14 +218,10 @@ static void writeConfigToFile(Config config, File cfgFile, String... additionalE writeEntry( bw, "extended_info", Boolean.toString(config.isCrashTrackingExtendedInfoEnabled())); - Runtime.getRuntime() - .addShutdownHook( - new Thread( - AGENT_THREAD_GROUP, - () -> { - LOGGER.debug("Deleting config file: {}", cfgFile); - cfgFile.delete(); - })); + Runtime.getRuntime().addShutdownHook(new Thread(AGENT_THREAD_GROUP, () -> { + LOGGER.debug("Deleting config file: {}", cfgFile); + cfgFile.delete(); + })); LOGGER.debug("Config file written: {}", cfgFile); } catch (IOException e) { LOGGER.warn(SEND_TELEMETRY, "Failed writing config file: {}", cfgFile); @@ -236,9 +231,8 @@ static void writeConfigToFile(Config config, File cfgFile, String... additionalE @Nullable public static StoredConfig readConfig(Config config, File scriptFile) { - try (final BufferedReader reader = - new BufferedReader( - new InputStreamReader(new FileInputStream(scriptFile), StandardCharsets.UTF_8))) { + try (final BufferedReader reader = new BufferedReader( + new InputStreamReader(new FileInputStream(scriptFile), StandardCharsets.UTF_8))) { final StoredConfig.Builder cfgBuilder = new StoredConfig.Builder(config); String line; while ((line = reader.readLine()) != null) { diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java index 87fc4592751..499f8812d06 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java @@ -138,14 +138,13 @@ public CrashUploader(@Nonnull final ConfigManager.StoredConfig storedConfig) { this.errorTrackingUrl = HttpUrl.get(config.getFinalCrashTrackingErrorTrackingUrl()); this.agentless = config.isCrashTrackingAgentless(); // This is the same thing OkHttp Dispatcher is doing except thread naming and daemonization - this.executor = - new ThreadPoolExecutor( - 0, - 4, - 60, - TimeUnit.SECONDS, - new SynchronousQueue<>(), - new AgentThreadFactory(CRASHTRACKING_HTTP_DISPATCHER)); + this.executor = new ThreadPoolExecutor( + 0, + 4, + 60, + TimeUnit.SECONDS, + new SynchronousQueue<>(), + new AgentThreadFactory(CRASHTRACKING_HTTP_DISPATCHER)); this.dispatcher = new Dispatcher(executor); final StringBuilder tagsBuilder = @@ -163,23 +162,20 @@ public CrashUploader(@Nonnull final ConfigManager.StoredConfig storedConfig) { ConfigProvider configProvider = config.configProvider(); - this.timeout = - SECONDS.toMillis( - configProvider.getInteger( - CRASH_TRACKING_UPLOAD_TIMEOUT, CRASH_TRACKING_UPLOAD_TIMEOUT_DEFAULT)); - - uploadClient = - OkHttpUtils.buildHttpClient( - config, - dispatcher, /* dispatcher */ - telemetryUrl, // will be overridden in each request - true, /* retryOnConnectionFailure */ - 4, /* maxRunningRequests */ // not having one request blocking the others - configProvider.getString(CRASH_TRACKING_PROXY_HOST), - configProvider.getInteger(CRASH_TRACKING_PROXY_PORT), - configProvider.getString(CRASH_TRACKING_PROXY_USERNAME), - configProvider.getString(CRASH_TRACKING_PROXY_PASSWORD), - timeout); + this.timeout = SECONDS.toMillis(configProvider.getInteger( + CRASH_TRACKING_UPLOAD_TIMEOUT, CRASH_TRACKING_UPLOAD_TIMEOUT_DEFAULT)); + + uploadClient = OkHttpUtils.buildHttpClient( + config, + dispatcher, /* dispatcher */ + telemetryUrl, // will be overridden in each request + true, /* retryOnConnectionFailure */ + 4, /* maxRunningRequests */ // not having one request blocking the others + configProvider.getString(CRASH_TRACKING_PROXY_HOST), + configProvider.getInteger(CRASH_TRACKING_PROXY_PORT), + configProvider.getString(CRASH_TRACKING_PROXY_USERNAME), + configProvider.getString(CRASH_TRACKING_PROXY_PASSWORD), + timeout); } public void notifyCrashStarted(String error) { @@ -212,21 +208,19 @@ void sendPingToTelemetry(String error) { @VisibleForTesting void sendPingToErrorTracking(String error) { try { - final CrashLog ping = - new CrashLog( - storedConfig.reportUUID, - false, - ZonedDateTime.now().format(ISO_OFFSET_DATE_TIME), - new ErrorData( - null, - "Crashtracker crash ping: " - + (error != null ? error : "crash processing started"), - null), + final CrashLog ping = new CrashLog( + storedConfig.reportUUID, + false, + ZonedDateTime.now().format(ISO_OFFSET_DATE_TIME), + new ErrorData( null, - OSInfo.current(), - null, - null, - "1.0"); + "Crashtracker crash ping: " + (error != null ? error : "crash processing started"), + null), + null, + OSInfo.current(), + null, + null, + "1.0"); handleCall(makeErrorTrackingRequest(makeErrorTrackingRequestBody(ping, true)), "ping"); } catch (Throwable t) { log.error("Failed to prepare the error tracking crash ping payload", t); @@ -333,22 +327,21 @@ static String extractErrorKind(String fileContent) { return "NativeCrash"; } - private static final Pattern ERROR_MESSAGE_PATTERN = - Pattern.compile( - String.join( - "", - "^", - "(", - "# A fatal error has been detected by the Java Runtime Environment:", - "|", - "# There is insufficient memory for the Java Runtime Environment to continue\\.", - ")", - "\\n", - "(", - ".*, pid=-?\\d+, tid=-?\\d+", - ")", - "$"), - Pattern.DOTALL | Pattern.MULTILINE); + private static final Pattern ERROR_MESSAGE_PATTERN = Pattern.compile( + String.join( + "", + "^", + "(", + "# A fatal error has been detected by the Java Runtime Environment:", + "|", + "# There is insufficient memory for the Java Runtime Environment to continue\\.", + ")", + "\\n", + "(", + ".*, pid=-?\\d+, tid=-?\\d+", + ")", + "$"), + Pattern.DOTALL | Pattern.MULTILINE); @VisibleForTesting @SuppressForbidden @@ -359,11 +352,9 @@ static String extractErrorMessage(String fileContent) { return null; } return Arrays.stream(matcher.group().split(System.lineSeparator())) - .filter( - s -> - !s.equals("# A fatal error has been detected by the Java Runtime Environment:") - && !s.equals( - "# There is insufficient memory for the Java Runtime Environment to continue.")) + .filter(s -> !s.equals("# A fatal error has been detected by the Java Runtime Environment:") + && !s.equals( + "# There is insufficient memory for the Java Runtime Environment to continue.")) .map(s -> s.replaceFirst("^#\\s*", "").trim()) .collect(Collectors.joining("\n")) .trim(); @@ -418,10 +409,9 @@ private Call makeTelemetryRequest(@Nonnull RequestBody requestBody) throws IOExc headers.put(HEADER_DD_TELEMETRY_API_VERSION, TELEMETRY_API_VERSION); headers.put(HEADER_DD_TELEMETRY_REQUEST_TYPE, TELEMETRY_REQUEST_TYPE); - return uploadClient.newCall( - OkHttpUtils.prepareRequest(telemetryUrl, headers, config, agentless) - .post(requestBody) - .build()); + return uploadClient.newCall(OkHttpUtils.prepareRequest(telemetryUrl, headers, config, agentless) + .post(requestBody) + .build()); } private RequestBody makeTelemetryRequestBody(@Nonnull String payload, boolean isPing) @@ -573,9 +563,8 @@ private RequestBody makeErrorTrackingRequestBody(@Nonnull CrashLog payload, bool writer.name("os_type").value(payload.osInfo.osType); writer .name("version") - .value( - SystemProperties.get( - "os.version")); // this has been restructured under OsInfo so taking raw here + .value(SystemProperties.get( + "os.version")); // this has been restructured under OsInfo so taking raw here writer.endObject(); } // experimental diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java index f2e7ac706bb..40d1eeb0e66 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java @@ -127,10 +127,8 @@ private static void writeCrashUploaderScript( throws IOException { if (!scriptFile.exists()) { try (BufferedReader br = new BufferedReader(new InputStreamReader(template)); - BufferedWriter bw = - new BufferedWriter( - new OutputStreamWriter( - new FileOutputStream(scriptFile), StandardCharsets.UTF_8))) { + BufferedWriter bw = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(scriptFile), StandardCharsets.UTF_8))) { String line; while ((line = br.readLine()) != null) { bw.write(template(line, execClass, crashFile)); diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java index 8e1ba25f423..547965d7081 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/Initializer.java @@ -429,24 +429,21 @@ private static void initializeOOMENotifier(FlagAccess flags) { } private static String getScript(String scriptName) { - return TempLocationManager.getInstance().getTempDir().toString() - + "/" - + getScriptFileName(scriptName) - + " %p"; + return TempLocationManager.getInstance().getTempDir().toString() + "/" + + getScriptFileName(scriptName) + " %p"; } private static String getScriptFileName(String scriptName) { return scriptName + "." + (OperatingSystem.isWindows() ? "bat" : "sh"); } - private static final Set GROUP_WORLD_BITS = - EnumSet.of( - PosixFilePermission.GROUP_READ, - PosixFilePermission.GROUP_WRITE, - PosixFilePermission.GROUP_EXECUTE, - PosixFilePermission.OTHERS_READ, - PosixFilePermission.OTHERS_WRITE, - PosixFilePermission.OTHERS_EXECUTE); + private static final Set GROUP_WORLD_BITS = EnumSet.of( + PosixFilePermission.GROUP_READ, + PosixFilePermission.GROUP_WRITE, + PosixFilePermission.GROUP_EXECUTE, + PosixFilePermission.OTHERS_READ, + PosixFilePermission.OTHERS_WRITE, + PosixFilePermission.OTHERS_EXECUTE); /** * Returns {@code true} when {@code f} is safe to trust: on non-POSIX file systems always returns diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java index f4cc8e6874f..7499e7e7650 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/HotspotCrashLogParser.java @@ -86,10 +86,9 @@ public HotspotCrashLogParser() { private static final Pattern NEWLINE_SPLITTER = Pattern.compile("\n"); // Groups: 1=si_signo, 2=signal name, 3=si_code, 4=si_code name, // 5=si_addr (null for SI_USER), 6=si_pid (null for si_addr), 7=si_uid (null for si_addr) - private static final Pattern SIGINFO_PARSER = - Pattern.compile( - "siginfo:\\s+si_signo:\\s+(\\d+)\\s+\\((\\w+)\\),\\s+si_code:\\s+(\\d+)\\s+\\(([^)]+)\\),\\s+" - + "(?:si_addr:\\s+(0x[0-9a-fA-F]+)|si_pid:\\s+(\\d+),\\s+si_uid:\\s+(\\d+))"); + private static final Pattern SIGINFO_PARSER = Pattern.compile( + "siginfo:\\s+si_signo:\\s+(\\d+)\\s+\\((\\w+)\\),\\s+si_code:\\s+(\\d+)\\s+\\(([^)]+)\\),\\s+" + + "(?:si_addr:\\s+(0x[0-9a-fA-F]+)|si_pid:\\s+(\\d+),\\s+si_uid:\\s+(\\d+))"); private static final Pattern DYNAMIC_LIBS_PATH_PARSER = Pattern.compile("^(?:0x)?[0-9a-fA-F]+(?:-[0-9a-fA-F]+)?\\s+(?:[^\\s/\\[]+\\s+)*(.*)$"); // Matches register entries like: @@ -163,102 +162,98 @@ private StackFrame parseLine(String line) { } switch (firstChar) { case 'J': - case 'A': - { - // spotless:off + case 'A': { + // spotless:off // J 36572 c2 datadog.trace.util.AgentTaskScheduler$PeriodicTask.run()V (25 bytes) @ 0x00007f2fd0198488 [0x00007f2fd0198420+0x0000000000000068] // J 3896 c2 java.nio.ByteBuffer.allocate(I)Ljava/nio/ByteBuffer; java.base@21.0.1 (20 bytes) @ 0x0000000112ad51e8 [0x0000000112ad4fc0+0x0000000000000228] // J 302 java.util.zip.ZipFile.getEntry(J[BZ)J (0 bytes) @ 0x00007fa287303dce [0x00007fa287303d00+0xce] // spotless:on - String[] parts = SPACE_SPLITTER.split(line); - int bytesToken = -1; - for (int i = 0; i < parts.length - 1; i++) { - if (parts[i].startsWith("(") && "bytes)".equals(parts[i + 1])) { - bytesToken = i; - break; - } + String[] parts = SPACE_SPLITTER.split(line); + int bytesToken = -1; + for (int i = 0; i < parts.length - 1; i++) { + if (parts[i].startsWith("(") && "bytes)".equals(parts[i + 1])) { + bytesToken = i; + break; } - if (bytesToken > 1) { - String candidate = parts[bytesToken - 1]; - // Newer JVMs insert a module token before "(NN bytes)". - if (candidate.contains("@")) { - candidate = parts[bytesToken - 2]; - } - if (!candidate.startsWith("(")) { - functionName = candidate; - } - } else if (parts.length > 3 && !parts[3].startsWith("(")) { - functionName = parts[3]; + } + if (bytesToken > 1) { + String candidate = parts[bytesToken - 1]; + // Newer JVMs insert a module token before "(NN bytes)". + if (candidate.contains("@")) { + candidate = parts[bytesToken - 2]; } - - Matcher matcher = COMPILED_JAVA_ADDRESS_PARSER.matcher(line); - if (matcher.find()) { - ip = matcher.group(1); - symbolAddress = matcher.group(2); - relAddress = matcher.group(3); + if (!candidate.startsWith("(")) { + functionName = candidate; } - break; + } else if (parts.length > 3 && !parts[3].startsWith("(")) { + functionName = parts[3]; } - case 'j': - { - // j one.profiler.AsyncProfiler.stop()V+1 - String[] parts = PLUS_SPLITTER.split(line, 2); - if (parts.length > 0 && parts[0].length() > 3) { - functionName = parts[0].substring(3); - if (parts.length > 1) { - try { - functionLine = Integer.parseInt(parts[1]); - } catch (NumberFormatException ignored) { - } + + Matcher matcher = COMPILED_JAVA_ADDRESS_PARSER.matcher(line); + if (matcher.find()) { + ip = matcher.group(1); + symbolAddress = matcher.group(2); + relAddress = matcher.group(3); + } + break; + } + case 'j': { + // j one.profiler.AsyncProfiler.stop()V+1 + String[] parts = PLUS_SPLITTER.split(line, 2); + if (parts.length > 0 && parts[0].length() > 3) { + functionName = parts[0].substring(3); + if (parts.length > 1) { + try { + functionLine = Integer.parseInt(parts[1]); + } catch (NumberFormatException ignored) { } } - break; } + break; + } case 'C': - case 'V': - { - // V [libjvm.so+0x8fc20a] thread_entry(JavaThread*, JavaThread*)+0x8a - // C [libpthread.so.0+0x13d60] - int libstart = line.indexOf('['); - if (libstart > 0) { - int libend = line.indexOf(']', libstart + 1); - if (libend > 0) { - String libAndRelAddress = line.substring(libstart + 1, libend); - String[] parts = PLUS_SPLITTER.split(libAndRelAddress, 2); - filename = parts[0]; - if (parts.length > 1) { - relAddress = parts[1]; - } + case 'V': { + // V [libjvm.so+0x8fc20a] thread_entry(JavaThread*, JavaThread*)+0x8a + // C [libpthread.so.0+0x13d60] + int libstart = line.indexOf('['); + if (libstart > 0) { + int libend = line.indexOf(']', libstart + 1); + if (libend > 0) { + String libAndRelAddress = line.substring(libstart + 1, libend); + String[] parts = PLUS_SPLITTER.split(libAndRelAddress, 2); + filename = parts[0]; + if (parts.length > 1) { + relAddress = parts[1]; + } - // Extract function name if present (after the bracket) - // Keep the relative address offset as part of the function name - if (libend + 3 < line.length() && !line.endsWith("]")) { - functionName = line.substring(libend + 3).trim(); - } + // Extract function name if present (after the bracket) + // Keep the relative address offset as part of the function name + if (libend + 3 < line.length() && !line.endsWith("]")) { + functionName = line.substring(libend + 3).trim(); } } - break; } - case 'v': - { - // v ~StubRoutines::call_stub - // v ~RuntimeStub::_new_array_Java 0x00000001124cb638 - if (line.length() > 3) { - String remaining = line.substring(3).trim(); - // Check for address at the end (0x...) - int lastSpace = remaining.lastIndexOf(' '); - if (lastSpace > 0 && lastSpace + 1 < remaining.length()) { - String possibleAddress = remaining.substring(lastSpace + 1); - if (possibleAddress.startsWith("0x")) { - relAddress = possibleAddress; - remaining = remaining.substring(0, lastSpace).trim(); - } + break; + } + case 'v': { + // v ~StubRoutines::call_stub + // v ~RuntimeStub::_new_array_Java 0x00000001124cb638 + if (line.length() > 3) { + String remaining = line.substring(3).trim(); + // Check for address at the end (0x...) + int lastSpace = remaining.lastIndexOf(' '); + if (lastSpace > 0 && lastSpace + 1 < remaining.length()) { + String possibleAddress = remaining.substring(lastSpace + 1); + if (possibleAddress.startsWith("0x")) { + relAddress = possibleAddress; + remaining = remaining.substring(0, lastSpace).trim(); } - // Keep the relative address offset as part of the function name - functionName = remaining; } - break; + // Keep the relative address offset as part of the function name + functionName = remaining; } + break; + } default: // do nothing break; @@ -584,37 +579,34 @@ public CrashLog parse(String uuid, String crashLog) { } final BuildInfo buildInfo = buildIdCollector.getBuildInfo(frame.path); if (buildInfo != null) { - enrichedFrames.add( - new StackFrame( - normalizeFilename(frame.path), - frame.line, - frame.function, - frame.frameType, - buildInfo.buildId, - buildInfo.buildIdType, - buildInfo.fileType, - frame.ip, - frame.symbolAddress, - frame.relativeAddress)); + enrichedFrames.add(new StackFrame( + normalizeFilename(frame.path), + frame.line, + frame.function, + frame.frameType, + buildInfo.buildId, + buildInfo.buildIdType, + buildInfo.fileType, + frame.ip, + frame.symbolAddress, + frame.relativeAddress)); } else { - enrichedFrames.add( - new StackFrame( - normalizeFilename(frame.path), - frame.line, - frame.function, - frame.frameType, - null, - null, - null, - frame.ip, - frame.symbolAddress, - frame.relativeAddress)); + enrichedFrames.add(new StackFrame( + normalizeFilename(frame.path), + frame.line, + frame.function, + frame.frameType, + null, + null, + null, + frame.ip, + frame.symbolAddress, + frame.relativeAddress)); } } - ErrorData error = - new ErrorData( - kind, message, threadName, new StackTrace(enrichedFrames.toArray(new StackFrame[0]))); + ErrorData error = new ErrorData( + kind, message, threadName, new StackTrace(enrichedFrames.toArray(new StackFrame[0]))); // We can not really extract the full metadata and os info from the crash log // This code assumes the parser is run on the same machine as the crash happened Metadata metadata = new Metadata("dd-trace-java", VersionInfo.VERSION, "java", null); @@ -625,21 +617,18 @@ public CrashLog parse(String uuid, String crashLog) { registerToMemoryMapping.replaceAll((k, v) -> RedactUtils.redactRegisterToMemoryMapping(v)); resolvedMapping = registerToMemoryMapping; } - RuntimeInfo runtimeInfo = - (jreVersion != null || javaVm != null || vmInfo != null) - ? new RuntimeInfo(jreVersion, javaVm, vmInfo) - : null; - Experimental experimental = - !registers.isEmpty() - || resolvedMapping != null - || (runtimeArgs != null && !runtimeArgs.isEmpty()) - || runtimeInfo != null - ? new Experimental(registers, resolvedMapping, runtimeArgs, runtimeInfo) - : null; - DynamicLibs files = - (dynamicLibraryLines != null && !dynamicLibraryLines.isEmpty()) - ? new DynamicLibs(dynamicLibraryKey, dynamicLibraryLines) - : null; + RuntimeInfo runtimeInfo = (jreVersion != null || javaVm != null || vmInfo != null) + ? new RuntimeInfo(jreVersion, javaVm, vmInfo) + : null; + Experimental experimental = !registers.isEmpty() + || resolvedMapping != null + || (runtimeArgs != null && !runtimeArgs.isEmpty()) + || runtimeInfo != null + ? new Experimental(registers, resolvedMapping, runtimeArgs, runtimeInfo) + : null; + DynamicLibs files = (dynamicLibraryLines != null && !dynamicLibraryLines.isEmpty()) + ? new DynamicLibs(dynamicLibraryKey, dynamicLibraryLines) + : null; return new CrashLog( uuid, incomplete, diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/J9JavacoreParser.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/J9JavacoreParser.java index cb5dc5ed8f5..a62ba9ea7d5 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/J9JavacoreParser.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/J9JavacoreParser.java @@ -74,9 +74,8 @@ public J9JavacoreParser() { private static final Pattern NEWLINE_SPLITTER = Pattern.compile("\\n"); private static final Pattern SIG_INFO_PATTERN = Pattern.compile("1TISIGINFO\\s+Dump Event \"(\\w+)\"(?:\\s+\\((\\w+)\\))?.*"); - private static final Pattern DATETIME_PATTERN = - Pattern.compile( - "1TIDATETIME\\s+Date:\\s+(\\d{4}/\\d{2}/\\d{2})\\s+at\\s+(\\d{2}:\\d{2}:\\d{2})(?::(\\d{3}))?.*"); + private static final Pattern DATETIME_PATTERN = Pattern.compile( + "1TIDATETIME\\s+Date:\\s+(\\d{4}/\\d{2}/\\d{2})\\s+at\\s+(\\d{2}:\\d{2}:\\d{2})(?::(\\d{3}))?.*"); private static final Pattern PID_PATTERN = Pattern.compile("1CIPROCESSID\\s+Process ID:\\s+(\\d+).*"); private static final Pattern CURRENT_THREAD_PATTERN = @@ -261,10 +260,9 @@ public CrashLog parse(String uuid, String javacoreContent) { kind = "OutOfMemory"; message = exceptionDetail != null ? exceptionDetail : "OutOfMemoryError"; } else if (eventType != null) { - kind = - sigInfo != null && sigInfo.name != null - ? sigInfo.name - : eventType.toUpperCase(Locale.ROOT); + kind = sigInfo != null && sigInfo.name != null + ? sigInfo.name + : eventType.toUpperCase(Locale.ROOT); message = "Process terminated by signal " + kind; } else { kind = "InternalError"; @@ -282,43 +280,39 @@ public CrashLog parse(String uuid, String javacoreContent) { // Try to resolve build ID for this library final BuildInfo buildInfo = buildIdCollector.getBuildInfo(frame.path); if (buildInfo != null) { - enrichedFrames.add( - new StackFrame( - frame.path, - frame.line, - frame.function, - frame.frameType, - buildInfo.buildId, - buildInfo.buildIdType, - buildInfo.fileType, - frame.ip, - frame.symbolAddress, - frame.relativeAddress)); + enrichedFrames.add(new StackFrame( + frame.path, + frame.line, + frame.function, + frame.frameType, + buildInfo.buildId, + buildInfo.buildIdType, + buildInfo.fileType, + frame.ip, + frame.symbolAddress, + frame.relativeAddress)); } else { enrichedFrames.add(frame); } } - ErrorData error = - new ErrorData( - kind, - message, - currentThreadName, - new StackTrace(enrichedFrames.toArray(new StackFrame[0]))); + ErrorData error = new ErrorData( + kind, + message, + currentThreadName, + new StackTrace(enrichedFrames.toArray(new StackFrame[0]))); Metadata metadata = new Metadata("dd-trace-java", VersionInfo.VERSION, "java", null); Integer parsedPid = safelyParseInt(pid); ProcInfo procInfo = parsedPid != null ? new ProcInfo(parsedPid) : null; List runtimeArgs = j9UserArgs.build(); - RuntimeInfo runtimeInfo = - (j9JavaVersion != null || j9VmVersion != null) - ? new RuntimeInfo(j9JavaVersion, null, j9VmVersion) - : null; - Experimental experimental = - (registers != null && !registers.isEmpty()) - || (runtimeArgs != null && !runtimeArgs.isEmpty()) - || runtimeInfo != null - ? new Experimental(registers, null, runtimeArgs, runtimeInfo) - : null; + RuntimeInfo runtimeInfo = (j9JavaVersion != null || j9VmVersion != null) + ? new RuntimeInfo(j9JavaVersion, null, j9VmVersion) + : null; + Experimental experimental = (registers != null && !registers.isEmpty()) + || (runtimeArgs != null && !runtimeArgs.isEmpty()) + || runtimeInfo != null + ? new Experimental(registers, null, runtimeArgs, runtimeInfo) + : null; return new CrashLog( uuid, diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RedactUtils.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RedactUtils.java index 6665d0f412d..6ce234572e0 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RedactUtils.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RedactUtils.java @@ -61,9 +61,8 @@ public final class RedactUtils { // Dotted class name followed by an OOP reference: "com.company.Type"{0x...} // This specifically identifies the inline string value of a java.lang.Class 'name' field - private static final Pattern DOTTED_CLASS_OOP_REF = - Pattern.compile( - "\"([A-Za-z$_][A-Za-z0-9$_]*(?:\\.[A-Za-z$_][A-Za-z0-9$_]*)*)\"(\\{0x[0-9a-fA-F]+\\})"); + private static final Pattern DOTTED_CLASS_OOP_REF = Pattern.compile( + "\"([A-Za-z$_][A-Za-z0-9$_]*(?:\\.[A-Za-z$_][A-Za-z0-9$_]*)*)\"(\\{0x[0-9a-fA-F]+\\})"); // is an oop: com.company.Class private static final Pattern IS_AN_OOP = @@ -74,9 +73,8 @@ public final class RedactUtils { // "memory: 0x | ff ff ff ff ..." (Linux/macOS amd64 — address + pipe + bytes) // "memory: ff ff ff ff ..." (Linux aarch64 — bytes only) // The address (when present) is kept; only the raw bytes are redacted. - private static final Pattern READABLE_MEMORY_HEX_DUMP = - Pattern.compile( - "(points into unknown readable memory: (?:0x[0-9a-fA-F]+ \\| )?)([0-9a-fA-F]{2}(?: [0-9a-fA-F]{2})*)"); + private static final Pattern READABLE_MEMORY_HEX_DUMP = Pattern.compile( + "(points into unknown readable memory: (?:0x[0-9a-fA-F]+ \\| )?)([0-9a-fA-F]{2}(?: [0-9a-fA-F]{2})*)"); private RedactUtils() {} @@ -136,10 +134,9 @@ private static String redactStringOopRef(String line, boolean isClassOop) { return replaceAll( DOTTED_CLASS_OOP_REF, line, - m -> - isClassOop - ? "\"" + redactDottedClassName(m.group(1)) + "\"" + m.group(2) - : "\"" + REDACTED_STRING + "\"" + m.group(2)); + m -> isClassOop + ? "\"" + redactDottedClassName(m.group(1)) + "\"" + m.group(2) + : "\"" + REDACTED_STRING + "\"" + m.group(2)); } /** @@ -198,15 +195,12 @@ static String redactObjFieldRef(String line) { * dot-separated (PRODUCT build) and slash-separated (debug build) class names. */ static String redactNmethodClass(String line) { - return replaceAll( - NMETHOD_CLASS, - line, - m -> { - String cls = m.group(1); - String redacted = - cls.indexOf('/') >= 0 ? redactJvmClassName(cls) : redactDottedClassName(cls); - return redacted + "::"; - }); + return replaceAll(NMETHOD_CLASS, line, m -> { + String cls = m.group(1); + String redacted = + cls.indexOf('/') >= 0 ? redactJvmClassName(cls) : redactDottedClassName(cls); + return redacted + "::"; + }); } /** diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java index 1ecec69a34e..0e82ef2ac97 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java @@ -78,7 +78,8 @@ public void setup() throws IOException { when(config.getHostName()).thenReturn(HOSTNAME); when(config.getServiceName()).thenReturn(SERVICE); when(config.getVersion()).thenReturn(VERSION); - when(config.getFinalCrashTrackingTelemetryUrl()).thenReturn(server.url(URL_PATH).toString()); + when(config.getFinalCrashTrackingTelemetryUrl()) + .thenReturn(server.url(URL_PATH).toString()); when(config.getFinalCrashTrackingErrorTrackingUrl()) .thenReturn(server.url(URL_PATH).toString()); when(config.isCrashTrackingAgentless()).thenReturn(false); @@ -123,7 +124,8 @@ public void testExtractStackTraceFromRealCrashFile() throws IOException { assertEquals(SERVICE, event.get("service").asText()); assertEquals(msg, event.get("message").asText()); assertEquals( - readFileAsString("sample-stacktrace.txt"), event.get("error").get("stack").asText()); + readFileAsString("sample-stacktrace.txt"), + event.get("error").get("stack").asText()); assertEquals("ERROR", event.get("level").asText()); assertTrue(event.get("ddtags").asText().contains("is_crash:true")); } @@ -145,12 +147,11 @@ private Path getResourcePath(String resourceName) throws Exception { public void testTelemetryCrashPing() throws Exception { // Given final String expected = readFileAsString("golden/telemetry/sample-ping-for-telemetry.json"); - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .processTags("a:b") - .runtimeId("1234") - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .processTags("a:b") + .runtimeId("1234") + .build(); // When uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -196,13 +197,12 @@ public void testErrorTrackingCrashPing() throws Exception { expected.remove("ddtags"); expected.remove("os_info"); expected.remove("timestamp"); - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .processTags("a:b") - .runtimeId("1234") - .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) // take the real ones - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .processTags("a:b") + .runtimeId("1234") + .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) // take the real ones + .build(); // When uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -239,19 +239,16 @@ public void testErrorTrackingCrashPing() throws Exception { assertTrue(ddtags.contains("runtime_name:")); // assert platform independent equality - assertEquals( - expected, - extracted, - () -> { - try { - return "Expected: " - + mapper.writeValueAsString(expected) - + "\nbut got: " - + mapper.writeValueAsString(extracted); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - }); + assertEquals(expected, extracted, () -> { + try { + return "Expected: " + + mapper.writeValueAsString(expected) + + "\nbut got: " + + mapper.writeValueAsString(extracted); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + }); } @ParameterizedTest @@ -266,12 +263,11 @@ public void testTelemetryHappyPath(String log) throws Exception { // Given CrashLog expected = CrashLog.fromJson(readFileAsString("golden/telemetry/" + log)); final String inputLog = log.replace(".json", ".txt"); - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .processTags("a:b") - .runtimeId("1234") - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .processTags("a:b") + .runtimeId("1234") + .build(); // When uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -299,7 +295,8 @@ public void testTelemetryHappyPath(String log) throws Exception { assertThatJson(extracted.toJson()) .whenIgnoringPaths("os_info", "metadata", "experimental") .isEqualTo(expected.toJson()); - assertEquals("severity:crash,is_crash:true", event.get("payload").get(0).get("tags").asText()); + assertEquals( + "severity:crash,is_crash:true", event.get("payload").get(0).get("tags").asText()); assertCommonPayload(event); } @@ -320,14 +317,13 @@ public void testErrorTrackingHappyPath(String log) throws Exception { expected.remove("ddtags"); expected.remove("os_info"); final String inputLog = log.replace(".json", ".txt"); - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .processTags("a:b") - .runtimeId("1234") - .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) // take the real ones - .extendedInfoEnabled(true) - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .processTags("a:b") + .runtimeId("1234") + .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) // take the real ones + .extendedInfoEnabled(true) + .build(); // When uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -369,11 +365,10 @@ public void testErrorTrackingHappyPath(String log) throws Exception { @Test public void testErrorTrackingExcludesExtendedInfoByDefault() throws Exception { // extendedInfoEnabled defaults to false — files, thread_name and runtime_args must not appear - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) + .build(); uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -390,14 +385,13 @@ public void testErrorTrackingExcludesExtendedInfoByDefault() throws Exception { @Test public void testErrorTrackingSerializesRuntimeArgs() throws Exception { - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .processTags("a:b") - .runtimeId("1234") - .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) - .extendedInfoEnabled(true) - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .processTags("a:b") + .runtimeId("1234") + .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) + .extendedInfoEnabled(true) + .build(); uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -421,14 +415,13 @@ public void testErrorTrackingSerializesRuntimeArgs() throws Exception { @Test public void testErrorTrackingSerializesRegisterToMemoryMapping() throws Exception { - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .processTags("a:b") - .runtimeId("1234") - .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) - .extendedInfoEnabled(true) - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .processTags("a:b") + .runtimeId("1234") + .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) + .extendedInfoEnabled(true) + .build(); uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -448,13 +441,12 @@ public void testErrorTrackingSerializesRegisterToMemoryMapping() throws Exceptio @Test public void testErrorTrackingOmitsRegisterToMemoryMappingByDefault() throws Exception { // registerMappingEnabled defaults to false — the mapping must not appear in the payload - ConfigManager.StoredConfig crashConfig = - new ConfigManager.StoredConfig.Builder(config) - .reportUUID(SAMPLE_UUID) - .processTags("a:b") - .runtimeId("1234") - .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) - .build(); + ConfigManager.StoredConfig crashConfig = new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .processTags("a:b") + .runtimeId("1234") + .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) + .build(); uploader = new CrashUploader(config, crashConfig); server.enqueue(new MockResponse().setResponseCode(200)); @@ -468,7 +460,8 @@ public void testErrorTrackingOmitsRegisterToMemoryMappingByDefault() throws Exce // experimental must either be absent or, if present, contain at least one field (no empty {}) assertThat(experimental.isMissingNode() || (experimental.isObject() && experimental.size() > 0)) .isTrue(); - assertThat(event.at("/experimental/register_to_memory_mapping").isMissingNode()).isTrue(); + assertThat(event.at("/experimental/register_to_memory_mapping").isMissingNode()) + .isTrue(); } private void assertCommonHeader(JsonNode event) { @@ -487,7 +480,8 @@ private void assertCommonPayload(JsonNode event) { event.get("application").get("language_version").asText()); assertEquals(SERVICE, event.get("application").get("service_name").asText()); assertEquals(VERSION, event.get("application").get("service_version").asText()); - assertEquals(VersionInfo.VERSION, event.get("application").get("tracer_version").asText()); + assertEquals( + VersionInfo.VERSION, event.get("application").get("tracer_version").asText()); assertEquals("a:b", event.get("application").get("process_tags").asText()); // host assertEquals(HOSTNAME, event.get("host").get("hostname").asText()); diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerSecurityTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerSecurityTest.java index 8f0cc003948..b71b1daaf32 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerSecurityTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerSecurityTest.java @@ -45,15 +45,11 @@ void teardown() throws IOException { return; } try (Stream stream = Files.walk(tempDir)) { - stream - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach( - f -> { - // Restore write permission before delete to handle read-only test artefacts - f.setWritable(true, false); - f.delete(); - }); + stream.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(f -> { + // Restore write permission before delete to handle read-only test artefacts + f.setWritable(true, false); + f.delete(); + }); } } @@ -179,8 +175,7 @@ void cleanPosixTreeEndToEndInitProducesScriptsAndConfigs() throws Exception { private static void assertNoGroupWorldWriteBit(Path path) throws IOException { Set perms = Files.getPosixFilePermissions(path); for (PosixFilePermission bit : - new PosixFilePermission[] { - PosixFilePermission.GROUP_WRITE, PosixFilePermission.OTHERS_WRITE + new PosixFilePermission[] {PosixFilePermission.GROUP_WRITE, PosixFilePermission.OTHERS_WRITE }) { assertFalse( perms.contains(bit), diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerTest.java index 53cf66f72a1..0f2f69b820b 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ScriptInitializerTest.java @@ -40,18 +40,16 @@ void teardown() throws Exception { @Test void testCrashUploaderSanity() { assertDoesNotThrow(() -> CrashUploaderScriptInitializer.initialize(null, null)); - assertDoesNotThrow( - () -> - CrashUploaderScriptInitializer.initialize( - tempDir.resolve("dummy.sh").toString(), null)); + assertDoesNotThrow(() -> + CrashUploaderScriptInitializer.initialize(tempDir.resolve("dummy.sh").toString(), null)); assertDoesNotThrow(() -> CrashUploaderScriptInitializer.initialize(null, "hs_err.log")); } @Test void testOomeNotifierSanity() { assertDoesNotThrow(() -> OOMENotifierScriptInitializer.initialize(null)); - assertDoesNotThrow( - () -> OOMENotifierScriptInitializer.initialize(tempDir.resolve("dummy.sh").toString())); + assertDoesNotThrow(() -> + OOMENotifierScriptInitializer.initialize(tempDir.resolve("dummy.sh").toString())); } @ParameterizedTest diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdCollectorTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdCollectorTest.java index a145d09997b..eeb558585c1 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdCollectorTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdCollectorTest.java @@ -11,7 +11,8 @@ public class BuildIdCollectorTest { - @TempDir Path tempDir; + @TempDir + Path tempDir; @Test void testAwaitCollectionDoneWithinTimeout() throws IOException { diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java index 28bcda39e7f..3514bc99863 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java @@ -56,10 +56,8 @@ public void testIncompleteParsing() throws Exception { /** macOS aarch64 uses lowercase register names: x0-x28, fp, lr, sp, pc, cpsr */ @Test public void testRegisterParsingMacosAarch64() throws Exception { - CrashLog crashLog = - new HotspotCrashLogParser() - .parse( - UUID.randomUUID().toString(), readFileAsString("sample-crash-macos-aarch64.txt")); + CrashLog crashLog = new HotspotCrashLogParser() + .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash-macos-aarch64.txt")); assertNotNull(crashLog.experimental, "experimental field should be populated"); assertNotNull(crashLog.experimental.ucontext, "ucontext should be populated"); @@ -80,9 +78,8 @@ public void testRegisterParsingMacosAarch64() throws Exception { assertNotNull(crashLog.experimental.runtimeArgs); assertTrue(crashLog.experimental.runtimeArgs.contains("--enable-native-access=ALL-UNNAMED")); assertTrue(crashLog.experimental.runtimeArgs.contains("--add-modules=ALL-DEFAULT")); - assertFalse( - crashLog.experimental.runtimeArgs.stream() - .anyMatch(arg -> arg.contains("SourceLauncher") || arg.endsWith("CrashTest.java"))); + assertFalse(crashLog.experimental.runtimeArgs.stream() + .anyMatch(arg -> arg.contains("SourceLauncher") || arg.endsWith("CrashTest.java"))); } /** @@ -92,10 +89,8 @@ public void testRegisterParsingMacosAarch64() throws Exception { */ @Test public void testRegisterToMemoryMappingMacosAarch64() throws Exception { - CrashLog crashLog = - new HotspotCrashLogParser() - .parse( - UUID.randomUUID().toString(), readFileAsString("sample-crash-macos-aarch64.txt")); + CrashLog crashLog = new HotspotCrashLogParser() + .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash-macos-aarch64.txt")); Map mapping = crashLog.experimental.registerToMemoryMapping; @@ -135,10 +130,8 @@ public void testRegisterToMemoryMappingMacosAarch64() throws Exception { /** Linux aarch64 uses uppercase register names: R0-R30 */ @Test public void testRegisterParsingLinuxAarch64() throws Exception { - CrashLog crashLog = - new HotspotCrashLogParser() - .parse( - UUID.randomUUID().toString(), readFileAsString("sample-crash-linux-aarch64.txt")); + CrashLog crashLog = new HotspotCrashLogParser() + .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash-linux-aarch64.txt")); assertNotNull(crashLog.experimental, "experimental field should be populated"); assertNotNull(crashLog.experimental.ucontext, "ucontext should be populated"); @@ -150,9 +143,8 @@ public void testRegisterParsingLinuxAarch64() throws Exception { @Test public void testRegisterToMemoryMapping() throws Exception { - CrashLog crashLog = - new HotspotCrashLogParser() - .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash.txt")); + CrashLog crashLog = new HotspotCrashLogParser() + .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash.txt")); assertThat(crashLog.experimental).isNotNull(); assertThat(crashLog.experimental.registerToMemoryMapping) @@ -174,10 +166,8 @@ public void testRegisterToMemoryMapping() throws Exception { @Test public void testRegisterToMultilineMemoryMapping() throws Exception { - CrashLog crashLog = - new HotspotCrashLogParser() - .parse( - UUID.randomUUID().toString(), readFileAsString("sample-crash-linux-aarch64.txt")); + CrashLog crashLog = new HotspotCrashLogParser() + .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash-linux-aarch64.txt")); assertThat(crashLog.experimental).isNotNull(); assertThat(crashLog.experimental.registerToMemoryMapping).isNotNull().containsKey("R10"); @@ -197,26 +187,21 @@ public void testRegisterToMultilineMemoryMapping() throws Exception { @Test public void testRuntimeArgsFilteringFromHotspotJvmArgs() throws Exception { - final CrashLog crashLog = - new HotspotCrashLogParser() - .parse( - UUID.randomUUID().toString(), readFileAsString("sample-crash-for-telemetry.txt")); + final CrashLog crashLog = new HotspotCrashLogParser() + .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash-for-telemetry.txt")); assertNotNull(crashLog.experimental); assertNotNull(crashLog.experimental.runtimeArgs); - assertTrue( - crashLog.experimental.runtimeArgs.contains( - "-javaagent:/opt/REDACT_THIS/datadog-apm-agent/dd-java-agent.jar")); + assertTrue(crashLog.experimental.runtimeArgs.contains( + "-javaagent:/opt/REDACT_THIS/datadog-apm-agent/dd-java-agent.jar")); assertFalse(crashLog.experimental.runtimeArgs.contains("-Ddd.profiling.enabled=true")); assertFalse(crashLog.experimental.runtimeArgs.contains("-Ddd.service=REDACT_THIS")); assertTrue( crashLog.experimental.runtimeArgs.stream().anyMatch(arg -> arg.startsWith("--add-opens="))); - assertFalse( - crashLog.experimental.runtimeArgs.stream() - .anyMatch(arg -> arg.startsWith("-Djavax.xml.ws.spi.Provider="))); - assertTrue( - crashLog.experimental.runtimeArgs.stream() - .anyMatch(arg -> arg.startsWith("-Djava.util.logging.config.file="))); + assertFalse(crashLog.experimental.runtimeArgs.stream() + .anyMatch(arg -> arg.startsWith("-Djavax.xml.ws.spi.Provider="))); + assertTrue(crashLog.experimental.runtimeArgs.stream() + .anyMatch(arg -> arg.startsWith("-Djava.util.logging.config.file="))); } @TableTest({ @@ -234,10 +219,8 @@ public void testOsInfoFromSystemProperties(String filename) throws Exception { @Test public void testFrameTypesFromHotspotStack() throws Exception { - final CrashLog crashLog = - new HotspotCrashLogParser() - .parse( - UUID.randomUUID().toString(), readFileAsString("sample-crash-for-telemetry.txt")); + final CrashLog crashLog = new HotspotCrashLogParser() + .parse(UUID.randomUUID().toString(), readFileAsString("sample-crash-for-telemetry.txt")); assertEquals("vm", crashLog.error.stack.frames[0].frameType); assertEquals("native", crashLog.error.stack.frames[3].frameType); @@ -249,11 +232,9 @@ public void testFrameTypesFromHotspotStack() throws Exception { @Test public void testParsesJdk8CompiledFramesWithoutCompilerLevel() throws Exception { - final CrashLog crashLog = - new HotspotCrashLogParser() - .parse( - UUID.randomUUID().toString(), - readFileAsString("sample-crash-jdk8-zip-getentry.txt")); + final CrashLog crashLog = new HotspotCrashLogParser() + .parse( + UUID.randomUUID().toString(), readFileAsString("sample-crash-jdk8-zip-getentry.txt")); assertEquals(10, crashLog.error.stack.frames.length); // native frames @@ -300,16 +281,15 @@ public void testSiginfoLineNotAppendedToRegisterMapping() { // Minimal crash log fragment that drives the parser into REGISTER_TO_MEMORY_MAPPING state, // then encounters a siginfo: line (returned null by nextThreadSectionState — intentional, not // a state transition), then continues with another register entry. - String log = - "# A fatal error has been detected by the Java Runtime Environment:\n" - + "# A core dump file may have been created\n" - + "T H R E A D\n" - + "Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)\n" - + "Register to memory mapping:\n" - + "\n" - + "RSP =0x00007f35e6253190 is pointing into the stack for thread: 0x00007f36cd96cc80\n" - + "siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000070\n" - + "RDI =0x0 is NULL\n"; + String log = "# A fatal error has been detected by the Java Runtime Environment:\n" + + "# A core dump file may have been created\n" + + "T H R E A D\n" + + "Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)\n" + + "Register to memory mapping:\n" + + "\n" + + "RSP =0x00007f35e6253190 is pointing into the stack for thread: 0x00007f36cd96cc80\n" + + "siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000070\n" + + "RDI =0x0 is NULL\n"; CrashLog crashLog = new HotspotCrashLogParser().parse(UUID.randomUUID().toString(), log); @@ -362,13 +342,12 @@ public void testRuntimeInfoParsing( @Test public void testNoSignalProducesInternalError() throws Exception { // A crash log that reaches the PROCESS section but has no siginfo line - String crashLog = - "# A fatal error has been detected by the Java Runtime Environment:\n" - + "#\n" - + "# Core dump will be written.\n" - + "--------------- T H R E A D ---------------\n" - + "Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)\n" - + "--------------- P R O C E S S ---------------\n"; + String crashLog = "# A fatal error has been detected by the Java Runtime Environment:\n" + + "#\n" + + "# Core dump will be written.\n" + + "--------------- T H R E A D ---------------\n" + + "Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)\n" + + "--------------- P R O C E S S ---------------\n"; CrashLog result = new HotspotCrashLogParser().parse(UUID.randomUUID().toString(), crashLog); diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/J9JavacoreParserTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/J9JavacoreParserTest.java index bfa122b0f2e..7ff27fe8dbf 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/J9JavacoreParserTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/J9JavacoreParserTest.java @@ -143,12 +143,11 @@ public void testParseIncompleteJavacore() throws Exception { // Given final String uuid = UUID.randomUUID().toString(); // An incomplete javacore that's missing the THREADS section - String incompleteJavacore = - "0SECTION TITLE subcomponent dump routine\n" - + "NULL ===============================\n" - + "1TICHARSET UTF-8\n" - + "1TISIGINFO Dump Event \"gpf\" (00002000) received\n" - + "1TIDATETIME Date: 2024/08/25 at 15:55:09:123\n"; + String incompleteJavacore = "0SECTION TITLE subcomponent dump routine\n" + + "NULL ===============================\n" + + "1TICHARSET UTF-8\n" + + "1TISIGINFO Dump Event \"gpf\" (00002000) received\n" + + "1TIDATETIME Date: 2024/08/25 at 15:55:09:123\n"; // When final CrashLog crashLog = new J9JavacoreParser().parse(uuid, incompleteJavacore); @@ -163,25 +162,24 @@ public void testParseIncompleteJavacore() throws Exception { public void testAbortCrash() throws Exception { // Given - a javacore for an abort event final String uuid = UUID.randomUUID().toString(); - String javacoreContent = - "0SECTION TITLE subcomponent dump routine\n" - + "NULL ===============================\n" - + "1TICHARSET UTF-8\n" - + "1TISIGINFO Dump Event \"abort\" (00000020) received\n" - + "1TIDATETIME Date: 2024/10/01 at 08:30:00:000\n" - + "NULL ------------------------------------------------------------------------\n" - + "0SECTION ENVINFO subcomponent dump routine\n" - + "NULL =================================\n" - + "1CIPROCESSID Process ID: 99999\n" - + "NULL ------------------------------------------------------------------------\n" - + "0SECTION THREADS subcomponent dump routine\n" - + "NULL =================================\n" - + "1XMCURTHDINFO Current thread: \"abort-thread\" (J9VMThread:0x00000001)\n" - + "NULL\n" - + "3XMTHREADINFO \"abort-thread\" J9VMThread:0x00000001, state:R, prio=5\n" - + "3XMTHREADINFO3 Java callstack:\n" - + "4XESTACKTRACE at java/lang/Runtime.exit(Runtime.java:123)\n" - + "NULL\n"; + String javacoreContent = "0SECTION TITLE subcomponent dump routine\n" + + "NULL ===============================\n" + + "1TICHARSET UTF-8\n" + + "1TISIGINFO Dump Event \"abort\" (00000020) received\n" + + "1TIDATETIME Date: 2024/10/01 at 08:30:00:000\n" + + "NULL ------------------------------------------------------------------------\n" + + "0SECTION ENVINFO subcomponent dump routine\n" + + "NULL =================================\n" + + "1CIPROCESSID Process ID: 99999\n" + + "NULL ------------------------------------------------------------------------\n" + + "0SECTION THREADS subcomponent dump routine\n" + + "NULL =================================\n" + + "1XMCURTHDINFO Current thread: \"abort-thread\" (J9VMThread:0x00000001)\n" + + "NULL\n" + + "3XMTHREADINFO \"abort-thread\" J9VMThread:0x00000001, state:R, prio=5\n" + + "3XMTHREADINFO3 Java callstack:\n" + + "4XESTACKTRACE at java/lang/Runtime.exit(Runtime.java:123)\n" + + "NULL\n"; // When final CrashLog crashLog = new J9JavacoreParser().parse(uuid, javacoreContent); @@ -232,13 +230,12 @@ public void testRuntimeInfoParsing(String filename, String expectedJreVersion) t @Test public void testNoSignalProducesInternalError() throws Exception { // A javacore with a THREADS section but no 1TISIGINFO line - String javacoreContent = - "0SECTION TITLE subcomponent dump routine\n" - + "NULL ===============================\n" - + "1TICHARSET UTF-8\n" - + "NULL ------------------------------------------------------------------------\n" - + "0SECTION THREADS subcomponent dump routine\n" - + "NULL =================================\n"; + String javacoreContent = "0SECTION TITLE subcomponent dump routine\n" + + "NULL ===============================\n" + + "1TICHARSET UTF-8\n" + + "NULL ------------------------------------------------------------------------\n" + + "0SECTION THREADS subcomponent dump routine\n" + + "NULL =================================\n"; CrashLog result = new J9JavacoreParser().parse(UUID.randomUUID().toString(), javacoreContent); diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RedactUtilsTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RedactUtilsTest.java index 2bcc61aa168..7e0221223ee 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RedactUtilsTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RedactUtilsTest.java @@ -71,9 +71,8 @@ void testRedactStringContent_redactsValue() { @Test void testRedactStringContent_redactsSensitiveValue() { - assertThat( - RedactUtils.redactStringTypeValue( - " - string: \"jdbc:postgresql://host/db?password=s3cr3t\"")) + assertThat(RedactUtils.redactStringTypeValue( + " - string: \"jdbc:postgresql://host/db?password=s3cr3t\"")) .isEqualTo(" - string: \"REDACTED\""); } @@ -109,17 +108,15 @@ void testRedactKlassReference_keepsKnownPackage() { @Test void testRedactMethodClass_redactsUnknownPackage() { - assertThat( - RedactUtils.redactMethodClass( - "{method} {0x...} 'doWork' '(I)V' in 'com/company/Worker'")) + assertThat(RedactUtils.redactMethodClass( + "{method} {0x...} 'doWork' '(I)V' in 'com/company/Worker'")) .isEqualTo("{method} {0x...} 'doWork' '(I)V' in 'redacted/Redacted'"); } @Test void testRedactMethodClass_keepsKnownPackage() { - assertThat( - RedactUtils.redactMethodClass( - "{method} {0x...} 'getLong' '(J)J' in 'jdk/internal/misc/Unsafe'")) + assertThat(RedactUtils.redactMethodClass( + "{method} {0x...} 'getLong' '(J)J' in 'jdk/internal/misc/Unsafe'")) .isEqualTo("{method} {0x...} 'getLong' '(J)J' in 'jdk/internal/misc/Unsafe'"); } @@ -155,9 +152,8 @@ void testRedactLibraryPath_cSymbolFormat() { @Test void testRedactLibraryPath_doesNotMatchInterpreterCodelet() { // "code_begin+1776 in an Interpreter codelet" — "an" doesn't start with "/" so no match - assertThat( - RedactUtils.redactLibraryPath( - "0x0000000116d0c970 is at code_begin+1776 in an Interpreter codelet")) + assertThat(RedactUtils.redactLibraryPath( + "0x0000000116d0c970 is at code_begin+1776 in an Interpreter codelet")) .isEqualTo("0x0000000116d0c970 is at code_begin+1776 in an Interpreter codelet"); } @@ -216,37 +212,34 @@ void testRedactRegisterToMemoryMapping_methodDescriptor() { void testRedactRegisterToMemoryMapping_multilineOopDump() { // Non-java.lang.Class oop: ALL "value"{0x...} OOP refs are fully redacted to "REDACTED" // regardless of their shape — any string value may be a secret. - String value = - "0x00000007142f8848 is an oop: com.company.SymbolEntry \n" - + "{0x00000007142f8848} - klass: 'com/company/SymbolEntry'\n" + String value = "0x00000007142f8848 is an oop: com.company.SymbolEntry \n" + + "{0x00000007142f8848} - klass: 'com/company/SymbolEntry'\n" + + " - ---- fields (total size 9 words):\n" + + " - final 'tag' 'Ljava/lang/String;' @12 \"SourceFile\"{0x00000007ffe7a6a0} (0xfffcf4d4)\n" + + " - final 'value' 'Ljava/lang/String;' @16 \"com.company.Config\"{0x00000007aabbccdd} (0x12345678)\n" + + " - final 'hint' 'Ljava/lang/String;' @20 \"java.vendor.url.bug\"{0x00000007aabbccee} (0x12345679)\n" + + " - final 'owner' 'Ljava/lang/String;' @24 null (0x00000000)\n" + + " - string: \"some sensitive value\""; + assertThat(RedactUtils.redactRegisterToMemoryMapping(value)) + .isEqualTo("0x00000007142f8848 is an oop: redacted.Redacted \n" + + "{0x00000007142f8848} - klass: 'redacted/Redacted'\n" + " - ---- fields (total size 9 words):\n" - + " - final 'tag' 'Ljava/lang/String;' @12 \"SourceFile\"{0x00000007ffe7a6a0} (0xfffcf4d4)\n" - + " - final 'value' 'Ljava/lang/String;' @16 \"com.company.Config\"{0x00000007aabbccdd} (0x12345678)\n" - + " - final 'hint' 'Ljava/lang/String;' @20 \"java.vendor.url.bug\"{0x00000007aabbccee} (0x12345679)\n" + + " - final 'tag' 'Ljava/lang/String;' @12 \"REDACTED\"{0x00000007ffe7a6a0} (0xfffcf4d4)\n" + + " - final 'value' 'Ljava/lang/String;' @16 \"REDACTED\"{0x00000007aabbccdd} (0x12345678)\n" + + " - final 'hint' 'Ljava/lang/String;' @20 \"REDACTED\"{0x00000007aabbccee} (0x12345679)\n" + " - final 'owner' 'Ljava/lang/String;' @24 null (0x00000000)\n" - + " - string: \"some sensitive value\""; - assertThat(RedactUtils.redactRegisterToMemoryMapping(value)) - .isEqualTo( - "0x00000007142f8848 is an oop: redacted.Redacted \n" - + "{0x00000007142f8848} - klass: 'redacted/Redacted'\n" - + " - ---- fields (total size 9 words):\n" - + " - final 'tag' 'Ljava/lang/String;' @12 \"REDACTED\"{0x00000007ffe7a6a0} (0xfffcf4d4)\n" - + " - final 'value' 'Ljava/lang/String;' @16 \"REDACTED\"{0x00000007aabbccdd} (0x12345678)\n" - + " - final 'hint' 'Ljava/lang/String;' @20 \"REDACTED\"{0x00000007aabbccee} (0x12345679)\n" - + " - final 'owner' 'Ljava/lang/String;' @24 null (0x00000000)\n" - + " - string: \"REDACTED\""); + + " - string: \"REDACTED\""); } @Test void testRedactRegisterToMemoryMapping_javaLangClassOopRedactsUnknownClasses() { // java.lang.Class oop: String OOP refs in field values are treated as class names. // Unknown-package classes are redacted to redacted.Redacted; known packages are preserved. - String value = - "0x00000007ffe85850 is an oop: java.lang.Class \n" - + "{0x00000007ffe85850} - klass: 'java/lang/Class'\n" - + " - ---- fields (total size 25 words):\n" - + " - private transient 'name' 'Ljava/lang/String;' @44 \"com.company.Config\"{0x00000007aabbccdd} (0x12345678)\n" - + " - private transient 'name' 'Ljava/lang/String;' @44 \"jdk.internal.misc.Unsafe\"{0x00000007142f7200} (0xe285ee40)"; + String value = "0x00000007ffe85850 is an oop: java.lang.Class \n" + + "{0x00000007ffe85850} - klass: 'java/lang/Class'\n" + + " - ---- fields (total size 25 words):\n" + + " - private transient 'name' 'Ljava/lang/String;' @44 \"com.company.Config\"{0x00000007aabbccdd} (0x12345678)\n" + + " - private transient 'name' 'Ljava/lang/String;' @44 \"jdk.internal.misc.Unsafe\"{0x00000007142f7200} (0xe285ee40)"; assertThat(RedactUtils.redactRegisterToMemoryMapping(value)) .isEqualTo( "0x00000007ffe85850 is an oop: java.lang.Class \n" @@ -267,9 +260,8 @@ void testRedactRegisterToMemoryMapping_libraryPath() { @Test void testRedactRegisterToMemoryMapping_safeValuesUnchanged() { - assertThat( - RedactUtils.redactRegisterToMemoryMapping( - "0x00007f35e6253190 is pointing into the stack for thread: 0x00007f36cd96cc80")) + assertThat(RedactUtils.redactRegisterToMemoryMapping( + "0x00007f35e6253190 is pointing into the stack for thread: 0x00007f36cd96cc80")) .isEqualTo("0x00007f35e6253190 is pointing into the stack for thread: 0x00007f36cd96cc80"); assertThat(RedactUtils.redactRegisterToMemoryMapping("0x0 is NULL")).isEqualTo("0x0 is NULL"); assertThat(RedactUtils.redactRegisterToMemoryMapping("0x000000008fd66048 is an unknown value")) @@ -289,9 +281,8 @@ void testRedactReadableMemoryHexDump_withAddressAndPipe() { @Test void testRedactReadableMemoryHexDump_withoutAddress() { // Linux aarch64: bytes only — redact everything after the colon - assertThat( - RedactUtils.redactReadableMemoryHexDump( - "0x0000ffff9f686ca4 points into unknown readable memory: 06 00 00 00")) + assertThat(RedactUtils.redactReadableMemoryHexDump( + "0x0000ffff9f686ca4 points into unknown readable memory: 06 00 00 00")) .isEqualTo("0x0000ffff9f686ca4 points into unknown readable memory: REDACTED"); } @@ -327,17 +318,15 @@ void testRedactObjFieldRef_leavesUnrelatedLinesUnchanged() { @Test void testRedactNmethodClass_dottedUnknownPackage() { - assertThat( - RedactUtils.redactNmethodClass( - "Compiled method (c2) 3068 4 com.company.Foo::methodName (456 bytes)")) + assertThat(RedactUtils.redactNmethodClass( + "Compiled method (c2) 3068 4 com.company.Foo::methodName (456 bytes)")) .isEqualTo("Compiled method (c2) 3068 4 redacted.Redacted::methodName (456 bytes)"); } @Test void testRedactNmethodClass_dottedKnownPackage() { - assertThat( - RedactUtils.redactNmethodClass( - "Compiled method (c2) 3068 4 java.util.HashMap::resize (456 bytes)")) + assertThat(RedactUtils.redactNmethodClass( + "Compiled method (c2) 3068 4 java.util.HashMap::resize (456 bytes)")) .isEqualTo("Compiled method (c2) 3068 4 java.util.HashMap::resize (456 bytes)"); } @@ -362,11 +351,10 @@ void testRedactNmethodClass_leavesUnrelatedLinesUnchanged() { @Test void testRedactRegisterToMemoryMapping_objFieldRef() { // Non-java.lang.Class oop with object-reference field: a 'ClassName' is redacted - String value = - "0x00000007142f8848 is an oop: com.company.Holder \n" - + "{0x00000007142f8848} - klass: 'com/company/Holder'\n" - + " - ---- fields (total size 3 words):\n" - + " - 'ref' 'Ljava/lang/Object;' @12 a 'com/company/Inner'{0x00007f1200003456} (0xabcdef01)"; + String value = "0x00000007142f8848 is an oop: com.company.Holder \n" + + "{0x00000007142f8848} - klass: 'com/company/Holder'\n" + + " - ---- fields (total size 3 words):\n" + + " - 'ref' 'Ljava/lang/Object;' @12 a 'com/company/Inner'{0x00007f1200003456} (0xabcdef01)"; assertThat(RedactUtils.redactRegisterToMemoryMapping(value)) .isEqualTo( "0x00000007142f8848 is an oop: redacted.Redacted \n" @@ -378,12 +366,10 @@ void testRedactRegisterToMemoryMapping_objFieldRef() { @Test void testRedactRegisterToMemoryMapping_nmethodCompiledMethod() { // nmethod entry (JDK 11+): "Compiled method" line class name is redacted - String value = - "0x00007f36cd2b1600 is at entry_point+13512 in (nmethod*) 0x00007f36cd2b1510\n" - + "Compiled method (c2) 3068 4 com.company.Foo::processRequest (456 bytes)"; + String value = "0x00007f36cd2b1600 is at entry_point+13512 in (nmethod*) 0x00007f36cd2b1510\n" + + "Compiled method (c2) 3068 4 com.company.Foo::processRequest (456 bytes)"; assertThat(RedactUtils.redactRegisterToMemoryMapping(value)) - .isEqualTo( - "0x00007f36cd2b1600 is at entry_point+13512 in (nmethod*) 0x00007f36cd2b1510\n" - + "Compiled method (c2) 3068 4 redacted.Redacted::processRequest (456 bytes)"); + .isEqualTo("0x00007f36cd2b1600 is at entry_point+13512 in (nmethod*) 0x00007f36cd2b1510\n" + + "Compiled method (c2) 3068 4 redacted.Redacted::processRequest (456 bytes)"); } } diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/CapturedContext.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/CapturedContext.java index f758b39fdcb..aedc3f12aee 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/CapturedContext.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/CapturedContext.java @@ -126,9 +126,8 @@ public CapturedValue getMember(Object target, String memberName) { Object targetedValue = capturedTarget.getValue(); if (targetedValue != null) { // resolve to a CapturedValue instance - result = - ReflectiveFieldValueResolver.getFieldAsCapturedValue( - targetedValue.getClass(), targetedValue, memberName); + result = ReflectiveFieldValueResolver.getFieldAsCapturedValue( + targetedValue.getClass(), targetedValue, memberName); } else { result = CapturedValue.UNDEFINED; } @@ -145,9 +144,8 @@ public CapturedValue getMember(Object target, String memberName) { } } } - result = - ReflectiveFieldValueResolver.getFieldAsCapturedValue( - target.getClass(), target, memberName); + result = ReflectiveFieldValueResolver.getFieldAsCapturedValue( + target.getClass(), target, memberName); } checkUndefined(result, memberName, "Cannot dereference field: "); return result; @@ -318,10 +316,8 @@ public Status evaluate( long startTimestamp, MethodLocation methodLocation, boolean singleProbe) { - Status status = - statusByProbeId.computeIfAbsent( - probeImplementation.getProbeId().getEncodedId(), - key -> probeImplementation.createStatus()); + Status status = statusByProbeId.computeIfAbsent( + probeImplementation.getProbeId().getEncodedId(), key -> probeImplementation.createStatus()); if (methodLocation == MethodLocation.EXIT && startTimestamp > 0) { duration = System.nanoTime() - startTimestamp; addExtension( @@ -420,13 +416,12 @@ public void addCaptureExpression(CapturedValue value) { public static class Status { public static final Status EMPTY_STATUS = new Status(ProbeImplementation.UNKNOWN); - public static final Status EMPTY_CAPTURING_STATUS = - new Status(ProbeImplementation.UNKNOWN) { - @Override - public boolean isCapturing() { - return true; - } - }; + public static final Status EMPTY_CAPTURING_STATUS = new Status(ProbeImplementation.UNKNOWN) { + @Override + public boolean isCapturing() { + return true; + } + }; private final List errors = new ArrayList<>(); protected final ProbeImplementation probeImplementation; @@ -474,10 +469,9 @@ private CapturedValue( String notCapturedReason) { this.name = name; this.declaredType = declaredType; - this.type = - value != null && !isPrimitive(declaredType) - ? value.getClass().getTypeName() - : declaredType; + this.type = value != null && !isPrimitive(declaredType) + ? value.getClass().getTypeName() + : declaredType; this.value = value; this.fields = fields == null ? Collections.emptyMap() : fields; this.limits = limits; @@ -577,9 +571,8 @@ public static CapturedValue raw( private static CapturedValue build( String name, String declaredType, Object value, Limits limits, String notCapturedReason) { - CapturedValue val = - new CapturedValue( - name, declaredType, value, limits, Collections.emptyMap(), notCapturedReason); + CapturedValue val = new CapturedValue( + name, declaredType, value, limits, Collections.emptyMap(), notCapturedReason); return val; } diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java index cb2c204a7e8..6664ae64f9c 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java @@ -281,13 +281,8 @@ public static void evalContext( if (probeImplementation == null) { continue; } - CapturedContext.Status status = - context.evaluate( - probeImplementation, - callingClass.getTypeName(), - startTimestamp, - methodLocation, - false); + CapturedContext.Status status = context.evaluate( + probeImplementation, callingClass.getTypeName(), startTimestamp, methodLocation, false); needFreeze |= status.shouldFreezeContext(); } // only freeze the context when we have at lest one snapshot probe, and we should send @@ -317,13 +312,8 @@ public static void evalContext( if (probeImplementation == null) { return; } - CapturedContext.Status status = - context.evaluate( - probeImplementation, - callingClass.getTypeName(), - startTimestamp, - methodLocation, - true); + CapturedContext.Status status = context.evaluate( + probeImplementation, callingClass.getTypeName(), startTimestamp, methodLocation, true); boolean needFreeze = status.shouldFreezeContext(); // only freeze the context when we have at lest one snapshot probe, and we should send // snapshot diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/Limits.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/Limits.java index 989bc91d01a..9ed6150f641 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/Limits.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/Limits.java @@ -12,9 +12,8 @@ public class Limits { public final int maxLength; public final int maxFieldCount; - public static final Limits DEFAULT = - new Limits( - DEFAULT_REFERENCE_DEPTH, DEFAULT_COLLECTION_SIZE, DEFAULT_LENGTH, DEFAULT_FIELD_COUNT); + public static final Limits DEFAULT = new Limits( + DEFAULT_REFERENCE_DEPTH, DEFAULT_COLLECTION_SIZE, DEFAULT_LENGTH, DEFAULT_FIELD_COUNT); public Limits(int maxReferenceDepth, int maxCollectionSize, int maxLength, int maxFieldCount) { this.maxReferenceDepth = maxReferenceDepth; diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/ReflectiveFieldValueResolver.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/ReflectiveFieldValueResolver.java index c5c6f5dcc29..d38e6716040 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/ReflectiveFieldValueResolver.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/ReflectiveFieldValueResolver.java @@ -267,8 +267,7 @@ public static String buildInaccessibleMsg(Field field) { if (MODULE_CLASS != null && GET_MODULE != null) { try { Object module = GET_MODULE.invoke(field.getDeclaringClass()); - return "Field is not accessible: " - + module + return "Field is not accessible: " + module + " does not opens/exports to the current module"; } catch (Throwable ex) { LOGGER.debug("buildInaccessibleMsg failed: ", ex); diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/Values.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/Values.java index 8562e899a2c..36e6c64c8d7 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/Values.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/Values.java @@ -2,27 +2,24 @@ public final class Values { /** A generic undefined value object */ - public static final Object UNDEFINED_OBJECT = - new Object() { - @Override - public String toString() { - return "UNDEFINED"; - } - }; + public static final Object UNDEFINED_OBJECT = new Object() { + @Override + public String toString() { + return "UNDEFINED"; + } + }; - public static final Object NULL_OBJECT = - new Object() { - @Override - public String toString() { - return "NULL"; - } - }; + public static final Object NULL_OBJECT = new Object() { + @Override + public String toString() { + return "NULL"; + } + }; - public static final Object THIS_OBJECT = - new Object() { - @Override - public String toString() { - return "this"; - } - }; + public static final Object THIS_OBJECT = new Object() { + @Override + public String toString() { + return "this"; + } + }; } diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/Redaction.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/Redaction.java index d67886afd05..f8d07677f8d 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/Redaction.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/Redaction.java @@ -16,93 +16,92 @@ public class Redaction { public static final String REDACTED_VALUE = new String("redacted".toCharArray()); private static final Pattern COMMA_PATTERN = Pattern.compile(","); - private static final List PREDEFINED_KEYWORDS = - Arrays.asList( - "2fa", - "accesstoken", - "aiohttpsession", - "apikey", - "appkey", - "apisecret", - "apisignature", - "applicationkey", - "auth", - "authorization", - "authtoken", - "ccnumber", - "certificatepin", - "cipher", - "clientid", - "clientsecret", - "connectionstring", - "connectsid", - "cookie", - "credentials", - "creditcard", - "csrf", - "csrftoken", - "cvv", - "databaseurl", - "dburl", - "encryptionkey", - "encryptionkeyid", - "geolocation", - "gpgkey", - "ipaddress", - "jti", - "jwt", - "licensekey", - "masterkey", - "mysqlpwd", - "nonce", - "oauth", - "oauthtoken", - "otp", - "passhash", - "passwd", - "password", - "passwordb", - "pemfile", - "pgpkey", - "phpsessid", - "pin", - "pincode", - "pkcs8", - "privatekey", - "publickey", - "pwd", - "recaptchakey", - "refreshtoken", - "routingnumber", - "salt", - "secret", - "secretkey", - "secrettoken", - "securityanswer", - "securitycode", - "securityquestion", - "serviceaccountcredentials", - "session", - "sessionid", - "sessionkey", - "setcookie", - "signature", - "signaturekey", - "sshkey", - "ssn", - "symfony", - "token", - "transactionid", - "twiliotoken", - "usersession", - "voterid", - "xapikey", - "xauthtoken", - "xcsrftoken", - "xforwardedfor", - "xrealip", - "xsrf", - "xsrftoken"); + private static final List PREDEFINED_KEYWORDS = Arrays.asList( + "2fa", + "accesstoken", + "aiohttpsession", + "apikey", + "appkey", + "apisecret", + "apisignature", + "applicationkey", + "auth", + "authorization", + "authtoken", + "ccnumber", + "certificatepin", + "cipher", + "clientid", + "clientsecret", + "connectionstring", + "connectsid", + "cookie", + "credentials", + "creditcard", + "csrf", + "csrftoken", + "cvv", + "databaseurl", + "dburl", + "encryptionkey", + "encryptionkeyid", + "geolocation", + "gpgkey", + "ipaddress", + "jti", + "jwt", + "licensekey", + "masterkey", + "mysqlpwd", + "nonce", + "oauth", + "oauthtoken", + "otp", + "passhash", + "passwd", + "password", + "passwordb", + "pemfile", + "pgpkey", + "phpsessid", + "pin", + "pincode", + "pkcs8", + "privatekey", + "publickey", + "pwd", + "recaptchakey", + "refreshtoken", + "routingnumber", + "salt", + "secret", + "secretkey", + "secrettoken", + "securityanswer", + "securitycode", + "securityquestion", + "serviceaccountcredentials", + "session", + "sessionid", + "sessionkey", + "setcookie", + "signature", + "signaturekey", + "sshkey", + "ssn", + "symfony", + "token", + "transactionid", + "twiliotoken", + "usersession", + "voterid", + "xapikey", + "xauthtoken", + "xcsrftoken", + "xforwardedfor", + "xrealip", + "xsrf", + "xsrftoken"); private static final Set KEYWORDS = ConcurrentHashMap.newKeySet(); private static ClassNameTrie typeTrie = ClassNameTrie.EMPTY_TRIE; private static List redactedClasses; @@ -149,10 +148,9 @@ public static void addUserDefinedTypes(Config config) { if (packages == null) { packages = new ArrayList<>(); } - type = - type.endsWith(".*") - ? type.substring(0, type.length() - 2) - : type.substring(0, type.length() - 1); + type = type.endsWith(".*") + ? type.substring(0, type.length() - 2) + : type.substring(0, type.length() - 1); packages.add(type); } else { if (classes == null) { diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java index 3d9b68977b0..b8d61915a74 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java @@ -104,21 +104,19 @@ public class WellKnownClasses { EQUALS_SAFE_CLASSES.add("sun.nio.fs.WindowsPath"); } - private static final Set STRING_PRIMITIVES = - new HashSet<>( - Arrays.asList( - "java.lang.Class", - "java.lang.String", - "java.time.Duration", - "java.time.Instant", - "java.time.LocalTime", - "java.time.LocalDate", - "java.time.LocalDateTime", - "java.util.UUID", - "java.net.URI", - "java.io.File", - "sun.nio.fs.UnixPath", - "sun.nio.fs.WindowsPath")); + private static final Set STRING_PRIMITIVES = new HashSet<>(Arrays.asList( + "java.lang.Class", + "java.lang.String", + "java.time.Duration", + "java.time.Instant", + "java.time.LocalTime", + "java.time.LocalDate", + "java.time.LocalDateTime", + "java.util.UUID", + "java.net.URI", + "java.io.File", + "sun.nio.fs.UnixPath", + "sun.nio.fs.WindowsPath")); private static final Set LONG_PRIMITIVES = new HashSet<>(Arrays.asList("java.util.Date")); @@ -187,46 +185,40 @@ public class WellKnownClasses { THROWABLE_SPECIAL_FIELDS.put("cause", ThrowableFields::cause); } - private static final List SAFE_COLLECTION_PACKAGES = - Arrays.asList( - "java.", // JDK base module - "com.google.protobuf.", // Google ProtoBuf - "com.google.common.collect.", // Google Guava - "it.unimi.dsi.fastutil.", // fastutil - "org.agrona.collections." // Agrona - ); - - private static final Set UNSAFE_COLLECTION_CLASSES = - new HashSet<>( - Arrays.asList( - // Collection with synchronized methods can lead to deadlock - "java.util.Stack", - "java.util.Vector", - "java.util.Collections$SynchronizedSet", - "java.util.Collections$SynchronizedCollection", - "java.util.Collections$SynchronizedSortedSet", - "java.util.Collections$SynchronizedNavigableSet", - "java.util.Collections$SynchronizedList", - "java.util.Collections$SynchronizedRandomAccessList")); - - private static final Set UNSAFE_MAP_CLASSES = - new HashSet<>( - Arrays.asList( - // Maps with synchronized methods can lead to deadlock - "java.util.Hashtable", - "java.util.Properties", - "java.util.Collections$SynchronizedMap", - "java.util.Collections$SynchronizedSortedMap", - "java.util.Collections$SynchronizedNavigableMap")); - - private static final List SAFE_MAP_PACKAGES = - Arrays.asList( - "java.", // JDK base module - "com.google.protobuf.", // Google ProtoBuf - "com.google.common.collect.", // Google Guava - "it.unimi.dsi.fastutil.", // fastutil - "org.agrona.collections." // Agrona - ); + private static final List SAFE_COLLECTION_PACKAGES = Arrays.asList( + "java.", // JDK base module + "com.google.protobuf.", // Google ProtoBuf + "com.google.common.collect.", // Google Guava + "it.unimi.dsi.fastutil.", // fastutil + "org.agrona.collections." // Agrona + ); + + private static final Set UNSAFE_COLLECTION_CLASSES = new HashSet<>(Arrays.asList( + // Collection with synchronized methods can lead to deadlock + "java.util.Stack", + "java.util.Vector", + "java.util.Collections$SynchronizedSet", + "java.util.Collections$SynchronizedCollection", + "java.util.Collections$SynchronizedSortedSet", + "java.util.Collections$SynchronizedNavigableSet", + "java.util.Collections$SynchronizedList", + "java.util.Collections$SynchronizedRandomAccessList")); + + private static final Set UNSAFE_MAP_CLASSES = new HashSet<>(Arrays.asList( + // Maps with synchronized methods can lead to deadlock + "java.util.Hashtable", + "java.util.Properties", + "java.util.Collections$SynchronizedMap", + "java.util.Collections$SynchronizedSortedMap", + "java.util.Collections$SynchronizedNavigableMap")); + + private static final List SAFE_MAP_PACKAGES = Arrays.asList( + "java.", // JDK base module + "com.google.protobuf.", // Google ProtoBuf + "com.google.common.collect.", // Google Guava + "it.unimi.dsi.fastutil.", // fastutil + "org.agrona.collections." // Agrona + ); /** * @return true if type is a final class and toString implementation is well known and side effect diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/JsonToExpressionConverter.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/JsonToExpressionConverter.java index b9cad5b1ed7..084d0f2a04c 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/JsonToExpressionConverter.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/JsonToExpressionConverter.java @@ -22,36 +22,34 @@ /** Converts json representation to object model */ public class JsonToExpressionConverter { - private static final Set PREDICATE_FUNCTIONS = - new HashSet<>( - Arrays.asList( - "not", - "==", - "eq", - "!=", - "neq", - "ne", - ">=", - "ge", - ">", - "gt", - "<=", - "le", - "<", - "lt", - "or", - "and", - "hasAny", - "any", - "hasAll", - "all", - "isEmpty", - "startsWith", - "endsWith", - "contains", - "matches", - "instanceof", - "isDefined")); + private static final Set PREDICATE_FUNCTIONS = new HashSet<>(Arrays.asList( + "not", + "==", + "eq", + "!=", + "neq", + "ne", + ">=", + "ge", + ">", + "gt", + "<=", + "le", + "<", + "lt", + "or", + "and", + "hasAny", + "any", + "hasAll", + "all", + "isEmpty", + "startsWith", + "endsWith", + "contains", + "matches", + "instanceof", + "isDefined")); @FunctionalInterface interface BinaryPredicateExpressionFunction { @@ -74,199 +72,181 @@ public static BooleanExpression createPredicate(JsonReader reader) throws IOExce private static BooleanExpression internalCreatePredicate(JsonReader reader, String predicateType) throws IOException { switch (predicateType) { - case "not": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY || token == STRING || token == NUMBER) { - throw new UnsupportedOperationException( - "Operation 'not' expects a predicate as its argument"); - } - return DSL.not(createPredicate(reader)); + case "not": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY || token == STRING || token == NUMBER) { + throw new UnsupportedOperationException( + "Operation 'not' expects a predicate as its argument"); } + return DSL.not(createPredicate(reader)); + } case "==": - case "eq": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'eq' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createBinaryValuePredicate(reader, DSL::eq); - reader.endArray(); - return expr; + case "eq": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'eq' expects the arguments to be defined as array"); } + reader.beginArray(); + BooleanExpression expr = createBinaryValuePredicate(reader, DSL::eq); + reader.endArray(); + return expr; + } case "!=": case "neq": - case "ne": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'ne' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = DSL.not(createBinaryValuePredicate(reader, DSL::eq)); - reader.endArray(); - return expr; + case "ne": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'ne' expects the arguments to be defined as array"); } + reader.beginArray(); + BooleanExpression expr = DSL.not(createBinaryValuePredicate(reader, DSL::eq)); + reader.endArray(); + return expr; + } case ">=": - case "ge": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'ge' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createBinaryValuePredicate(reader, DSL::ge); - reader.endArray(); - return expr; + case "ge": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'ge' expects the arguments to be defined as array"); } + reader.beginArray(); + BooleanExpression expr = createBinaryValuePredicate(reader, DSL::ge); + reader.endArray(); + return expr; + } case ">": - case "gt": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'gt' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createBinaryValuePredicate(reader, DSL::gt); - reader.endArray(); - return expr; + case "gt": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'gt' expects the arguments to be defined as array"); } + reader.beginArray(); + BooleanExpression expr = createBinaryValuePredicate(reader, DSL::gt); + reader.endArray(); + return expr; + } case "<=": - case "le": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'le' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createBinaryValuePredicate(reader, DSL::le); - reader.endArray(); - return expr; + case "le": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'le' expects the arguments to be defined as array"); } + reader.beginArray(); + BooleanExpression expr = createBinaryValuePredicate(reader, DSL::le); + reader.endArray(); + return expr; + } case "<": - case "lt": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'lt' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createBinaryValuePredicate(reader, DSL::lt); - reader.endArray(); - return expr; + case "lt": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'lt' expects the arguments to be defined as array"); } - case "instanceof": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'instanceof' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createBinaryValuePredicate(reader, DSL::instanceOf); - reader.endArray(); - return expr; + reader.beginArray(); + BooleanExpression expr = createBinaryValuePredicate(reader, DSL::lt); + reader.endArray(); + return expr; + } + case "instanceof": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'instanceof' expects the arguments to be defined as array"); } - case "or": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'or' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createCompositeLogicalPredicate(reader, DSL::or); - reader.endArray(); - return expr; + reader.beginArray(); + BooleanExpression expr = createBinaryValuePredicate(reader, DSL::instanceOf); + reader.endArray(); + return expr; + } + case "or": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'or' expects the arguments to be defined as array"); } - case "and": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'and' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createCompositeLogicalPredicate(reader, DSL::and); - reader.endArray(); - return expr; + reader.beginArray(); + BooleanExpression expr = createCompositeLogicalPredicate(reader, DSL::or); + reader.endArray(); + return expr; + } + case "and": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'and' expects the arguments to be defined as array"); } + reader.beginArray(); + BooleanExpression expr = createCompositeLogicalPredicate(reader, DSL::and); + reader.endArray(); + return expr; + } case "hasAny": - case "any": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'hasAny' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createHasAnyPredicate(reader); - reader.endArray(); - return expr; + case "any": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'hasAny' expects the arguments to be defined as array"); } + reader.beginArray(); + BooleanExpression expr = createHasAnyPredicate(reader); + reader.endArray(); + return expr; + } case "hasAll": - case "all": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'hasAll' expects the arguments to be defined as array"); - } - reader.beginArray(); - BooleanExpression expr = createHasAllPredicate(reader); - reader.endArray(); - return expr; + case "all": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'hasAll' expects the arguments to be defined as array"); } - case "isEmpty": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'isEmpty' expects exactly one value argument"); - } - return DSL.isEmpty(asValueExpression(reader)); + reader.beginArray(); + BooleanExpression expr = createHasAllPredicate(reader); + reader.endArray(); + return expr; + } + case "isEmpty": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'isEmpty' expects exactly one value argument"); } - case "isDefined": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'isUndefined' expects exactly one value argument"); - } - return DSL.isDefined(asValueExpression(reader)); + return DSL.isEmpty(asValueExpression(reader)); + } + case "isDefined": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'isUndefined' expects exactly one value argument"); } - case "startsWith": - { - return createStringPredicateExpression(reader, DSL::startsWith); - } - case "endsWith": - { - return createStringPredicateExpression(reader, DSL::endsWith); - } - case "contains": - { - JsonReader.Token token = reader.peek(); - if (token != BEGIN_ARRAY) { - throw new UnsupportedOperationException( - "Operation 'contains' expects the arguments to be defined as array"); - } - reader.beginArray(); - ContainsExpression expr = - DSL.contains(asValueExpression(reader), asValueExpression(reader)); - reader.endArray(); - return expr; - } - case "matches": - { - return createStringPredicateExpression(reader, DSL::matches); + return DSL.isDefined(asValueExpression(reader)); + } + case "startsWith": { + return createStringPredicateExpression(reader, DSL::startsWith); + } + case "endsWith": { + return createStringPredicateExpression(reader, DSL::endsWith); + } + case "contains": { + JsonReader.Token token = reader.peek(); + if (token != BEGIN_ARRAY) { + throw new UnsupportedOperationException( + "Operation 'contains' expects the arguments to be defined as array"); } + reader.beginArray(); + ContainsExpression expr = + DSL.contains(asValueExpression(reader), asValueExpression(reader)); + reader.endArray(); + return expr; + } + case "matches": { + return createStringPredicateExpression(reader, DSL::matches); + } default: throw new UnsupportedOperationException("Unsupported operation '" + predicateType + "'"); } @@ -309,124 +289,113 @@ public static BooleanExpression createCompositeLogicalPredicate( public static ValueExpression asValueExpression(JsonReader reader) throws IOException { JsonReader.Token currentToken = reader.peek(); switch (currentToken) { - case NUMBER: - { - // Moshi always consider numbers as decimal. need to parse it as string and detect if dot - // is present - // or not to determine ints/longs vs doubles - String numberStrValue = reader.nextString(); - if (numberStrValue.indexOf('.') > 0) { - return DSL.value(Double.parseDouble(numberStrValue)); - } - long longValue = Long.parseLong(numberStrValue); - // checks if the parsed number fits into integer range - if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) { - return DSL.value((int) longValue); - } - return DSL.value(longValue); + case NUMBER: { + // Moshi always consider numbers as decimal. need to parse it as string and detect if dot + // is present + // or not to determine ints/longs vs doubles + String numberStrValue = reader.nextString(); + if (numberStrValue.indexOf('.') > 0) { + return DSL.value(Double.parseDouble(numberStrValue)); } - case STRING: - { - String textValue = reader.nextString(); - return DSL.value(textValue); + long longValue = Long.parseLong(numberStrValue); + // checks if the parsed number fits into integer range + if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) { + return DSL.value((int) longValue); } - case BEGIN_OBJECT: - { - reader.beginObject(); - try { - String fieldName = reader.nextName(); - if (PREDICATE_FUNCTIONS.contains(fieldName)) { - return DSL.bool(internalCreatePredicate(reader, fieldName)); + return DSL.value(longValue); + } + case STRING: { + String textValue = reader.nextString(); + return DSL.value(textValue); + } + case BEGIN_OBJECT: { + reader.beginObject(); + try { + String fieldName = reader.nextName(); + if (PREDICATE_FUNCTIONS.contains(fieldName)) { + return DSL.bool(internalCreatePredicate(reader, fieldName)); + } + switch (fieldName) { + case "ref": { + JsonReader.Token token = reader.peek(); + if (token != STRING) { + throw new UnsupportedOperationException( + "Operation 'ref' expect exactly one textual argument"); + } + return DSL.ref(reader.nextString()); } - switch (fieldName) { - case "ref": - { - JsonReader.Token token = reader.peek(); - if (token != STRING) { - throw new UnsupportedOperationException( - "Operation 'ref' expect exactly one textual argument"); - } - return DSL.ref(reader.nextString()); - } - case "getmember": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY) { - reader.beginArray(); - ValueExpression target = asValueExpression(reader); - String name = reader.nextString(); - reader.endArray(); - return DSL.getMember(target, name); - } - throw new UnsupportedOperationException( - "Operation 'getmember' expects the arguments to be defined as array"); - } - case "index": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY) { - reader.beginArray(); - ValueExpression target = asValueExpression(reader); - ValueExpression key = asValueExpression(reader); - reader.endArray(); - return DSL.index(target, key); - } - throw new UnsupportedOperationException( - "Operation 'index' expects the arguments to be defined as array"); - } - case "filter": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY) { - reader.beginArray(); - ValueExpression filter = createCollectionFilter(reader); - reader.endArray(); - return filter; - } - throw new UnsupportedOperationException( - "Operation 'filter' expects the arguments to be defined as array"); - } - case "len": - case "count": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY || token == NUMBER) { - throw new UnsupportedOperationException( - "Operation 'len' expect exactly one textual or object argument"); - } - return DSL.len(asValueExpression(reader)); - } - case "substring": - { - JsonReader.Token token = reader.peek(); - if (token == BEGIN_ARRAY) { - reader.beginArray(); - ValueExpression target = asValueExpression(reader); - int startIndex = reader.nextInt(); - int endIndex = reader.nextInt(); - reader.endArray(); - return DSL.subString(target, startIndex, endIndex); - } - throw new UnsupportedOperationException( - "Operation 'substring' expects the arguments to be defined as array"); - } - default: - throw new UnsupportedOperationException("Invalid value definition: " + fieldName); + case "getmember": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY) { + reader.beginArray(); + ValueExpression target = asValueExpression(reader); + String name = reader.nextString(); + reader.endArray(); + return DSL.getMember(target, name); + } + throw new UnsupportedOperationException( + "Operation 'getmember' expects the arguments to be defined as array"); } - } finally { - reader.endObject(); + case "index": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY) { + reader.beginArray(); + ValueExpression target = asValueExpression(reader); + ValueExpression key = asValueExpression(reader); + reader.endArray(); + return DSL.index(target, key); + } + throw new UnsupportedOperationException( + "Operation 'index' expects the arguments to be defined as array"); + } + case "filter": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY) { + reader.beginArray(); + ValueExpression filter = createCollectionFilter(reader); + reader.endArray(); + return filter; + } + throw new UnsupportedOperationException( + "Operation 'filter' expects the arguments to be defined as array"); + } + case "len": + case "count": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY || token == NUMBER) { + throw new UnsupportedOperationException( + "Operation 'len' expect exactly one textual or object argument"); + } + return DSL.len(asValueExpression(reader)); + } + case "substring": { + JsonReader.Token token = reader.peek(); + if (token == BEGIN_ARRAY) { + reader.beginArray(); + ValueExpression target = asValueExpression(reader); + int startIndex = reader.nextInt(); + int endIndex = reader.nextInt(); + reader.endArray(); + return DSL.subString(target, startIndex, endIndex); + } + throw new UnsupportedOperationException( + "Operation 'substring' expects the arguments to be defined as array"); + } + default: + throw new UnsupportedOperationException("Invalid value definition: " + fieldName); } + } finally { + reader.endObject(); } - case NULL: - { - reader.nextNull(); - return DSL.nullValue(); - } - case BOOLEAN: - { - boolean boolValue = reader.nextBoolean(); - return DSL.value(boolValue); - } + } + case NULL: { + reader.nextNull(); + return DSL.nullValue(); + } + case BOOLEAN: { + boolean boolValue = reader.nextBoolean(); + return DSL.value(boolValue); + } default: throw new UnsupportedOperationException( "Invalid value definition, not supported token: " + currentToken); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/PrettyPrintVisitor.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/PrettyPrintVisitor.java index f0295f66de3..2bf6a43caad 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/PrettyPrintVisitor.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/PrettyPrintVisitor.java @@ -124,9 +124,7 @@ public String visit(IfElseExpression ifElseExpression) { @Override public String visit(IfExpression ifExpression) { - return "if " - + nullSafeAccept(ifExpression.getTest()) - + " then " + return "if " + nullSafeAccept(ifExpression.getTest()) + " then " + nullSafeAccept(ifExpression.getExpression()); } @@ -178,17 +176,14 @@ public String visit(ValueRefExpression valueRefExpression) { @Override public String visit(GetMemberExpression getMemberExpression) { - return nullSafeAccept(getMemberExpression.getTarget()) - + "." + return nullSafeAccept(getMemberExpression.getTarget()) + "." + getMemberExpression.getMemberName(); } @Override public String visit(IndexExpression indexExpression) { - return nullSafeAccept(indexExpression.getTarget()) - + "[" - + nullSafeAccept(indexExpression.getKey()) - + "]"; + return nullSafeAccept(indexExpression.getTarget()) + "[" + + nullSafeAccept(indexExpression.getKey()) + "]"; } @Override diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/ValueScript.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/ValueScript.java index c446e0b12e5..22ae4db08b6 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/ValueScript.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/ValueScript.java @@ -123,16 +123,14 @@ public ValueScript fromJson(JsonReader jsonReader) throws IOException { while (jsonReader.hasNext()) { String fieldName = jsonReader.nextName(); switch (fieldName) { - case "json": - { - valueExpression = JsonToExpressionConverter.asValueExpression(jsonReader); - break; - } - case "dsl": - { - dsl = jsonReader.nextString(); - break; - } + case "json": { + valueExpression = JsonToExpressionConverter.asValueExpression(jsonReader); + break; + } + case "dsl": { + dsl = jsonReader.nextString(); + break; + } default: throw new IOException("Invalid field: " + fieldName); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BinaryExpression.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BinaryExpression.java index 3c955d21b74..c2484af9c34 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BinaryExpression.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BinaryExpression.java @@ -26,13 +26,7 @@ public Boolean evaluate(EvalContext evalContext) { @Override public String toString() { - return "BinaryExpression{" - + "left=" - + left - + ", right=" - + right - + ", operator=" - + operator + return "BinaryExpression{" + "left=" + left + ", right=" + right + ", operator=" + operator + '}'; } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BooleanExpression.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BooleanExpression.java index 2f98571f03b..bb1169b9b88 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BooleanExpression.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/BooleanExpression.java @@ -6,38 +6,36 @@ /** A generic interface for expressions resolving to {@linkplain Boolean} */ public interface BooleanExpression extends Expression { - BooleanExpression TRUE = - new BooleanExpression() { - @Override - public Boolean evaluate(EvalContext evalContext) { - return Boolean.TRUE; - } + BooleanExpression TRUE = new BooleanExpression() { + @Override + public Boolean evaluate(EvalContext evalContext) { + return Boolean.TRUE; + } - @Override - public String toString() { - return "true"; - } + @Override + public String toString() { + return "true"; + } - @Override - public R accept(Visitor visitor) { - return visitor.visit(this); - } - }; - BooleanExpression FALSE = - new BooleanExpression() { - @Override - public Boolean evaluate(EvalContext evalContext) { - return Boolean.FALSE; - } + @Override + public R accept(Visitor visitor) { + return visitor.visit(this); + } + }; + BooleanExpression FALSE = new BooleanExpression() { + @Override + public Boolean evaluate(EvalContext evalContext) { + return Boolean.FALSE; + } - @Override - public String toString() { - return "false"; - } + @Override + public String toString() { + return "false"; + } - @Override - public R accept(Visitor visitor) { - return visitor.visit(this); - } - }; + @Override + public R accept(Visitor visitor) { + return visitor.visit(this); + } + }; } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/ValueExpression.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/ValueExpression.java index 5c43935555c..530b6aa5568 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/ValueExpression.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/ValueExpression.java @@ -10,29 +10,27 @@ * @param */ public interface ValueExpression> extends Expression { - ValueExpression NULL = - new ValueExpression>() { - @Override - public Value evaluate(EvalContext evalContext) { - return Value.nullValue(); - } + ValueExpression NULL = new ValueExpression>() { + @Override + public Value evaluate(EvalContext evalContext) { + return Value.nullValue(); + } - @Override - public String toString() { - return Value.nullValue().toString(); - } - }; + @Override + public String toString() { + return Value.nullValue().toString(); + } + }; - ValueExpression UNDEFINED = - new ValueExpression>() { - @Override - public Value evaluate(EvalContext evalContext) { - return Value.undefinedValue(); - } + ValueExpression UNDEFINED = new ValueExpression>() { + @Override + public Value evaluate(EvalContext evalContext) { + return Value.undefinedValue(); + } - @Override - public String toString() { - return Value.undefinedValue().toString(); - } - }; + @Override + public String toString() { + return Value.undefinedValue().toString(); + } + }; } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/values/CollectionValue.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/values/CollectionValue.java index 55115224b3d..9f5086b6206 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/values/CollectionValue.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/values/CollectionValue.java @@ -10,91 +10,89 @@ * @param */ public interface CollectionValue extends Value { - CollectionValue UNDEFINED = - new CollectionValue() { - @Override - public boolean isEmpty() { - return true; - } - - @Override - public int count() { - return 0; - } - - @Override - public Value get(Object key) { - return Value.undefinedValue(); - } - - @Override - public Object getValue() { - return Values.UNDEFINED_OBJECT; - } - - @Override - public ValueType getType() { - return ValueType.OBJECT; - } - - @Override - public boolean isUndefined() { - return true; - } - - @Override - public boolean isNull() { - return false; - } - - @Override - public boolean contains(Value val) { - return false; - } - }; - - CollectionValue NULL = - new CollectionValue() { - @Override - public boolean isEmpty() { - return true; - } - - @Override - public int count() { - return -1; - } - - @Override - public Value get(Object key) { - return Value.nullValue(); - } - - @Override - public Object getValue() { - return Value.nullValue(); - } - - @Override - public ValueType getType() { - return ValueType.OBJECT; - } - - @Override - public boolean isUndefined() { - return false; - } - - @Override - public boolean isNull() { - return true; - } - - @Override - public boolean contains(Value val) { - return false; - } - }; + CollectionValue UNDEFINED = new CollectionValue() { + @Override + public boolean isEmpty() { + return true; + } + + @Override + public int count() { + return 0; + } + + @Override + public Value get(Object key) { + return Value.undefinedValue(); + } + + @Override + public Object getValue() { + return Values.UNDEFINED_OBJECT; + } + + @Override + public ValueType getType() { + return ValueType.OBJECT; + } + + @Override + public boolean isUndefined() { + return true; + } + + @Override + public boolean isNull() { + return false; + } + + @Override + public boolean contains(Value val) { + return false; + } + }; + + CollectionValue NULL = new CollectionValue() { + @Override + public boolean isEmpty() { + return true; + } + + @Override + public int count() { + return -1; + } + + @Override + public Value get(Object key) { + return Value.nullValue(); + } + + @Override + public Object getValue() { + return Value.nullValue(); + } + + @Override + public ValueType getType() { + return ValueType.OBJECT; + } + + @Override + public boolean isUndefined() { + return false; + } + + @Override + public boolean isNull() { + return true; + } + + @Override + public boolean contains(Value val) { + return false; + } + }; boolean isEmpty(); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/EvalContextHelper.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/EvalContextHelper.java index e082987ed6d..10ac6839745 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/EvalContextHelper.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/EvalContextHelper.java @@ -50,16 +50,14 @@ private static void fillValues( for (Map.Entry entry : fields.entrySet()) { Object value = entry.getValue(); if (Redaction.isRedactedKeyword(entry.getKey())) { - fieldValues[index++] = - CapturedContext.CapturedValue.redacted( - entry.getKey(), - value != null ? value.getClass().getTypeName() : Object.class.getTypeName()); + fieldValues[index++] = CapturedContext.CapturedValue.redacted( + entry.getKey(), + value != null ? value.getClass().getTypeName() : Object.class.getTypeName()); } else { - fieldValues[index++] = - CapturedContext.CapturedValue.of( - entry.getKey(), - value != null ? value.getClass().getTypeName() : Object.class.getTypeName(), - value); + fieldValues[index++] = CapturedContext.CapturedValue.of( + entry.getKey(), + value != null ? value.getClass().getTypeName() : Object.class.getTypeName(), + value); } } } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ExpressionTest.java index fe37b2e9a75..7750e787c74 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ExpressionTest.java @@ -81,11 +81,9 @@ void testPrettyPrint() { assertEquals("1 <= 1", print(le(value(1), value(1)))); assertEquals( "when(this.strField == \"foo\" && @duration > 0)", - print( - when( - and( - eq(getMember(ref("this"), "strField"), value("foo")), - gt(ref("@duration"), value(0)))))); + print(when(and( + eq(getMember(ref("this"), "strField"), value("foo")), + gt(ref("@duration"), value(0)))))); assertEquals( "len(list[idx].map)", print(len(getMember(index(ref("list"), ref("idx")), "map")))); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ProbeConditionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ProbeConditionTest.java index 50ba2590b2a..7d0ae04f7da 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ProbeConditionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ProbeConditionTest.java @@ -75,21 +75,18 @@ void testGetMember() throws Exception { class Obj { Container container = new Container("hello"); } - ValueReferenceResolver ctx = - EvalContextHelper.createResolver( - singletonMap("this", new Obj()), singletonMap("container", new Container("world"))); + ValueReferenceResolver ctx = EvalContextHelper.createResolver( + singletonMap("this", new Obj()), singletonMap("container", new Container("world"))); assertTrue(probeCondition.execute(ctx, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); class Obj2 { Container obj = new Container("hello"); } - ValueReferenceResolver ctx2 = - EvalContextHelper.createResolver( - singletonMap("this", new Obj2()), singletonMap("container", new Container("world"))); - RuntimeException runtimeException = - assertThrows( - RuntimeException.class, - () -> probeCondition.execute(ctx2, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); + ValueReferenceResolver ctx2 = EvalContextHelper.createResolver( + singletonMap("this", new Obj2()), singletonMap("container", new Container("world"))); + RuntimeException runtimeException = assertThrows( + RuntimeException.class, + () -> probeCondition.execute(ctx2, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); assertEquals("Cannot dereference field: container", runtimeException.getMessage()); } @@ -110,9 +107,8 @@ void testNullLiteral() throws Exception { class Obj { Object objField = new Object(); } - ValueReferenceResolver ctx = - EvalContextHelper.createResolver( - singletonMap("this", new Obj()), singletonMap("nullField", null)); + ValueReferenceResolver ctx = EvalContextHelper.createResolver( + singletonMap("this", new Obj()), singletonMap("nullField", null)); assertTrue(probeCondition.execute(ctx, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); } @@ -148,10 +144,9 @@ class Obj { @Test void testJsonAdapter() throws IOException { - Moshi moshi = - new Moshi.Builder() - .add(ProbeCondition.class, new ProbeCondition.ProbeConditionJsonAdapter()) - .build(); + Moshi moshi = new Moshi.Builder() + .add(ProbeCondition.class, new ProbeCondition.ProbeConditionJsonAdapter()) + .build(); JsonAdapter jsonAdapter = moshi.adapter(ProbeCondition.class); assertNull(jsonAdapter.fromJson("null")); assertEquals(jsonAdapter.toJson(null), "null"); @@ -195,10 +190,9 @@ void testHashCode() throws IOException { @Test void testIncorrectSyntax() { - UnsupportedOperationException ex = - assertThrows( - UnsupportedOperationException.class, - () -> loadFromResource("/test_conditional_03_error.json")); + UnsupportedOperationException ex = assertThrows( + UnsupportedOperationException.class, + () -> loadFromResource("/test_conditional_03_error.json")); assertEquals("Unsupported operation 'gte'", ex.getMessage()); } @@ -208,10 +202,9 @@ void redaction() throws IOException { Map args = new HashMap<>(); args.put("password", "secret123"); ValueReferenceResolver ctx = EvalContextHelper.createResolver(args, null); - EvaluationException evaluationException = - assertThrows( - EvaluationException.class, - () -> probeCondition.execute(ctx, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); + EvaluationException evaluationException = assertThrows( + EvaluationException.class, + () -> probeCondition.execute(ctx, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); assertEquals( "Could not evaluate the expression because 'password' was redacted", evaluationException.getMessage()); @@ -296,12 +289,10 @@ class Obj { Obj obj = new Obj(); ValueReferenceResolver ctx = EvalContextHelper.createResolver(obj); // first call is longer so ideal to test timeout - EvaluationException evaluationException = - assertThrows( - EvaluationException.class, - () -> - probeCondition.execute( - ctx, TimeoutChecker.create(Config.get(), Duration.ofMillis(1)))); + EvaluationException evaluationException = assertThrows( + EvaluationException.class, + () -> + probeCondition.execute(ctx, TimeoutChecker.create(Config.get(), Duration.ofMillis(1)))); assertEquals("timeout (1ms)", evaluationException.getMessage()); // test good execution assertTrue(probeCondition.execute(ctx, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); @@ -315,10 +306,9 @@ class Obj { List lines = loadLinesFromResource("/null_expressions.txt"); for (String line : lines) { ValueReferenceResolver ctx = EvalContextHelper.createResolver(new Obj()); - EvaluationException ex = - assertThrows( - EvaluationException.class, - () -> load(line).execute(ctx, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); + EvaluationException ex = assertThrows( + EvaluationException.class, + () -> load(line).execute(ctx, TimeoutChecker.create(Config.get(), TEST_TIMEOUT))); assertEquals("Cannot evaluate the expression for null value", ex.getMessage(), line); } } @@ -347,10 +337,9 @@ public void timeoutExpressions() {} private static ProbeCondition loadFromResource(String resourcePath) throws IOException { InputStream input = ProbeConditionTest.class.getResourceAsStream(resourcePath); - Moshi moshi = - new Moshi.Builder() - .add(ProbeCondition.class, new ProbeCondition.ProbeConditionJsonAdapter()) - .build(); + Moshi moshi = new Moshi.Builder() + .add(ProbeCondition.class, new ProbeCondition.ProbeConditionJsonAdapter()) + .build(); return moshi.adapter(ProbeCondition.class).fromJson(Okio.buffer(Okio.source(input))); } @@ -365,10 +354,9 @@ private static List loadLinesFromResource(String resourcePath) { private static ProbeCondition load(String json) { try { - Moshi moshi = - new Moshi.Builder() - .add(ProbeCondition.class, new ProbeCondition.ProbeConditionJsonAdapter()) - .build(); + Moshi moshi = new Moshi.Builder() + .add(ProbeCondition.class, new ProbeCondition.ProbeConditionJsonAdapter()) + .build(); return moshi.adapter(ProbeCondition.class).fromJson(json); } catch (IOException e) { throw new RuntimeException("Failed to load json: " + json, e); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ValueScriptTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ValueScriptTest.java index fccf05ffeb7..156e7b0a007 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ValueScriptTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/ValueScriptTest.java @@ -44,13 +44,10 @@ static class Obj { public void predicates() { ValueScript valueScript = loadFromResource("/test_value_expr_01.json"); // first call is longer so ideal to test timeout - EvaluationException evaluationException = - assertThrows( - EvaluationException.class, - () -> - valueScript.execute( - createResolver(new Obj()), - TimeoutChecker.create(Config.get(), Duration.ofMillis(1)))); + EvaluationException evaluationException = assertThrows( + EvaluationException.class, + () -> valueScript.execute( + createResolver(new Obj()), TimeoutChecker.create(Config.get(), Duration.ofMillis(1)))); assertEquals("timeout (1ms)", evaluationException.getMessage()); // test good execution assertEquals( @@ -76,30 +73,29 @@ public void topLevelPredicates() { @Test public void topLevelPrimitives() { - Object[] expectedValues = - new Object[] { - "hello", - "hello", - 10, - 100_000_000_000L, - 2.5F, - 3.14D, - "a", - "b", - 5, - 3, - "el", - Values.NULL_OBJECT, - Boolean.TRUE, - Boolean.FALSE, - 42, - Integer.MAX_VALUE, - -42, - Integer.MIN_VALUE, - 17315993717L, - -17315993717L, - 3.14 - }; + Object[] expectedValues = new Object[] { + "hello", + "hello", + 10, + 100_000_000_000L, + 2.5F, + 3.14D, + "a", + "b", + 5, + 3, + "el", + Values.NULL_OBJECT, + Boolean.TRUE, + Boolean.FALSE, + 42, + Integer.MAX_VALUE, + -42, + Integer.MIN_VALUE, + 17315993717L, + -17315993717L, + 3.14 + }; List lines = loadLinesFromResource("/test_one_liner_value_expr_02.txt"); int i = 0; for (String line : lines) { @@ -125,8 +121,9 @@ private static List loadLinesFromResource(String resourcePath) { private static ValueScript loadFromResource(String resourcePath) { try (InputStream input = ProbeConditionTest.class.getResourceAsStream(resourcePath)) { - Moshi moshi = - new Moshi.Builder().add(ValueScript.class, new ValueScript.ValueScriptAdapter()).build(); + Moshi moshi = new Moshi.Builder() + .add(ValueScript.class, new ValueScript.ValueScriptAdapter()) + .build(); return moshi.adapter(ValueScript.class).fromJson(Okio.buffer(Okio.source(input))); } catch (IOException e) { throw new RuntimeException("Failed to load resource: " + resourcePath, e); @@ -135,8 +132,9 @@ private static ValueScript loadFromResource(String resourcePath) { private static ValueScript load(String json) { try { - Moshi moshi = - new Moshi.Builder().add(ValueScript.class, new ValueScript.ValueScriptAdapter()).build(); + Moshi moshi = new Moshi.Builder() + .add(ValueScript.class, new ValueScript.ValueScriptAdapter()) + .build(); return moshi.adapter(ValueScript.class).fromJson(json); } catch (IOException e) { throw new RuntimeException("Failed to load json: " + json, e); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/BinaryExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/BinaryExpressionTest.java index ef6de51409f..e2849e26bda 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/BinaryExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/BinaryExpressionTest.java @@ -31,22 +31,20 @@ void testRightNull() { @Test void testShortCircuitAnd() { - BinaryExpression expression = - new BinaryExpression( - BooleanExpression.FALSE, - valueRefResolver -> Assertions.fail("should not reach"), - BinaryOperator.AND); + BinaryExpression expression = new BinaryExpression( + BooleanExpression.FALSE, + valueRefResolver -> Assertions.fail("should not reach"), + BinaryOperator.AND); assertFalse(expression.evaluate(evalContext)); assertEquals("false && null", print(expression)); } @Test void testShortCircuitOr() { - BinaryExpression expression = - new BinaryExpression( - BooleanExpression.TRUE, - valueRefResolver -> Assertions.fail("should not reach"), - BinaryOperator.OR); + BinaryExpression expression = new BinaryExpression( + BooleanExpression.TRUE, + valueRefResolver -> Assertions.fail("should not reach"), + BinaryOperator.OR); assertTrue(expression.evaluate(evalContext)); assertEquals("true || null", print(expression)); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ComparisonExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ComparisonExpressionTest.java index b0c4de7680c..ea259ac8d96 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ComparisonExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ComparisonExpressionTest.java @@ -313,10 +313,9 @@ void evaluateBothNull() { void invalidInstanceofOperand() { ComparisonExpression expression = new ComparisonExpression(new StringValue("foo"), new NumericValue(1, INT), INSTANCEOF); - EvaluationException evaluationException = - assertThrows( - EvaluationException.class, - () -> expression.evaluate(createEvalContext(NoopResolver.INSTANCE))); + EvaluationException evaluationException = assertThrows( + EvaluationException.class, + () -> expression.evaluate(createEvalContext(NoopResolver.INSTANCE))); assertEquals( "Right operand of instanceof operator must be a string literal", evaluationException.getMessage()); @@ -327,10 +326,9 @@ void invalidInstanceofOperand() { void invalidInstanceofClassName() { ComparisonExpression expression = new ComparisonExpression(new StringValue("foo"), new StringValue("String"), INSTANCEOF); - EvaluationException evaluationException = - assertThrows( - EvaluationException.class, - () -> expression.evaluate(createEvalContext(NoopResolver.INSTANCE))); + EvaluationException evaluationException = assertThrows( + EvaluationException.class, + () -> expression.evaluate(createEvalContext(NoopResolver.INSTANCE))); assertEquals("Class not found: String", evaluationException.getMessage()); assertEquals("\"foo\" instanceof \"String\"", evaluationException.getExpr()); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ContainsExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ContainsExpressionTest.java index 3c5d0d239d8..ab37d3daeda 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ContainsExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ContainsExpressionTest.java @@ -164,9 +164,8 @@ void arrayExpression() { assertEquals("contains(arrayStrWithNull, null)", print(expression)); ContainsExpression primitiveNullExpression = new ContainsExpression(DSL.ref("arrayInt"), null); - EvaluationException exception = - assertThrows( - EvaluationException.class, () -> primitiveNullExpression.evaluate(evalContext)); + EvaluationException exception = assertThrows( + EvaluationException.class, () -> primitiveNullExpression.evaluate(evalContext)); assertEquals("Cannot compare null with primitive array", exception.getMessage()); assertEquals("contains(arrayInt, null)", print(primitiveNullExpression)); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/FilterCollectionExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/FilterCollectionExpressionTest.java index a2f25c1b306..5287c4e4aac 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/FilterCollectionExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/FilterCollectionExpressionTest.java @@ -121,9 +121,8 @@ void testMatchingMap() { map.put("c", 3); MapValue collection = new MapValue(map); - FilterCollectionExpression expression = - new FilterCollectionExpression( - collection, eq(getMember(ref(ValueReferences.ITERATOR_REF), "key"), value("b"))); + FilterCollectionExpression expression = new FilterCollectionExpression( + collection, eq(getMember(ref(ValueReferences.ITERATOR_REF), "key"), value("b"))); CollectionValue filtered = expression.evaluate(evalContext); assertNotEquals(collection, filtered); assertEquals(1, filtered.count()); @@ -131,9 +130,8 @@ void testMatchingMap() { assertFalse(filtered.isNull()); assertFalse(filtered.isUndefined()); - expression = - new FilterCollectionExpression( - collection, lt(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value(2))); + expression = new FilterCollectionExpression( + collection, lt(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value(2))); filtered = expression.evaluate(evalContext); assertNotEquals(collection, filtered); assertEquals(1, filtered.count()); @@ -309,9 +307,8 @@ void testLargeSet() { @Test void testUnsupportedList() { ListValue collection = new ListValue(new CustomList()); - FilterCollectionExpression expression = - new FilterCollectionExpression( - collection, eq(ref(ValueReferences.ITERATOR_REF), value("foo"))); + FilterCollectionExpression expression = new FilterCollectionExpression( + collection, eq(ref(ValueReferences.ITERATOR_REF), value("foo"))); EvaluationException exception = assertThrows(EvaluationException.class, () -> expression.evaluate(evalContext)); assertEquals( @@ -336,9 +333,8 @@ void testUnsupportedMap() { @Test void testUnsupportedSet() { SetValue collection = new SetValue(new CustomSet()); - FilterCollectionExpression expression = - new FilterCollectionExpression( - collection, eq(ref(ValueReferences.ITERATOR_REF), value("foo"))); + FilterCollectionExpression expression = new FilterCollectionExpression( + collection, eq(ref(ValueReferences.ITERATOR_REF), value("foo"))); EvaluationException exception = assertThrows(EvaluationException.class, () -> expression.evaluate(evalContext)); assertEquals( diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAllExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAllExpressionTest.java index 20e01b6c9b4..19717f780dd 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAllExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAllExpressionTest.java @@ -120,10 +120,9 @@ void testArrayHasAll() { GetMemberExpression fldRef = getMember(ref(ValueReferences.ITERATOR_REF), "testField"); ValueRefExpression itRef = ref(ValueReferences.ITERATOR_REF); - RuntimeException runtimeException = - assertThrows( - RuntimeException.class, - () -> all(targetExpression, eq(fldRef, value(10))).evaluate(evalContext)); + RuntimeException runtimeException = assertThrows( + RuntimeException.class, + () -> all(targetExpression, eq(fldRef, value(10))).evaluate(evalContext)); assertEquals("Cannot dereference field: testField", runtimeException.getMessage()); expression = all(targetExpression, eq(itRef, value("hello"))); @@ -150,10 +149,9 @@ void testListHasAll() { ValueRefExpression fldRef = ref(ValueReferences.ITERATOR_REF + "testField"); ValueRefExpression itRef = ref(ValueReferences.ITERATOR_REF); - RuntimeException runtimeException = - assertThrows( - RuntimeException.class, - () -> all(targetExpression, eq(fldRef, value(10))).evaluate(evalContext)); + RuntimeException runtimeException = assertThrows( + RuntimeException.class, + () -> all(targetExpression, eq(fldRef, value(10))).evaluate(evalContext)); assertEquals("Cannot find synthetic var: ittestField", runtimeException.getMessage()); expression = all(targetExpression, eq(itRef, value("hello"))); @@ -202,10 +200,8 @@ void testMapHasAll() { assertFalse(expression.evaluate(evalContext)); assertEquals("all(Map, {@it.key == \"a\"})", print(expression)); - expression = - all( - targetExpression, - eq(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value("a"))); + expression = all( + targetExpression, eq(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value("a"))); assertTrue(expression.evaluate(evalContext)); assertEquals("all(Map, {@it.value == \"a\"})", print(expression)); } @@ -246,12 +242,11 @@ void testSetHasAll() { assertFalse(expression.evaluate(evalContext)); assertEquals("all(Set, {@it == \"key\"})", print(expression)); - expression = - all( - targetExpression, - or( - eq(ref(ValueReferences.ITERATOR_REF), value("foo")), - eq(ref(ValueReferences.ITERATOR_REF), value("bar")))); + expression = all( + targetExpression, + or( + eq(ref(ValueReferences.ITERATOR_REF), value("foo")), + eq(ref(ValueReferences.ITERATOR_REF), value("bar")))); assertTrue(expression.evaluate(evalContext)); assertEquals("all(Set, {@it == \"foo\" || @it == \"bar\"})", print(expression)); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAnyExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAnyExpressionTest.java index 116c5eb90df..80a70ca41dd 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAnyExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/HasAnyExpressionTest.java @@ -114,10 +114,8 @@ void testArrayHasAny() { assertFalse(expression.evaluate(evalContext)); assertEquals("any(java.lang.Object[], {false})", print(expression)); - expression = - any( - targetExpression, - eq(getMember(ref(ValueReferences.ITERATOR_REF), "testField"), value(10))); + expression = any( + targetExpression, eq(getMember(ref(ValueReferences.ITERATOR_REF), "testField"), value(10))); assertTrue(expression.evaluate(evalContext)); assertEquals("any(java.lang.Object[], {@it.testField == 10})", print(expression)); @@ -138,10 +136,8 @@ void testListHasAny() { assertFalse(expression.evaluate(evalContext)); assertEquals("any(List, {false})", print(expression)); - expression = - any( - targetExpression, - eq(getMember(ref(ValueReferences.ITERATOR_REF), "testField"), value(10))); + expression = any( + targetExpression, eq(getMember(ref(ValueReferences.ITERATOR_REF), "testField"), value(10))); assertTrue(expression.evaluate(evalContext)); assertEquals("any(List, {@it.testField == 10})", print(expression)); @@ -187,10 +183,8 @@ void testMapHasAny() { assertTrue(expression.evaluate(evalContext)); assertEquals("any(Map, {@it.key == \"b\"})", print(expression)); - expression = - any( - targetExpression, - eq(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value("a"))); + expression = any( + targetExpression, eq(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value("a"))); assertTrue(expression.evaluate(evalContext)); assertEquals("any(Map, {@it.value == \"a\"})", print(expression)); @@ -199,10 +193,8 @@ void testMapHasAny() { assertFalse(expression.evaluate(evalContext)); assertEquals("any(Map, {@it.key == \"c\"})", print(expression)); - expression = - any( - targetExpression, - eq(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value("c"))); + expression = any( + targetExpression, eq(getMember(ref(ValueReferences.ITERATOR_REF), "value"), value("c"))); assertFalse(expression.evaluate(evalContext)); assertEquals("any(Map, {@it.value == \"c\"})", print(expression)); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfElseExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfElseExpressionTest.java index 3b546487d44..327d4eb2965 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfElseExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfElseExpressionTest.java @@ -18,16 +18,14 @@ class IfElseExpressionTest { void testIfTrue() { boolean[] executed = new boolean[] {false, false}; BooleanExpression test = BooleanExpression.TRUE; - Expression thenExpression = - context -> { - executed[0] = true; - return null; - }; - Expression elseExpression = - context -> { - executed[1] = true; - return null; - }; + Expression thenExpression = context -> { + executed[0] = true; + return null; + }; + Expression elseExpression = context -> { + executed[1] = true; + return null; + }; IfElseExpression expression = DSL.doif(test, thenExpression, elseExpression); expression.evaluate(evalContext); assertTrue(executed[0]); @@ -38,16 +36,14 @@ void testIfTrue() { void testIfFalse() { boolean[] executed = new boolean[] {false, false}; BooleanExpression test = BooleanExpression.FALSE; - Expression thenExpression = - context -> { - executed[0] = true; - return null; - }; - Expression elseExpression = - context -> { - executed[1] = true; - return null; - }; + Expression thenExpression = context -> { + executed[0] = true; + return null; + }; + Expression elseExpression = context -> { + executed[1] = true; + return null; + }; DSL.doif(test, thenExpression, elseExpression).evaluate(evalContext); assertFalse(executed[0]); assertTrue(executed[1]); @@ -57,16 +53,14 @@ void testIfFalse() { void testFromContext() { boolean[] executed = new boolean[] {false, false}; BooleanExpression test = DSL.eq(DSL.ref("guardFlag"), BooleanValue.TRUE); - Expression thenExpression = - context -> { - executed[0] = true; - return null; - }; - Expression elseExpression = - context -> { - executed[1] = true; - return null; - }; + Expression thenExpression = context -> { + executed[0] = true; + return null; + }; + Expression elseExpression = context -> { + executed[1] = true; + return null; + }; guardFlag = false; DSL.doif(test, thenExpression, elseExpression).evaluate(evalContext); assertFalse(executed[0]); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfExpressionTest.java index 67ed34b2054..83b9a6d08e7 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IfExpressionTest.java @@ -19,11 +19,10 @@ class IfExpressionTest { void testIfTrue() { boolean[] executed = new boolean[] {false}; BooleanExpression test = BooleanExpression.TRUE; - Expression expression = - context -> { - executed[0] = true; - return null; - }; + Expression expression = context -> { + executed[0] = true; + return null; + }; DSL.doif(test, expression).evaluate(evalContext); assertTrue(executed[0]); } @@ -32,11 +31,10 @@ void testIfTrue() { void testIfFalse() { boolean[] executed = new boolean[] {false}; BooleanExpression test = BooleanExpression.FALSE; - Expression expression = - context -> { - executed[0] = true; - return null; - }; + Expression expression = context -> { + executed[0] = true; + return null; + }; DSL.doif(test, expression).evaluate(evalContext); assertFalse(executed[0]); } @@ -45,11 +43,10 @@ void testIfFalse() { void testFromContext() { boolean[] executed = new boolean[] {false}; BooleanExpression test = DSL.eq(DSL.ref("guardFlag"), BooleanValue.TRUE); - Expression expression = - context -> { - executed[0] = true; - return null; - }; + Expression expression = context -> { + executed[0] = true; + return null; + }; guardFlag = false; DSL.doif(test, expression).evaluate(evalContext); assertFalse(executed[0]); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IndexExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IndexExpressionTest.java index 455979a644d..5dddd44b251 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IndexExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/IndexExpressionTest.java @@ -98,9 +98,8 @@ void testUnsupportedSet() { @Test void testUnsupportedList() { - IndexExpression expr = - new IndexExpression( - new ListValue(new ArrayList() {}), new NumericValue(0, ValueType.INT)); + IndexExpression expr = new IndexExpression( + new ListValue(new ArrayList() {}), new NumericValue(0, ValueType.INT)); EvaluationException evaluationException = assertThrows(EvaluationException.class, () -> expr.evaluate(evalContext)); assertEquals( @@ -110,9 +109,8 @@ void testUnsupportedList() { @Test void testOutOfBoundsList() { - IndexExpression expr = - new IndexExpression( - new ListValue(new ArrayList()), new NumericValue(42, ValueType.INT)); + IndexExpression expr = new IndexExpression( + new ListValue(new ArrayList()), new NumericValue(42, ValueType.INT)); EvaluationException evaluationException = assertThrows(EvaluationException.class, () -> expr.evaluate(evalContext)); assertEquals("index[42] out of bounds: [0-0]", evaluationException.getMessage()); @@ -165,26 +163,24 @@ void redactedType() { "com.datadog.debugger.el.expressions.IndexExpressionTest*"); try { Redaction.addUserDefinedTypes(Config.get()); - IndexExpression exprArray = - new IndexExpression( - new ValueRefExpression("secretArray"), new NumericValue(0, ValueType.INT)); - RedactedException redactedException = - assertThrows(RedactedException.class, () -> exprArray.evaluate(evalContext).getValue()); + IndexExpression exprArray = new IndexExpression( + new ValueRefExpression("secretArray"), new NumericValue(0, ValueType.INT)); + RedactedException redactedException = assertThrows( + RedactedException.class, () -> exprArray.evaluate(evalContext).getValue()); assertEquals( "Could not evaluate the expression because 'secretArray[0]' was redacted", redactedException.getMessage()); - IndexExpression exprList = - new IndexExpression( - new ValueRefExpression("secretList"), new NumericValue(0, ValueType.INT)); - redactedException = - assertThrows(RedactedException.class, () -> exprList.evaluate(evalContext).getValue()); + IndexExpression exprList = new IndexExpression( + new ValueRefExpression("secretList"), new NumericValue(0, ValueType.INT)); + redactedException = assertThrows( + RedactedException.class, () -> exprList.evaluate(evalContext).getValue()); assertEquals( "Could not evaluate the expression because 'secretList[0]' was redacted", redactedException.getMessage()); IndexExpression exprMap = new IndexExpression(new ValueRefExpression("secretMap"), new StringValue("foo")); - redactedException = - assertThrows(RedactedException.class, () -> exprMap.evaluate(evalContext).getValue()); + redactedException = assertThrows( + RedactedException.class, () -> exprMap.evaluate(evalContext).getValue()); assertEquals( "Could not evaluate the expression because 'secretMap[\"foo\"]' was redacted", redactedException.getMessage()); @@ -195,9 +191,8 @@ void redactedType() { @Test void stringPrimitives() { - IndexExpression expr = - new IndexExpression( - new ValueRefExpression("uuidArray"), new NumericValue(1, ValueType.INT)); + IndexExpression expr = new IndexExpression( + new ValueRefExpression("uuidArray"), new NumericValue(1, ValueType.INT)); assertEquals(UUID_2, expr.evaluate(evalContext).getValue()); expr = new IndexExpression(new ValueRefExpression("uuidList"), new NumericValue(1, ValueType.INT)); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/LenExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/LenExpressionTest.java index 7567be2b3e3..f35df2fe100 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/LenExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/LenExpressionTest.java @@ -20,8 +20,8 @@ class LenExpressionTest { @Test void nullExpression() { LenExpression expression = new LenExpression(null); - EvaluationException exception = - assertThrows(EvaluationException.class, () -> expression.evaluate(evalContext).getValue()); + EvaluationException exception = assertThrows( + EvaluationException.class, () -> expression.evaluate(evalContext).getValue()); assertEquals("Cannot evaluate the expression for null value", exception.getMessage()); assertEquals("len(null)", print(expression)); } @@ -29,8 +29,8 @@ void nullExpression() { @Test void undefinedExpression() { LenExpression expression = new LenExpression(DSL.value(Values.UNDEFINED_OBJECT)); - EvaluationException exception = - assertThrows(EvaluationException.class, () -> expression.evaluate(evalContext).getValue()); + EvaluationException exception = assertThrows( + EvaluationException.class, () -> expression.evaluate(evalContext).getValue()); assertEquals("Cannot evaluate the expression for undefined value", exception.getMessage()); assertEquals("len(UNDEFINED)", print(expression)); } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ValueRefExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ValueRefExpressionTest.java index 7642eaef882..6c54d97b7cb 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ValueRefExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/ValueRefExpressionTest.java @@ -58,13 +58,11 @@ void testPredicatedRef() { RuntimeException runtimeException = assertThrows(RuntimeException.class, () -> isEmptyInvalid.evaluate(evalContext)); assertEquals("Cannot dereference field: x", runtimeException.getMessage()); - runtimeException = - assertThrows( - RuntimeException.class, () -> and(isEmptyInvalid, isEmpty).evaluate(evalContext)); + runtimeException = assertThrows( + RuntimeException.class, () -> and(isEmptyInvalid, isEmpty).evaluate(evalContext)); assertEquals("Cannot dereference field: x", runtimeException.getMessage()); - runtimeException = - assertThrows( - RuntimeException.class, () -> or(isEmptyInvalid, isEmpty).evaluate(evalContext)); + runtimeException = assertThrows( + RuntimeException.class, () -> or(isEmptyInvalid, isEmpty).evaluate(evalContext)); assertEquals("Cannot dereference field: x", runtimeException.getMessage()); assertEquals("isEmpty(x)", print(isEmptyInvalid)); } @@ -84,10 +82,9 @@ class Obj { exts.put(ValueReferences.RETURN_EXTENSION_NAME, CapturedValue.of(returnVal)); exts.put(ValueReferences.DURATION_EXTENSION_NAME, CapturedValue.of(duration)); exts.put(ValueReferences.EXCEPTION_EXTENSION_NAME, CapturedValue.of(exception)); - EvalContext evalContext = - new EvalContext( - createResolver(new Obj()).withExtensions(exts), - TimeoutChecker.create(Config.get(), TEST_TIMEOUT)); + EvalContext evalContext = new EvalContext( + createResolver(new Obj()).withExtensions(exts), + TimeoutChecker.create(Config.get(), TEST_TIMEOUT)); ValueRefExpression expression = DSL.ref(ValueReferences.DURATION_REF); assertEquals(duration, expression.evaluate(evalContext).getValue()); @@ -108,9 +105,8 @@ class Obj { assertEquals(6, expression.evaluate(evalContext).getValue()); // int value is widened to long assertEquals("i", print(expression)); ValueRefExpression invalidExpression = ref(ValueReferences.synthetic("invalid")); - RuntimeException runtimeException = - assertThrows( - RuntimeException.class, () -> invalidExpression.evaluate(evalContext).getValue()); + RuntimeException runtimeException = assertThrows( + RuntimeException.class, () -> invalidExpression.evaluate(evalContext).getValue()); assertEquals("Cannot find synthetic var: invalid", runtimeException.getMessage()); assertEquals("@invalid", print(invalidExpression)); } @@ -145,9 +141,8 @@ public void redactedType() { class Holder { StoreSecret store = new StoreSecret("secret123"); } - RedactedException redactedException = - assertThrows( - RedactedException.class, () -> valueRef.evaluate(createEvalContext(new Holder()))); + RedactedException redactedException = assertThrows( + RedactedException.class, () -> valueRef.evaluate(createEvalContext(new Holder()))); assertEquals( "Could not evaluate the expression because 'store' was redacted", redactedException.getMessage()); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/AllowListHelper.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/AllowListHelper.java index 2a9a9e3bb11..656ca2362d0 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/AllowListHelper.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/AllowListHelper.java @@ -14,9 +14,8 @@ public class AllowListHelper { private HashSet classes; public AllowListHelper(Configuration.FilterList allowList) { - this.allowAll = - allowList == null - || allowList.getClasses().isEmpty() && allowList.getPackagePrefixes().isEmpty(); + this.allowAll = allowList == null + || allowList.getClasses().isEmpty() && allowList.getPackagePrefixes().isEmpty(); if (allowList != null) { ClassNameTrie.Builder builder = new ClassNameTrie.Builder(); allowList.getPackagePrefixes().stream().forEach(s -> builder.put(s + "*", 1)); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ClassesToRetransformFinder.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ClassesToRetransformFinder.java index d91a159a914..d9669e6c889 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ClassesToRetransformFinder.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ClassesToRetransformFinder.java @@ -28,14 +28,12 @@ public class ClassesToRetransformFinder { public void register(String sourceFile, String className) { // store only the class name that are different from SourceFile name // (Inner or non-public Top-Level classes) - classNamesBySourceFile.compute( - sourceFile, - (key, classNames) -> { - if (classNames == null) { - return className; - } - return classNames + "," + className; - }); + classNamesBySourceFile.compute(sourceFile, (key, classNames) -> { + if (classNames == null) { + return className; + } + return classNames + "," + className; + }); } public List> getAllLoadedChangedClasses( @@ -60,10 +58,9 @@ public boolean hasChangedClasses(ConfigurationComparer comparer) { } Trie getAllChangedClasses(ConfigurationComparer comparer) { - List changedDefinitions = - Stream.concat( - comparer.getRemovedDefinitions().stream(), comparer.getAddedDefinitions().stream()) - .collect(Collectors.toList()); + List changedDefinitions = Stream.concat( + comparer.getRemovedDefinitions().stream(), comparer.getAddedDefinitions().stream()) + .collect(Collectors.toList()); Trie changedClasses = new Trie(); for (ProbeDefinition definition : changedDefinitions) { InstrumentationResult instrumentationResult = diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationComparer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationComparer.java index c3f8749f2de..6dfdab8dbb8 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationComparer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationComparer.java @@ -38,30 +38,26 @@ public ConfigurationComparer( this.incomingConfiguration = incomingConfiguration; this.instrumentationResults = instrumentationResults; - Set originalDefinitions = - this.originalConfiguration != null - ? new HashSet<>(this.originalConfiguration.getDefinitions()) - : new HashSet<>(); + Set originalDefinitions = this.originalConfiguration != null + ? new HashSet<>(this.originalConfiguration.getDefinitions()) + : new HashSet<>(); Set incomingDefinitions = new HashSet<>(this.incomingConfiguration.getDefinitions()); - addedDefinitions = - incomingDefinitions.stream() - .filter(it -> !originalDefinitions.contains(it)) - .collect(Collectors.toList()); - - removedDefinitions = - originalDefinitions.stream() - .filter(it -> !incomingDefinitions.contains(it)) - .collect(Collectors.toList()); - - filteredListChanged = - !Objects.equals( - originalConfiguration != null ? originalConfiguration.getAllowList() : null, - incomingConfiguration.getAllowList()) - || !Objects.equals( - originalConfiguration != null ? originalConfiguration.getDenyList() : null, - incomingConfiguration.getDenyList()); + addedDefinitions = incomingDefinitions.stream() + .filter(it -> !originalDefinitions.contains(it)) + .collect(Collectors.toList()); + + removedDefinitions = originalDefinitions.stream() + .filter(it -> !incomingDefinitions.contains(it)) + .collect(Collectors.toList()); + + filteredListChanged = !Objects.equals( + originalConfiguration != null ? originalConfiguration.getAllowList() : null, + incomingConfiguration.getAllowList()) + || !Objects.equals( + originalConfiguration != null ? originalConfiguration.getDenyList() : null, + incomingConfiguration.getDenyList()); if (filteredListChanged) { changedBlockedTypes = findChangesInBlockedTypes(); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java index 9cc7f5f5421..c0f3114a7ab 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java @@ -41,9 +41,8 @@ public static Configuration from(Path probeFilePath, long maxPayloadSize) { } while (bytesRead > -1); byte[] configContent = outputStream.toByteArray(); JsonAdapter> adapter = new ProbeFileAdapter(); - List probeDefinitions = - adapter.fromJson( - JsonReader.of(Okio.buffer(Okio.source(new ByteArrayInputStream(configContent))))); + List probeDefinitions = adapter.fromJson( + JsonReader.of(Okio.buffer(Okio.source(new ByteArrayInputStream(configContent))))); return new Configuration(null, probeDefinitions); } catch (IOException ex) { LOGGER.error("Unable to load config file {}: {}", probeFilePath, ex); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationUpdater.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationUpdater.java index 740d20978ea..2f21cb0c6e0 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationUpdater.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationUpdater.java @@ -170,9 +170,8 @@ private void applyNewConfiguration(Configuration newConfiguration) { configurationLock.lock(); try { Configuration originalConfiguration = currentConfiguration; - ConfigurationComparer changes = - new ConfigurationComparer( - originalConfiguration, newConfiguration, instrumentationResults); + ConfigurationComparer changes = new ConfigurationComparer( + originalConfiguration, newConfiguration, instrumentationResults); if (changes.hasRateLimitRelatedChanged()) { // apply rate limit config first to avoid racing with execution/instrumentation // of probes requiring samplers @@ -216,12 +215,10 @@ private void handleProbesChanges(ConfigurationComparer changes, Configuration ne } List> changedClasses = finder.getAllLoadedChangedClasses(instrumentation.getAllLoadedClasses(), changes); - changedClasses = - JDKVersionSpecificHelper.detectMethodParameters( - errorMsg -> reportError(changes, errorMsg), instrumentation, changedClasses); - changedClasses = - JDKVersionSpecificHelper.detectRecordWithTypeAnnotation( - errorMsg -> reportError(changes, errorMsg), changedClasses); + changedClasses = JDKVersionSpecificHelper.detectMethodParameters( + errorMsg -> reportError(changes, errorMsg), instrumentation, changedClasses); + changedClasses = JDKVersionSpecificHelper.detectRecordWithTypeAnnotation( + errorMsg -> reportError(changes, errorMsg), changedClasses); retransformClasses(changedClasses); // ensures that we have at least re-transformed 1 class if (changedClasses.size() > 0) { @@ -258,9 +255,8 @@ private void installNewDefinitions(Configuration newConfiguration) { return; } // install new probe definitions - DebuggerTransformer newTransformer = - transformerSupplier.supply( - config, newConfiguration, this::recordInstrumentationProgress, probeMetadata, sink); + DebuggerTransformer newTransformer = transformerSupplier.supply( + config, newConfiguration, this::recordInstrumentationProgress, probeMetadata, sink); instrumentation.addTransformer(newTransformer, true); currentTransformer = newTransformer; LOGGER.debug("New transformer installed with probes: {}", newConfiguration.getDefinitions()); @@ -342,10 +338,8 @@ Map getAppliedDefinitions() { return Collections.emptyMap(); } return currentConfiguration.getDefinitions().stream() - .collect( - Collectors.toMap( - probeDefinition -> probeDefinition.getProbeId().getEncodedId(), - Function.identity())); + .collect(Collectors.toMap( + probeDefinition -> probeDefinition.getProbeId().getEncodedId(), Function.identity())); } Map getInstrumentationResults() { @@ -453,9 +447,8 @@ public static List> detectMethodParameters( method.getName(), parameters[0].getName()); // skip the class: compiled with -parameters - reportError.accept( - "Method Parameters detected, instrumentation not supported for " - + changedClass.getTypeName()); + reportError.accept("Method Parameters detected, instrumentation not supported for " + + changedClass.getTypeName()); addClass = false; } // we found at leat a method with one parameter if name is not present we can stop there diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerAgent.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerAgent.java index 2eaaf14cbab..7406c44adf5 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerAgent.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerAgent.java @@ -134,19 +134,17 @@ private static boolean commonInit(Config config) { ddAgentFeaturesDiscovery.discover(); agentVersion = ddAgentFeaturesDiscovery.getVersion(); String diagnosticEndpoint = getDiagnosticEndpoint(config, ddAgentFeaturesDiscovery); - ProbeStatusSink probeStatusSink = - new ProbeStatusSink( - config, diagnosticEndpoint, ddAgentFeaturesDiscovery.supportsDebuggerDiagnostics()); + ProbeStatusSink probeStatusSink = new ProbeStatusSink( + config, diagnosticEndpoint, ddAgentFeaturesDiscovery.supportsDebuggerDiagnostics()); DebuggerSink debuggerSink = createDebuggerSink(config, ddAgentFeaturesDiscovery, probeStatusSink); debuggerSink.start(); - configurationUpdater = - new ConfigurationUpdater( - instrumentation, - DebuggerAgent::createTransformer, - config, - debuggerSink, - classesToRetransformFinder); + configurationUpdater = new ConfigurationUpdater( + instrumentation, + DebuggerAgent::createTransformer, + config, + debuggerSink, + classesToRetransformFinder); sink = debuggerSink; DebuggerContext.initProbeResolver(configurationUpdater); DebuggerContext.initMetricForwarder(new StatsdMetricForwarder(config, probeStatusSink)); @@ -181,9 +179,8 @@ public static void startDynamicInstrumentation(Config config) { String probeFileLocation = config.getDynamicInstrumentationProbeFile(); if (probeFileLocation != null) { Path probeFilePath = Paths.get(probeFileLocation); - Configuration configuration = - ConfigurationFileLoader.from( - probeFilePath, config.getDynamicInstrumentationMaxPayloadSize()); + Configuration configuration = ConfigurationFileLoader.from( + probeFilePath, config.getDynamicInstrumentationMaxPayloadSize()); if (configuration != null) { LOGGER.debug("Probe definitions loaded from file {}", probeFilePath); configurationUpdater.accept( @@ -233,12 +230,11 @@ public static void startSymbolDatabase(Config config) { initClassNameFilter(); List scopeFilters = Arrays.asList(new AvroFilter(), new ProtoFilter(), new WireFilter()); - SymbolAggregator symbolAggregator = - new SymbolAggregator( - classNameFilter, - scopeFilters, - sink.getSymbolSink(), - config.getSymbolDatabaseFlushThreshold()); + SymbolAggregator symbolAggregator = new SymbolAggregator( + classNameFilter, + scopeFilters, + sink.getSymbolSink(), + config.getSymbolDatabaseFlushThreshold()); symbolAggregator.start(); symDBEnablement = new SymDBEnablement(instrumentation, config, symbolAggregator, classNameFilter); @@ -353,18 +349,16 @@ private static DebuggerSink createDebuggerSink( DDAgentFeaturesDiscovery ddAgentFeaturesDiscovery, ProbeStatusSink probeStatusSink) { String tags = getDefaultTagsMergedWithGlobalTags(config); - BatchUploader lowRateUploader = - new BatchUploader( - "Snapshots", - config, - getSnapshotEndpoint(config, ddAgentFeaturesDiscovery), - SnapshotSink.RETRY_POLICY); - BatchUploader highRateUploader = - new BatchUploader( - "Logs", - config, - getLogEndpoint(config, ddAgentFeaturesDiscovery), - SnapshotSink.RETRY_POLICY); + BatchUploader lowRateUploader = new BatchUploader( + "Snapshots", + config, + getSnapshotEndpoint(config, ddAgentFeaturesDiscovery), + SnapshotSink.RETRY_POLICY); + BatchUploader highRateUploader = new BatchUploader( + "Logs", + config, + getLogEndpoint(config, ddAgentFeaturesDiscovery), + SnapshotSink.RETRY_POLICY); SnapshotSink snapshotSink = new SnapshotSink(config, tags, lowRateUploader, highRateUploader); SymbolSink symbolSink = new SymbolSink(config); return new DebuggerSink( @@ -381,22 +375,20 @@ public static String getDefaultTagsMergedWithGlobalTags(Config config) { } catch (Exception e) { LOGGER.error("Failed to retrieve git info: ", e); } - String debuggerTags = - TagsHelper.concatTags( - "env:" + config.getEnv(), - "version:" + config.getVersion(), - "debugger_version:" + DDTraceCoreInfo.VERSION, - "agent_version:" + DebuggerAgent.getAgentVersion(), - "host_name:" + config.getHostName(), - gitSha != null ? Tags.GIT_COMMIT_SHA + ":" + gitSha : null, - gitUrl != null ? Tags.GIT_REPOSITORY_URL + ":" + gitUrl : null); + String debuggerTags = TagsHelper.concatTags( + "env:" + config.getEnv(), + "version:" + config.getVersion(), + "debugger_version:" + DDTraceCoreInfo.VERSION, + "agent_version:" + DebuggerAgent.getAgentVersion(), + "host_name:" + config.getHostName(), + gitSha != null ? Tags.GIT_COMMIT_SHA + ":" + gitSha : null, + gitUrl != null ? Tags.GIT_REPOSITORY_URL + ":" + gitUrl : null); if (config.getGlobalTags().isEmpty()) { return debuggerTags; } - String globalTags = - config.getGlobalTags().entrySet().stream() - .map(e -> e.getKey() + ":" + e.getValue()) - .collect(Collectors.joining(",")); + String globalTags = config.getGlobalTags().entrySet().stream() + .map(e -> e.getKey() + ":" + e.getValue()) + .collect(Collectors.joining(",")); return debuggerTags + "," + globalTags; } @@ -454,9 +446,8 @@ private static void unsubscribeConfigurationPoller() { static ClassFileTransformer setupInstrumentTheWorldTransformer( Config config, Instrumentation instrumentation, DebuggerSink debuggerSink) { LOGGER.info("install Instrument-The-World transformer"); - DebuggerTransformer transformer = - createTransformer( - config, Configuration.builder().build(), null, new ProbeMetadata(), debuggerSink); + DebuggerTransformer transformer = createTransformer( + config, Configuration.builder().build(), null, new ProbeMetadata(), debuggerSink); DebuggerContext.initProbeResolver(transformer::instrumentTheWorldResolver); instrumentation.addTransformer(transformer); return transformer; @@ -583,27 +574,26 @@ private static void addReportToFlare(ZipOutputStream zip) throws IOException { exceptionFingerprints = exceptionDebugger.getExceptionProbeManager().getFingerprints().toString(); } - String content = - String.join( - System.lineSeparator(), - "Snapshot url: ", - snapshotUrl, - "Diagnostic url: ", - diagnosticUrl, - "SymbolDB url: ", - symbolDbUrl, - "Probe definitions:", - probeDefinitions, - "Instrumented probes:", - instrumentedProbes, - "Probe statuses:", - probeStatuses, - "SymbolDB stats:", - symbolDBStats, - "Exception Fingerprints:", - exceptionFingerprints, - "SourceFile tracking entries:", - String.valueOf(classesToRetransformFinder.getClassNamesBySourceFile().size())); + String content = String.join( + System.lineSeparator(), + "Snapshot url: ", + snapshotUrl, + "Diagnostic url: ", + diagnosticUrl, + "SymbolDB url: ", + symbolDbUrl, + "Probe definitions:", + probeDefinitions, + "Instrumented probes:", + instrumentedProbes, + "Probe statuses:", + probeStatuses, + "SymbolDB stats:", + symbolDBStats, + "Exception Fingerprints:", + exceptionFingerprints, + "SourceFile tracking entries:", + String.valueOf(classesToRetransformFinder.getClassNamesBySourceFile().size())); TracerFlare.addText(zip, "dynamic_instrumentation.txt", content); } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerProductChangesListener.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerProductChangesListener.java index 5dbfb4f1994..695fa0bc293 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerProductChangesListener.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerProductChangesListener.java @@ -34,10 +34,9 @@ public class DebuggerProductChangesListener implements ProductListener { private static final Logger LOGGER = LoggerFactory.getLogger(DebuggerProductChangesListener.class); - private static final Predicate IS_UUID = - Pattern.compile( - "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") - .asPredicate(); + private static final Predicate IS_UUID = Pattern.compile( + "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") + .asPredicate(); private final ConfigurationAcceptor configurationAcceptor; private final Map probeByConfigId = new HashMap<>(); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTracer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTracer.java index a00a93d268e..1f3361d268c 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTracer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTracer.java @@ -24,11 +24,10 @@ public DebuggerSpan createSpan(String encodedProbeId, String resourceName, Strin if (tracerAPI == null || tracerAPI == NOOP_TRACER) { return DebuggerSpan.NOOP_SPAN; } - AgentSpan dynamicSpan = - tracerAPI - .buildSpan("dynamic-instrumentation", OPERATION_NAME) - .withResourceName(resourceName) - .start(); + AgentSpan dynamicSpan = tracerAPI + .buildSpan("dynamic-instrumentation", OPERATION_NAME) + .withResourceName(resourceName) + .start(); if (tags != null) { for (String tag : tags) { int idx = tag.indexOf(':'); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java index ba70b3dd75b..2f42f636ffe 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java @@ -86,31 +86,29 @@ public class DebuggerTransformer implements ClassFileTransformer { private static final String CANNOT_FIND_METHOD = "Cannot find method %s::%s%s"; private static final String INSTRUMENTATION_FAILS = "Instrumentation failed for %s: %s"; private static final Pattern COMMA_PATTERN = Pattern.compile(","); - private static final List> PROBE_ORDER = - Arrays.asList( - TriggerProbe.class, - MetricProbe.class, - LogProbe.class, - SpanDecorationProbe.class, - SpanProbe.class); + private static final List> PROBE_ORDER = Arrays.asList( + TriggerProbe.class, + MetricProbe.class, + LogProbe.class, + SpanDecorationProbe.class, + SpanProbe.class); private static final String JAVA_IO_TMPDIR = "java.io.tmpdir"; private static final boolean JAVA_AT_LEAST_25_0_4 = JavaVirtualMachine.isJavaVersionAtLeast(25, 0, 4); private static final boolean JAVA_AT_LEAST_17_0_20 = JavaVirtualMachine.isJavaVersionAtLeast(17, 0, 20); public static Path DUMP_PATH = Paths.get(SystemProperties.get(JAVA_IO_TMPDIR), "debugger"); - private static final String[] SKIPPED_PACKAGES = - new String[] { - "com/datadog/debugger/agent/", - "com/datadog/debugger/codeorigin/", - "com/datadog/debugger/exception/", - "com/datadog/debugger/instrumentation/", - "com/datadog/debugger/probe/", - "com/datadog/debugger/sink/", - "com/datadog/debugger/symbol/", - "com/datadog/debugger/uploader/", - "com/datadog/debugger/util/" - }; + private static final String[] SKIPPED_PACKAGES = new String[] { + "com/datadog/debugger/agent/", + "com/datadog/debugger/codeorigin/", + "com/datadog/debugger/exception/", + "com/datadog/debugger/instrumentation/", + "com/datadog/debugger/probe/", + "com/datadog/debugger/sink/", + "com/datadog/debugger/symbol/", + "com/datadog/debugger/uploader/", + "com/datadog/debugger/util/" + }; private final Config config; private final TransformerDefinitionMatcher definitionMatcher; @@ -228,22 +226,20 @@ private void processITWFiles( continue; } try { - Files.lines(excludePath) - .forEach( - line -> { - if (line.startsWith("#")) { - return; - } - if (line.endsWith("*")) { - prefixes.insert(line.substring(0, line.length() - 1)); - return; - } - if (line.contains("::")) { - methods.add(line); - return; - } - classes.add(line); - }); + Files.lines(excludePath).forEach(line -> { + if (line.startsWith("#")) { + return; + } + if (line.endsWith("*")) { + prefixes.insert(line.substring(0, line.length() - 1)); + return; + } + if (line.contains("::")) { + methods.add(line); + return; + } + classes.add(line); + }); } catch (IOException ex) { LOGGER.warn("Error reading exclude file '{}' for Instrument-The-World: ", fileName, ex); } @@ -266,9 +262,8 @@ public byte[] transform( List definitions = Collections.emptyList(); String fullyQualifiedClassName = classFilePath.replace('/', '.'); try { - definitions = - definitionMatcher.match( - classBeingRedefined, classFilePath, fullyQualifiedClassName, classfileBuffer); + definitions = definitionMatcher.match( + classBeingRedefined, classFilePath, fullyQualifiedClassName, classfileBuffer); if (definitions.isEmpty()) { return null; } @@ -478,12 +473,11 @@ private boolean isMethodIncludedForTransformation( } private void createMethodProbe(MethodInfo methodInfo, List probes) { - LogProbe probe = - LogProbe.builder() - .probeId(RandomUtils.randomUUID().toString(), 0) - .where(methodInfo.getClassNode().name, methodInfo.getMethodNode().name) - .captureSnapshot(false) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(RandomUtils.randomUUID().toString(), 0) + .where(methodInfo.getClassNode().name, methodInfo.getMethodNode().name) + .captureSnapshot(false) + .build(); probe.initSamplers(); probes.add(probe); } @@ -499,12 +493,11 @@ private void createLineProbes(MethodInfo methodInfo, List probe } List lineNumbers = getLineNumbers(methodInfo.getMethodNode()); for (Integer lineNumber : lineNumbers) { - LogProbe probe = - LogProbe.builder() - .probeId(RandomUtils.randomUUID().toString(), 0) - .where(methodInfo.getSourceFileName(), lineNumber) - .captureSnapshot(false) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(RandomUtils.randomUUID().toString(), 0) + .where(methodInfo.getSourceFileName(), lineNumber) + .captureSnapshot(false) + .build(); probes.add(probe); } } @@ -557,25 +550,23 @@ private boolean instrumentationIsAllowed( String fullyQualifiedClassName, List definitions) { if (denyListHelper.isDenied(fullyQualifiedClassName)) { LOGGER.debug("Instrumentation denied for {}", fullyQualifiedClassName); - InstrumentationResult result = - InstrumentationResult.Factory.blocked( - fullyQualifiedClassName, - definitions, - new DiagnosticMessage( - DiagnosticMessage.Kind.WARN, - "Instrumentation denied for " + fullyQualifiedClassName)); + InstrumentationResult result = InstrumentationResult.Factory.blocked( + fullyQualifiedClassName, + definitions, + new DiagnosticMessage( + DiagnosticMessage.Kind.WARN, + "Instrumentation denied for " + fullyQualifiedClassName)); notifyBlockedDefinitions(definitions, result); return false; } if (!allowListHelper.isAllowAll() && !allowListHelper.isAllowed(fullyQualifiedClassName)) { LOGGER.debug("Instrumentation not allowed for {}", fullyQualifiedClassName); - InstrumentationResult result = - InstrumentationResult.Factory.blocked( - fullyQualifiedClassName, - definitions, - new DiagnosticMessage( - DiagnosticMessage.Kind.WARN, - "Instrumentation not allowed for " + fullyQualifiedClassName)); + InstrumentationResult result = InstrumentationResult.Factory.blocked( + fullyQualifiedClassName, + definitions, + new DiagnosticMessage( + DiagnosticMessage.Kind.WARN, + "Instrumentation not allowed for " + fullyQualifiedClassName)); notifyBlockedDefinitions(definitions, result); return false; } @@ -675,7 +666,8 @@ private boolean performInstrumentation( continue; } if (LOGGER.isDebugEnabled()) { - List probeIds = matchingDefs.stream().map(ProbeDefinition::getId).collect(toList()); + List probeIds = + matchingDefs.stream().map(ProbeDefinition::getId).collect(toList()); LOGGER.debug( "Instrumenting method: {}.{}{} for probe ids: {}", fullyQualifiedClassName, @@ -761,11 +753,10 @@ private void notifyBlockedDefinitions( private InstrumentationResult applyInstrumentation( MethodInfo methodInfo, List definitions) { Map> diagnostics = new HashMap<>(); - definitions.forEach( - probeDefinition -> { - probeDefinition.buildLocation(methodInfo); - diagnostics.put(probeDefinition.getProbeId(), new ArrayList<>()); - }); + definitions.forEach(probeDefinition -> { + probeDefinition.buildLocation(methodInfo); + diagnostics.put(probeDefinition.getProbeId(), new ArrayList<>()); + }); InstrumentationResult.Status status = preCheckInstrumentation(diagnostics, methodInfo); if (status != InstrumentationResult.Status.ERROR) { try { @@ -841,12 +832,11 @@ private List filterAndSortDefinitions( processCapturedContextMethodProbes( classFileLines, capturedContextProbes, probeMetadata, toInstrument); // ordering: metric < log < span decoration < span - toInstrument.sort( - (info1, info2) -> { - int idx1 = PROBE_ORDER.indexOf(info1.definition.getClass()); - int idx2 = PROBE_ORDER.indexOf(info2.definition.getClass()); - return Integer.compare(idx1, idx2); - }); + toInstrument.sort((info1, info2) -> { + int idx1 = PROBE_ORDER.indexOf(info1.definition.getClass()); + int idx2 = PROBE_ORDER.indexOf(info2.definition.getClass()); + return Integer.compare(idx1, idx2); + }); return toInstrument; } @@ -1058,25 +1048,24 @@ protected String getCommonSuperClass(String type1, String type2) { // duplicate class definition for name: "okhttp3/RealCall" // for more info see: // https://stackoverflow.com/questions/69563714/linkageerror-attempted-duplicate-class-definition-when-dynamically-instrument - TypePool tpTargetClassLoader = - new TypePool.Default.WithLazyResolution( - TypePool.CacheProvider.Simple.withObjectType(), - AgentStrategies.locationStrategy().classFileLocator(classLoader, null), - TypePool.Default.ReaderMode.FAST); + TypePool tpTargetClassLoader = new TypePool.Default.WithLazyResolution( + TypePool.CacheProvider.Simple.withObjectType(), + AgentStrategies.locationStrategy().classFileLocator(classLoader, null), + TypePool.Default.ReaderMode.FAST); // Introduced the java agent DataDog classloader for resolving types introduced by other // Datadog instrumentation (Tracing, AppSec, Profiling, ...) // Here we assume that the current class is loaded in DataDog classloader - TypePool tpDatadogClassLoader = - new TypePool.Default.WithLazyResolution( - TypePool.CacheProvider.Simple.withObjectType(), - AgentStrategies.locationStrategy() - .classFileLocator(getClass().getClassLoader(), null), - TypePool.Default.ReaderMode.FAST, - tpTargetClassLoader); + TypePool tpDatadogClassLoader = new TypePool.Default.WithLazyResolution( + TypePool.CacheProvider.Simple.withObjectType(), + AgentStrategies.locationStrategy().classFileLocator(getClass().getClassLoader(), null), + TypePool.Default.ReaderMode.FAST, + tpTargetClassLoader); try { - TypeDescription td1 = tpDatadogClassLoader.describe(type1.replace('/', '.')).resolve(); - TypeDescription td2 = tpDatadogClassLoader.describe(type2.replace('/', '.')).resolve(); + TypeDescription td1 = + tpDatadogClassLoader.describe(type1.replace('/', '.')).resolve(); + TypeDescription td2 = + tpDatadogClassLoader.describe(type2.replace('/', '.')).resolve(); TypeDescription common; if (td1.isAssignableFrom(td2)) { common = td1; diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/JsonSnapshotSerializer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/JsonSnapshotSerializer.java index 4acfef797f9..b22997281dc 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/JsonSnapshotSerializer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/JsonSnapshotSerializer.java @@ -13,10 +13,9 @@ /** Serializes snapshots in Json using Moshi */ public class JsonSnapshotSerializer implements DebuggerContext.ValueSerializer { - private static final JsonAdapter ADAPTER = - MoshiHelper.createMoshiSnapshot( - Duration.ofMillis(Config.get().getDynamicInstrumentationCaptureTimeout())) - .adapter(IntakeRequest.class); + private static final JsonAdapter ADAPTER = MoshiHelper.createMoshiSnapshot( + Duration.ofMillis(Config.get().getDynamicInstrumentationCaptureTimeout())) + .adapter(IntakeRequest.class); private static final JsonAdapter VALUE_ADAPTER = new MoshiSnapshotHelper.CapturedValueAdapter(); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java index 11eb2b0554c..d5613603e9c 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/StatsdMetricForwarder.java @@ -19,14 +19,13 @@ public class StatsdMetricForwarder private final ProbeStatusSink probeStatusSink; public StatsdMetricForwarder(Config config, ProbeStatusSink probeStatusSink) { - statsd = - DDAgentStatsDClientManager.statsDClientManager() - .statsDClient( - config.getJmxFetchStatsdHost(), - config.getJmxFetchStatsdPort(), - config.getDogStatsDNamedPipe(), - METRICPROBE_PREFIX, - new String[0]); + statsd = DDAgentStatsDClientManager.statsDClientManager() + .statsDClient( + config.getJmxFetchStatsdHost(), + config.getJmxFetchStatsdPort(), + config.getDogStatsDNamedPipe(), + METRICPROBE_PREFIX, + new String[0]); this.probeStatusSink = probeStatusSink; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ThirdPartyLibraries.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ThirdPartyLibraries.java index 94460055129..16f3c4caffe 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ThirdPartyLibraries.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ThirdPartyLibraries.java @@ -24,30 +24,27 @@ public class ThirdPartyLibraries { private static final JsonAdapter ADAPTER = new Moshi.Builder().build().adapter(InternalConfig.class); private static final String FILE_NAME = "/third_party_libraries.json"; - private static final Set DEFAULT_SHADING_IDENTIFIERS = - new HashSet<>( - Arrays.asList( - "shaded", - "thirdparty", - "dependencies", - "relocated", - "bundled", - "embedded", - "vendor", - "repackaged", - "shadow", - "shim", - "wrapper")); + private static final Set DEFAULT_SHADING_IDENTIFIERS = new HashSet<>(Arrays.asList( + "shaded", + "thirdparty", + "dependencies", + "relocated", + "bundled", + "embedded", + "vendor", + "repackaged", + "shadow", + "shim", + "wrapper")); private ThirdPartyLibraries() {} public Set getThirdPartyLibraries(Config config) { try (InputStream inputStream = this.getClass().getResourceAsStream(FILE_NAME)) { InternalConfig defaults = readConfig(inputStream); - Set excludes = - config.getThirdPartyIncludes().stream() - .filter(s -> !s.isEmpty()) - .collect(Collectors.toSet()); + Set excludes = config.getThirdPartyIncludes().stream() + .filter(s -> !s.isEmpty()) + .collect(Collectors.toSet()); excludes.addAll(defaults.getPrefixes()); return excludes; } catch (Exception e) { diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/TransformerDefinitionMatcher.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/TransformerDefinitionMatcher.java index 64158a27c28..cd6d4ce7214 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/TransformerDefinitionMatcher.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/TransformerDefinitionMatcher.java @@ -62,10 +62,9 @@ private void populateDefinitionFileNamesMap(Collection definiti } fileName = normalizeWindowsToUnixPath(fileName); fileName = fileName.toLowerCase(Locale.ROOT); - Map> targetMap = - fileName.indexOf('/') != -1 - ? definitionsByQualifiedFileNames - : definitionsBySimpleFileNames; + Map> targetMap = fileName.indexOf('/') != -1 + ? definitionsByQualifiedFileNames + : definitionsBySimpleFileNames; targetMap.computeIfAbsent("/" + fileName, key -> new ArrayList<>()).add(definition); } } @@ -109,10 +108,9 @@ private List matchProbeDefinitionsByType( byTypeDefinitions.addAll(definitions); } // fallback to matching on SimpleName (String) - String simpleClassName = - classBeingRedefined != null - ? classBeingRedefined.getSimpleName() - : typeName.substring(typeName.lastIndexOf('.') + 1); // strip the package name + String simpleClassName = classBeingRedefined != null + ? classBeingRedefined.getSimpleName() + : typeName.substring(typeName.lastIndexOf('.') + 1); // strip the package name if (typeName.equals(simpleClassName)) { return byTypeDefinitions; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java index 1cfd654d295..33509a77291 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java @@ -67,12 +67,11 @@ public String captureCodeOrigin(boolean entry) { String fingerprint = Fingerprinter.fingerprint(element); CodeOriginProbe probe = probesByFingerprint.get(fingerprint); if (probe == null) { - Where where = - Where.of( - element.getClassName(), - element.getMethodName(), - null, - String.valueOf(element.getLineNumber())); + Where where = Where.of( + element.getClassName(), + element.getMethodName(), + null, + String.valueOf(element.getLineNumber())); probe = createProbe(fingerprint, entry, where); } return probe.getId(); @@ -94,16 +93,15 @@ public String captureCodeOrigin( public void registerLogProbe(CodeOriginProbe probe) { logProbes.computeIfAbsent( probe.getId(), - key -> - new Builder() - .language(probe.getLanguage()) - .probeId(ProbeId.newId()) - .where(probe.getWhere()) - .evaluateAt(probe.getEvaluateAt()) - .captureSnapshot(true) - .tags("session_id:*") - .snapshotProcessor(new CodeOriginSnapshotConsumer(probe.entrySpanProbe())) - .build()); + key -> new Builder() + .language(probe.getLanguage()) + .probeId(ProbeId.newId()) + .where(probe.getWhere()) + .evaluateAt(probe.getEvaluateAt()) + .captureSnapshot(true) + .tags("session_id:*") + .snapshotProcessor(new CodeOriginSnapshotConsumer(probe.entrySpanProbe())) + .build()); } private CodeOriginProbe createProbe(String fingerPrint, boolean entry, Where where) { @@ -134,12 +132,10 @@ private CodeOriginProbe createProbe(String fingerPrint, boolean entry, Where whe } private StackTraceElement findPlaceInStack() { - return StackWalkerFactory.INSTANCE.walk( - stream -> - stream - .filter(element -> !DebuggerContext.isClassNameExcluded(element.getClassName())) - .findFirst() - .orElse(null)); + return StackWalkerFactory.INSTANCE.walk(stream -> stream + .filter(element -> !DebuggerContext.isClassNameExcluded(element.getClassName())) + .findFirst() + .orElse(null)); } public void installProbes() { diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java index 56ae15c44cc..16744bd8b4c 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java @@ -140,13 +140,11 @@ private void processSnapshotsAndSetTags( if (span.getTag(DD_DEBUG_ERROR_EXCEPTION_ID) != null) { LOGGER.debug("Clear previous frame tags"); // already set for this span, clear the frame tags - span.getTags() - .forEach( - (k, v) -> { - if (k.startsWith(DD_DEBUG_ERROR_PREFIX)) { - span.setTag(k, (String) null); - } - }); + span.getTags().forEach((k, v) -> { + if (k.startsWith(DD_DEBUG_ERROR_PREFIX)) { + span.setTag(k, (String) null); + } + }); } boolean snapshotAssigned = false; List snapshots = state.getSnapshots(); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/ExceptionProbeManager.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/ExceptionProbeManager.java index 45d2b97b7dc..4b2e6a4951c 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/ExceptionProbeManager.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/ExceptionProbeManager.java @@ -101,12 +101,11 @@ public CreationResult createProbesForException( thirdPartyFrames++; continue; } - Where where = - Where.of( - stackTraceElement.getClassName(), - stackTraceElement.getMethodName(), - null, - String.valueOf(stackTraceElement.getLineNumber())); + Where where = Where.of( + stackTraceElement.getClassName(), + stackTraceElement.getMethodName(), + null, + String.valueOf(stackTraceElement.getLineNumber())); ExceptionProbe probe = createMethodProbe(this, where, chainedExceptionIdx); probes.putIfAbsent(probe.getId(), probe); instrumentedFrames++; @@ -150,7 +149,8 @@ boolean shouldCaptureException(String fingerprint, Clock clock) { } public void addSnapshot(Snapshot snapshot) { - Throwable throwable = snapshot.getCaptures().getReturn().getCapturedThrowable().getThrowable(); + Throwable throwable = + snapshot.getCaptures().getReturn().getCapturedThrowable().getThrowable(); if (throwable == null) { LOGGER.debug("Snapshot has no throwable: {}", snapshot.getId()); return; @@ -161,9 +161,8 @@ public void addSnapshot(Snapshot snapshot) { LOGGER.debug("Unable to find root cause of exception: {}", String.valueOf(throwable)); return; } - ThrowableState state = - snapshotsByThrowable.computeIfAbsent( - throwable, key -> new ThrowableState(RandomUtils.randomUUID().toString())); + ThrowableState state = snapshotsByThrowable.computeIfAbsent( + throwable, key -> new ThrowableState(RandomUtils.randomUUID().toString())); snapshot.setExceptionId(state.getExceptionId()); state.addSnapshot(snapshot); } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ASMHelper.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ASMHelper.java index 973fd61d773..21dc1ee7b37 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ASMHelper.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ASMHelper.java @@ -106,13 +106,12 @@ public static void invokeInterface( org.objectweb.asm.Type returnType, org.objectweb.asm.Type... argTypes) { // expected stack: [this, arg_type_1 ... arg_type_N] - insnList.add( - new MethodInsnNode( - Opcodes.INVOKEINTERFACE, - owner.getInternalName(), - name, - getMethodDescriptor(returnType, argTypes), - true)); + insnList.add(new MethodInsnNode( + Opcodes.INVOKEINTERFACE, + owner.getInternalName(), + name, + getMethodDescriptor(returnType, argTypes), + true)); // stack: [ret_type] } @@ -123,13 +122,12 @@ public static void invokeVirtual( org.objectweb.asm.Type returnType, org.objectweb.asm.Type... argTypes) { // expected stack: [this, arg_type_1 ... arg_type_N] - insnList.add( - new MethodInsnNode( - Opcodes.INVOKEVIRTUAL, - owner.getInternalName(), - name, - getMethodDescriptor(returnType, argTypes), - false)); + insnList.add(new MethodInsnNode( + Opcodes.INVOKEVIRTUAL, + owner.getInternalName(), + name, + getMethodDescriptor(returnType, argTypes), + false)); // stack: [ret_type] } @@ -160,13 +158,12 @@ public static void invokeStatic( org.objectweb.asm.Type returnType, org.objectweb.asm.Type... argTypes) { // expected stack: [arg_type_1 ... arg_type_N] - insnList.add( - new MethodInsnNode( - Opcodes.INVOKESTATIC, - owner.getInternalName(), - name, - getMethodDescriptor(returnType, argTypes), - false)); // stack: [ret_type] + insnList.add(new MethodInsnNode( + Opcodes.INVOKESTATIC, + owner.getInternalName(), + name, + getMethodDescriptor(returnType, argTypes), + false)); // stack: [ret_type] } public static void ldc(InsnList insnList, int val) { @@ -182,9 +179,8 @@ public static void ldc(InsnList insnList, Object val) { } public static void getStatic(InsnList insnList, org.objectweb.asm.Type owner, String fieldName) { - insnList.add( - new FieldInsnNode( - Opcodes.GETSTATIC, owner.getInternalName(), fieldName, owner.getDescriptor())); + insnList.add(new FieldInsnNode( + Opcodes.GETSTATIC, owner.getInternalName(), fieldName, owner.getDescriptor())); } public static void getStatic( @@ -192,9 +188,8 @@ public static void getStatic( org.objectweb.asm.Type owner, String fieldName, org.objectweb.asm.Type fieldType) { - insnList.add( - new FieldInsnNode( - Opcodes.GETSTATIC, owner.getInternalName(), fieldName, fieldType.getDescriptor())); + insnList.add(new FieldInsnNode( + Opcodes.GETSTATIC, owner.getInternalName(), fieldName, fieldType.getDescriptor())); } public static Type decodeSignature(String signature) { @@ -202,11 +197,10 @@ public static Type decodeSignature(String signature) { FieldSignatureVisitor fieldSignatureVisitor = new FieldSignatureVisitor(); sigReader.acceptType(fieldSignatureVisitor); org.objectweb.asm.Type mainType = getObjectType(fieldSignatureVisitor.getMainClassName()); - List genericTypes = - fieldSignatureVisitor.genericTypes.stream() - .map(org.objectweb.asm.Type::getObjectType) - .map(Type::new) - .collect(Collectors.toList()); + List genericTypes = fieldSignatureVisitor.genericTypes.stream() + .map(org.objectweb.asm.Type::getObjectType) + .map(Type::new) + .collect(Collectors.toList()); return new Type(mainType, genericTypes); } @@ -225,10 +219,9 @@ public static Class ensureSafeClassLoad( // This is required to make sure we are not loading the class being transformed during // transformation as it will generate a LinkageError with // "attempted duplicate class definition" - throw new IllegalArgumentException( - "Cannot ensure loading class: " - + className - + " safely as current class being transformed is not provided (null)"); + throw new IllegalArgumentException("Cannot ensure loading class: " + + className + + " safely as current class being transformed is not provided (null)"); } if (className.equals(currentClassTransformed)) { throw new IllegalArgumentException( @@ -349,13 +342,12 @@ public static void newInstance(InsnList insnList, org.objectweb.asm.Type type) { public static void invokeConstructor( InsnList insnList, org.objectweb.asm.Type owner, org.objectweb.asm.Type... argTypes) { // expected stack: [instance, arg_type_1 ... arg_type_N] - insnList.add( - new MethodInsnNode( - Opcodes.INVOKESPECIAL, - owner.getInternalName(), - Types.CONSTRUCTOR, - org.objectweb.asm.Type.getMethodDescriptor(org.objectweb.asm.Type.VOID_TYPE, argTypes), - false)); + insnList.add(new MethodInsnNode( + Opcodes.INVOKESPECIAL, + owner.getInternalName(), + Types.CONSTRUCTOR, + org.objectweb.asm.Type.getMethodDescriptor(org.objectweb.asm.Type.VOID_TYPE, argTypes), + false)); // stack: [] } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ByteCodeHelper.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ByteCodeHelper.java index f37e6979a58..3d2b4d174d7 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ByteCodeHelper.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/ByteCodeHelper.java @@ -282,7 +282,8 @@ private static int adjustStackUsageFieldInsn(FieldInsnNode currentInsn) { private static int adjustStackUsageMethodInsn(MethodInsnNode currentInsn) { Type methodType = Type.getType(currentInsn.desc); - int argumentSize = Arrays.stream(methodType.getArgumentTypes()).mapToInt(Type::getSize).sum(); + int argumentSize = + Arrays.stream(methodType.getArgumentTypes()).mapToInt(Type::getSize).sum(); int returnSize = methodType.getReturnType().getSize(); switch (currentInsn.getOpcode()) { case Opcodes.INVOKESTATIC: @@ -302,7 +303,8 @@ private static int adjustStackUsageMethodInsn(MethodInsnNode currentInsn) { private static int adjustStackUsageInvokeDynamicInsn(InvokeDynamicInsnNode currentInsn) { Type methodType = Type.getType(currentInsn.desc); - int argumentSize = Arrays.stream(methodType.getArgumentTypes()).mapToInt(Type::getSize).sum(); + int argumentSize = + Arrays.stream(methodType.getArgumentTypes()).mapToInt(Type::getSize).sum(); int returnSize = methodType.getReturnType().getSize(); // consume arguments // push return value @@ -334,7 +336,7 @@ private static int adjustStackUsageJumpInsn(JumpInsnNode currentInsn) { case Opcodes.JSR: return 1; case Opcodes.GOTO: - // no change + // no change } return 0; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java index 9acb02fe19e..68318932860 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/CapturedContextInstrumenter.java @@ -216,10 +216,9 @@ private int addExceptionLocal(TryCatchBlockNode catchHandler, MethodNode methodN return -1; } int exceptionLocalIdx = ((VarInsnNode) current).var; - Set localNames = - methodNode.localVariables.stream() - .map(localVariableNode -> localVariableNode.name) - .collect(Collectors.toSet()); + Set localNames = methodNode.localVariables.stream() + .map(localVariableNode -> localVariableNode.name) + .collect(Collectors.toSet()); // find next label assume this is the end of the handler while (current != null && current.getType() != AbstractInsnNode.LABEL) { current = current.getNext(); @@ -232,14 +231,13 @@ private int addExceptionLocal(TryCatchBlockNode catchHandler, MethodNode methodN for (int i = 0; i < 100; i++) { String exceptionLocalName = "ex" + i; if (!localNames.contains(exceptionLocalName)) { - methodNode.localVariables.add( - new LocalVariableNode( - exceptionLocalName, - "L" + catchHandler.type + ";", - null, - catchHandler.handler, - end, - exceptionLocalIdx)); + methodNode.localVariables.add(new LocalVariableNode( + exceptionLocalName, + "L" + catchHandler.type + ";", + null, + catchHandler.handler, + end, + exceptionLocalIdx)); return exceptionLocalIdx; } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/InstrumentationResult.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/InstrumentationResult.java index 45b0161984a..93b73c68a07 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/InstrumentationResult.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/InstrumentationResult.java @@ -32,9 +32,8 @@ public static InstrumentationResult blocked(String className) { public static InstrumentationResult blocked( String className, List definitions, DiagnosticMessage... messages) { Map> diagnostics = new HashMap<>(); - definitions.forEach( - probeDefinition -> - diagnostics.put(probeDefinition.getProbeId(), Arrays.asList(messages))); + definitions.forEach(probeDefinition -> + diagnostics.put(probeDefinition.getProbeId(), Arrays.asList(messages))); return new InstrumentationResult(Status.BLOCKED, diagnostics, null, className, null); } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java index 52ad80d8d69..90002723ef9 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Instrumenter.java @@ -195,19 +195,18 @@ protected AbstractInsnNode processInstruction( case Opcodes.FRETURN: case Opcodes.LRETURN: case Opcodes.DRETURN: - case Opcodes.ARETURN: - { - // stack [ret_value] - InsnList beforeReturnInsnList = getBeforeReturnInsnList(node, frames); - if (beforeReturnInsnList != null) { - methodNode.instructions.insertBefore(node, beforeReturnInsnList); - } - AbstractInsnNode prev = node.getPrevious(); - methodNode.instructions.remove(node); - methodNode.instructions.insert( - prev, new JumpInsnNode(Opcodes.GOTO, getReturnHandler(node))); - return prev; + case Opcodes.ARETURN: { + // stack [ret_value] + InsnList beforeReturnInsnList = getBeforeReturnInsnList(node, frames); + if (beforeReturnInsnList != null) { + methodNode.instructions.insertBefore(node, beforeReturnInsnList); } + AbstractInsnNode prev = node.getPrevious(); + methodNode.instructions.remove(node); + methodNode.instructions.insert( + prev, new JumpInsnNode(Opcodes.GOTO, getReturnHandler(node))); + return prev; + } } return node; } @@ -297,9 +296,8 @@ protected InsnList clone(InsnList insnList) { protected void installFinallyBlocks() { for (FinallyBlock finallyBlock : finallyBlocks) { - methodNode.tryCatchBlocks.add( - new TryCatchBlockNode( - finallyBlock.startLabel, finallyBlock.endLabel, finallyBlock.handlerLabel, null)); + methodNode.tryCatchBlocks.add(new TryCatchBlockNode( + finallyBlock.startLabel, finallyBlock.endLabel, finallyBlock.handlerLabel, null)); } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java index 58d2d0e2e9f..5d0b2260fef 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MetricInstrumenter.java @@ -115,21 +115,19 @@ public InstrumentationResult.Status instrument() { } switch (definition.getEvaluateAt()) { case ENTRY: - case DEFAULT: - { - InsnList insnList = wrapTryCatch(callMetric(metricProbe, null)); - methodNode.instructions.insert(methodEnterLabel, insnList); - break; - } - case EXIT: - { - Map> frames = - ASMHelper.computeFrames(classNode.name, methodNode); - processInstructions(frames); - addFinallyHandler(returnHandlerLabel); - installFinallyBlocks(); - break; - } + case DEFAULT: { + InsnList insnList = wrapTryCatch(callMetric(metricProbe, null)); + methodNode.instructions.insert(methodEnterLabel, insnList); + break; + } + case EXIT: { + Map> frames = + ASMHelper.computeFrames(classNode.name, methodNode); + processInstructions(frames); + addFinallyHandler(returnHandlerLabel); + installFinallyBlocks(); + break; + } default: throw new IllegalArgumentException( "Invalid evaluateAt attribute: " + definition.getEvaluateAt()); @@ -168,9 +166,8 @@ private InsnList wrapTryCatch(InsnList insnList) { // stack [] handler.add(new JumpInsnNode(Opcodes.GOTO, endLabel)); methodNode.instructions.add(handler); - methodNode.tryCatchBlocks.add( - new TryCatchBlockNode( - startLabel, endLabel, handlerLabel, Type.getInternalName(Exception.class))); + methodNode.tryCatchBlocks.add(new TryCatchBlockNode( + startLabel, endLabel, handlerLabel, Type.getInternalName(Exception.class))); return insnList; } @@ -218,9 +215,8 @@ protected InsnList getBeforeReturnInsnList( throw new UnsupportedOperationException("Unsupported opcode: " + node.getOpcode()); } int tmpIdx = newVar(size); - InsnList insnList = - wrapTryCatch( - callMetric(metricProbe, node, new ReturnContext(tmpIdx, loadOpCode, returnType))); + InsnList insnList = wrapTryCatch( + callMetric(metricProbe, node, new ReturnContext(tmpIdx, loadOpCode, returnType))); // store return value from the stack to local before wrapped call InsnList prefixInsns = new InsnList(); prefixInsns.add(new VarInsnNode(storeOpCode, tmpIdx)); @@ -288,11 +284,10 @@ private InsnList internalCallMetric( VisitorResult result; Type resultType; try { - result = - metricProbe - .getValue() - .getExpr() - .accept(new MetricValueVisitor(this, nullBranch, targetLocation, returnContext)); + result = metricProbe + .getValue() + .getExpr() + .accept(new MetricValueVisitor(this, nullBranch, targetLocation, returnContext)); } catch (InvalidValueException | UnsupportedOperationException ex) { reportError(ex.getMessage()); return EMPTY_INSN_LIST; @@ -300,14 +295,12 @@ private InsnList internalCallMetric( resultType = result.type.getMainType(); MetricProbe.MetricKind kind = metricProbe.getKind(); if (!kind.isCompatible(resultType)) { - String expectedTypes = - kind.getSupportedTypes().stream() - .map(Type::getClassName) - .collect(Collectors.joining(",")); - reportError( - String.format( - "Incompatible type for expression: %s with expected types: [%s]", - resultType.getClassName(), expectedTypes)); + String expectedTypes = kind.getSupportedTypes().stream() + .map(Type::getClassName) + .collect(Collectors.joining(",")); + reportError(String.format( + "Incompatible type for expression: %s with expected types: [%s]", + resultType.getClassName(), expectedTypes)); return EMPTY_INSN_LIST; } resultType = convertIfRequired(resultType, result.insnList); @@ -633,10 +626,9 @@ public VisitorResult visit(IndexExpression indexExpression) { private VisitorResult buildResultWithElementType(ASMHelper.Type targetType, InsnList insnList) { // assume the first generic type of targetResult is the type of elements - ASMHelper.Type elementType = - targetType.getGenericTypes().isEmpty() - ? ASMHelper.OBJECT_TYPE - : targetType.getGenericTypes().get(0); + ASMHelper.Type elementType = targetType.getGenericTypes().isEmpty() + ? ASMHelper.OBJECT_TYPE + : targetType.getGenericTypes().get(0); insnList.add( new TypeInsnNode(Opcodes.CHECKCAST, elementType.getMainType().getInternalName())); return new VisitorResult(elementType, insnList); @@ -672,8 +664,8 @@ public VisitorResult visit(NumericValue numericValue) { ldc(insnList, number.longValue()); return new VisitorResult(ASMHelper.LONG_TYPE, insnList); } - throw new InvalidValueException( - "Unsupported constant value: " + number + " type: " + number.getClass().getTypeName()); + throw new InvalidValueException("Unsupported constant value: " + number + " type: " + + number.getClass().getTypeName()); } @Override @@ -771,10 +763,9 @@ private ASMHelper.Type tryRetrieveField( boolean isAccessible = true; if (currentType.getInternalName().equals(instrumentor.classNode.name)) { // this className = instrumentor.classNode.name; - List fieldList = - instrumentor.isStatic - ? new ArrayList<>() - : new ArrayList<>(instrumentor.classNode.fields); + List fieldList = instrumentor.isStatic + ? new ArrayList<>() + : new ArrayList<>(instrumentor.classNode.fields); for (FieldNode fieldNode : fieldList) { if (fieldNode.name.equals(fieldName)) { if (isStaticField(fieldNode)) { @@ -795,9 +786,8 @@ private ASMHelper.Type tryRetrieveField( } } else { className = currentType.getClassName(); - clazz = - ensureSafeClassLoad( - className, getClassName(instrumentor.classNode.name), instrumentor.classLoader); + clazz = ensureSafeClassLoad( + className, getClassName(instrumentor.classNode.name), instrumentor.classLoader); Field declaredField = clazz.getDeclaredField(fieldName); // no parent fields! isAccessible = declaredField.isAccessible(); fieldDesc = Type.getDescriptor(declaredField.getType()); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Types.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Types.java index c9f42e4d4b9..3447c1794e5 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Types.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/Types.java @@ -241,38 +241,30 @@ public static Type getFrameItemType(Object frameItem) { } int frameItemKind = (int) frameItem; switch (frameItemKind) { - case Opcodes.T_BYTE: - { - return Type.BYTE_TYPE; - } - case Opcodes.T_BOOLEAN: - { - return Type.BOOLEAN_TYPE; - } - case Opcodes.T_CHAR: - { - return Type.CHAR_TYPE; - } - case Opcodes.T_DOUBLE: - { - return Type.DOUBLE_TYPE; - } - case Opcodes.T_FLOAT: - { - return Type.FLOAT_TYPE; - } - case Opcodes.T_INT: - { - return Type.INT_TYPE; - } - case Opcodes.T_LONG: - { - return Type.LONG_TYPE; - } - case Opcodes.T_SHORT: - { - return Type.SHORT_TYPE; - } + case Opcodes.T_BYTE: { + return Type.BYTE_TYPE; + } + case Opcodes.T_BOOLEAN: { + return Type.BOOLEAN_TYPE; + } + case Opcodes.T_CHAR: { + return Type.CHAR_TYPE; + } + case Opcodes.T_DOUBLE: { + return Type.DOUBLE_TYPE; + } + case Opcodes.T_FLOAT: { + return Type.FLOAT_TYPE; + } + case Opcodes.T_INT: { + return Type.INT_TYPE; + } + case Opcodes.T_LONG: { + return Type.LONG_TYPE; + } + case Opcodes.T_SHORT: { + return Type.SHORT_TYPE; + } } } else if (frameItem instanceof String) { return Type.getType((String) frameItem); @@ -291,10 +283,9 @@ public static String descriptorFromSignature(String javaSignature) { int leftParen = javaSignature.indexOf('('); int rightParen = javaSignature.indexOf(')'); if (leftParen == -1 || rightParen == -1) { - throw new IllegalArgumentException( - String.format( - "Illegal java signature, missing matching parenthesis: '%s'. Must be of form ' (, ..., )'", - javaSignature)); + throw new IllegalArgumentException(String.format( + "Illegal java signature, missing matching parenthesis: '%s'. Must be of form ' (, ..., )'", + javaSignature)); } StringBuilder buf = new StringBuilder(); @@ -304,18 +295,16 @@ public static String descriptorFromSignature(String javaSignature) { String args = javaSignature.substring(leftParen + 1, rightParen).trim(); StringTokenizer st = new StringTokenizer(args, ","); if (!st.hasMoreTokens() && !args.isEmpty()) { - throw new IllegalArgumentException( - String.format( - "Illegal java signature, invalid argument format: '%s'. Must be of form ' (, ..., )'", - javaSignature)); + throw new IllegalArgumentException(String.format( + "Illegal java signature, invalid argument format: '%s'. Must be of form ' (, ..., )'", + javaSignature)); } while (st.hasMoreTokens()) { String arg = st.nextToken().trim(); if (arg.length() == 0) { - throw new IllegalArgumentException( - String.format( - "Illegal java signature, empty argument: '%s'. Must be of form ' (, ..., )'", - javaSignature)); + throw new IllegalArgumentException(String.format( + "Illegal java signature, empty argument: '%s'. Must be of form ' (, ..., )'", + javaSignature)); } descriptor = PRIMITIVE_TYPES.get(arg); if (descriptor == null) { @@ -327,10 +316,9 @@ public static String descriptorFromSignature(String javaSignature) { String returnType = javaSignature.substring(0, leftParen).trim(); if (returnType.length() == 0) { - throw new IllegalArgumentException( - String.format( - "Illegal java signature: '%s'. Must be of form ' (, ..., )'", - javaSignature)); + throw new IllegalArgumentException(String.format( + "Illegal java signature: '%s'. Must be of form ' (, ..., )'", + javaSignature)); } descriptor = PRIMITIVE_TYPES.get(returnType); if (descriptor == null) { diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/LogProbe.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/LogProbe.java index b85f38401f2..24d3f0428af 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/LogProbe.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/LogProbe.java @@ -300,15 +300,8 @@ public Capture getCapture() { @Generated @Override public String toString() { - return "CaptureExpression{" - + "name='" - + name - + '\'' - + ", expr=" - + expr - + ", capture=" - + capture - + '}'; + return "CaptureExpression{" + "name='" + name + '\'' + ", expr=" + expr + ", capture=" + + capture + '}'; } } @@ -464,12 +457,11 @@ public Sampling getSampling() { } public void initSamplers() { - double rate = - sampling != null - ? sampling.getEventsPerSecond() - : (isFullSnapshot() - ? ProbeRateLimiter.DEFAULT_SNAPSHOT_RATE - : ProbeRateLimiter.DEFAULT_LOG_RATE); + double rate = sampling != null + ? sampling.getEventsPerSecond() + : (isFullSnapshot() + ? ProbeRateLimiter.DEFAULT_SNAPSHOT_RATE + : ProbeRateLimiter.DEFAULT_LOG_RATE); sampler = ProbeRateLimiter.createSampler(rate); errorSampler = ProbeRateLimiter.createSampler(1.0); // errors are always sampled at 1/s rate } @@ -545,9 +537,8 @@ public void evaluate( logStatus.setCondition(evaluateCondition(context, logStatus)); CapturedContext.CapturedThrowable throwable = context.getCapturedThrowable(); if (logStatus.hasConditionErrors() && throwable != null) { - logStatus.addError( - new EvaluationError( - "uncaught exception", throwable.getType() + ": " + throwable.getMessage())); + logStatus.addError(new EvaluationError( + "uncaught exception", throwable.getType() + ": " + throwable.getMessage())); } if (hasCondition() && (logStatus.getCondition() || logStatus.hasConditionErrors())) { // sample if probe has condition and condition is true or has error @@ -585,9 +576,8 @@ private void sample(LogStatus logStatus, MethodLocation methodLocation) { // at 1/s rate instead of the log template one Sampler localSampler = logStatus.hasConditionErrors && !isFullSnapshot() ? errorSampler : sampler; - boolean sampled = - !logStatus.getDebugSessionStatus().isDisabled() - && ProbeRateLimiter.tryProbe(localSampler, isFullSnapshot()); + boolean sampled = !logStatus.getDebugSessionStatus().isDisabled() + && ProbeRateLimiter.tryProbe(localSampler, isFullSnapshot()); logStatus.setSampled(sampled); if (!sampled && !logStatus.getDebugSessionStatus().isDisabled()) { DebuggerAgent.getSink().skipSnapshot(id, RATE_LIMIT); @@ -701,7 +691,8 @@ private void assignCaptures( private void addContextWithoutCaptureExpressions( CapturedContext context, Consumer setContext) { // no capture expressions, assign directly the context in the snapshot - if (context.getCaptureExpressions() == null || context.getCaptureExpressions().isEmpty()) { + if (context.getCaptureExpressions() == null + || context.getCaptureExpressions().isEmpty()) { setContext.accept(context); return; } @@ -740,30 +731,27 @@ private void processCaptureExpressions(CapturedContext context, LogStatus logSta throw new EvaluationException("UNDEFINED", captureExpression.getExpr().getDsl()); } if (result.isNull()) { - context.addCaptureExpression( - CapturedContext.CapturedValue.of( - captureExpression.getName(), Object.class.getTypeName(), null)); + context.addCaptureExpression(CapturedContext.CapturedValue.of( + captureExpression.getName(), Object.class.getTypeName(), null)); } else { if (captureExpression.capture != null) { - context.addCaptureExpression( - Value.toCapturedSnapshot( - captureExpression.getName(), - result, - captureExpression.capture.maxReferenceDepth, - captureExpression.capture.maxCollectionSize, - captureExpression.capture.maxLength, - captureExpression.capture.maxFieldCount)); + context.addCaptureExpression(Value.toCapturedSnapshot( + captureExpression.getName(), + result, + captureExpression.capture.maxReferenceDepth, + captureExpression.capture.maxCollectionSize, + captureExpression.capture.maxLength, + captureExpression.capture.maxFieldCount)); } else { // inherit from probe capture field because no specific capture if (capture != null) { - context.addCaptureExpression( - Value.toCapturedSnapshot( - captureExpression.getName(), - result, - capture.maxReferenceDepth, - capture.maxCollectionSize, - capture.maxLength, - capture.maxFieldCount)); + context.addCaptureExpression(Value.toCapturedSnapshot( + captureExpression.getName(), + result, + capture.maxReferenceDepth, + capture.maxCollectionSize, + capture.maxLength, + capture.maxFieldCount)); } else { context.addCaptureExpression( Value.toCapturedSnapshot(captureExpression.getName(), result)); @@ -1069,20 +1057,19 @@ public boolean equals(Object o) { @Generated @Override public int hashCode() { - int result = - Objects.hash( - language, - id, - version, - tagMap, - where, - evaluateAt, - template, - segments, - captureSnapshot, - probeCondition, - capture, - sampling); + int result = Objects.hash( + language, + id, + version, + tagMap, + where, + evaluateAt, + template, + segments, + captureSnapshot, + probeCondition, + capture, + sampling); result = 31 * result + Arrays.hashCode(tags); return result; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinition.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinition.java index 707ea9ee0de..ee6b088b4d7 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinition.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinition.java @@ -216,24 +216,22 @@ public T where(String sourceFile, int line) { } public T where(String sourceFile, int lineFrom, int lineTill) { - return where( - new Where( - null, - null, - null, - new Where.SourceLine[] {new Where.SourceLine(lineFrom, lineTill)}, - sourceFile)); + return where(new Where( + null, + null, + null, + new Where.SourceLine[] {new Where.SourceLine(lineFrom, lineTill)}, + sourceFile)); } public T where( String typeName, String methodName, String signature, int codeLine, String source) { - return where( - new Where( - typeName, - methodName, - signature, - new Where.SourceLine[] {new Where.SourceLine(codeLine)}, - source)); + return where(new Where( + typeName, + methodName, + signature, + new Where.SourceLine[] {new Where.SourceLine(codeLine)}, + source)); } public T where( @@ -243,13 +241,12 @@ public T where( int codeLineFrom, int codeLineTill, String source) { - return where( - new Where( - typeName, - methodName, - signature, - new Where.SourceLine[] {new Where.SourceLine(codeLineFrom, codeLineTill)}, - source)); + return where(new Where( + typeName, + methodName, + signature, + new Where.SourceLine[] {new Where.SourceLine(codeLineFrom, codeLineTill)}, + source)); } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/SpanDecorationProbe.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/SpanDecorationProbe.java index 942f1265a49..4b2eb71615f 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/SpanDecorationProbe.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/SpanDecorationProbe.java @@ -259,7 +259,8 @@ public void evaluate( } else { spanStatus.addTag(tagName, tagValue); } - spanStatus.addTag(String.format(PROBEID_DD_TAGS_FORMAT, tagName), getProbeId().getId()); + spanStatus.addTag( + String.format(PROBEID_DD_TAGS_FORMAT, tagName), getProbeId().getId()); } } } @@ -273,10 +274,9 @@ public void commit( CapturedContext entryContext, CapturedContext exitContext, List caughtExceptions) { - CapturedContext.Status status = - evaluateAt == MethodLocation.EXIT - ? exitContext.getStatus(probeId.getEncodedId()) - : entryContext.getStatus(probeId.getEncodedId()); + CapturedContext.Status status = evaluateAt == MethodLocation.EXIT + ? exitContext.getStatus(probeId.getEncodedId()) + : entryContext.getStatus(probeId.getEncodedId()); if (status == null) { return; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java index 72787c61e6e..c921316395e 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java @@ -194,10 +194,9 @@ private static String removeFQN(String targetSignature) { String result = targetSignature; for (String className : classes) { Pattern classNamePattern = Pattern.compile("L" + escapeClassName(className) + ";"); - result = - classNamePattern - .matcher(result) - .replaceAll("L" + escapeClassName(simplify(className)) + ";"); + result = classNamePattern + .matcher(result) + .replaceAll("L" + escapeClassName(simplify(className)) + ";"); } return result; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/DebuggerSink.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/DebuggerSink.java index 4ad1390b00e..03c2a37bb7c 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/DebuggerSink.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/DebuggerSink.java @@ -73,16 +73,14 @@ public DebuggerSink( public void start() { if (uploadFlushInterval == 0) { - flushIntervalScheduled = - lowRateScheduler.scheduleAtFixedRate( - this::reconsiderLowRateFlushInterval, this, 0, 200, TimeUnit.MILLISECONDS); + flushIntervalScheduled = lowRateScheduler.scheduleAtFixedRate( + this::reconsiderLowRateFlushInterval, this, 0, 200, TimeUnit.MILLISECONDS); } else { currentLowRateFlushInterval = uploadFlushInterval; } LOGGER.debug("Scheduling low rate debugger sink flush to {}ms", currentLowRateFlushInterval); - lowRateScheduled = - lowRateScheduler.scheduleAtFixedRate( - this::lowRateFlush, this, 0, currentLowRateFlushInterval, TimeUnit.MILLISECONDS); + lowRateScheduled = lowRateScheduler.scheduleAtFixedRate( + this::lowRateFlush, this, 0, currentLowRateFlushInterval, TimeUnit.MILLISECONDS); snapshotSink.start(); } @@ -142,13 +140,12 @@ ProbeStatusSink getProbeDiagnosticsSink() { private void lowRateReschedule() { cancelSchedule(this.lowRateScheduled); LOGGER.debug("Rescheduling low rate debugger sink flush to {}ms", currentLowRateFlushInterval); - this.lowRateScheduled = - lowRateScheduler.scheduleAtFixedRate( - this::lowRateFlush, - this, - currentLowRateFlushInterval, - currentLowRateFlushInterval, - TimeUnit.MILLISECONDS); + this.lowRateScheduled = lowRateScheduler.scheduleAtFixedRate( + this::lowRateFlush, + this, + currentLowRateFlushInterval, + currentLowRateFlushInterval, + TimeUnit.MILLISECONDS); } @VisibleForTesting diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SnapshotSink.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SnapshotSink.java index 694d92112c1..5a0b9b3eb1e 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SnapshotSink.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SnapshotSink.java @@ -66,9 +66,8 @@ public SnapshotSink( public void start() { if (started.compareAndSet(false, true)) { - highRateScheduled = - highRateScheduler.scheduleAtFixedRate( - this::highRateFlush, this, 0, currentHighRateFlushInterval, TimeUnit.MILLISECONDS); + highRateScheduled = highRateScheduler.scheduleAtFixedRate( + this::highRateFlush, this, 0, currentHighRateFlushInterval, TimeUnit.MILLISECONDS); } } @@ -159,13 +158,12 @@ private void highRateReschedule() { } LOGGER.debug( "Rescheduling high rate debugger sink flush to {}ms", currentHighRateFlushInterval); - this.highRateScheduled = - highRateScheduler.scheduleAtFixedRate( - this::highRateFlush, - this, - currentHighRateFlushInterval, - currentHighRateFlushInterval, - TimeUnit.MILLISECONDS); + this.highRateScheduled = highRateScheduler.scheduleAtFixedRate( + this::highRateFlush, + this, + currentHighRateFlushInterval, + currentHighRateFlushInterval, + TimeUnit.MILLISECONDS); } private List getSerializedSnapshots(BlockingQueue queue, int localBatchSize) { diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SymbolSink.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SymbolSink.java index ecb064ac251..07722d46c2d 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SymbolSink.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SymbolSink.java @@ -41,19 +41,18 @@ public class SymbolSink { // The upload event message JSON. The "final" field is hard-coded to false: // the Java tracer continuously uploads new code as classes get loaded, so // there is no defined end-of-upload point. - private static final String EVENT_FORMAT = - "{%n" - + "\"ddsource\": \"dd_debugger\",%n" - + "\"service\": \"%s\",%n" - + "\"version\": \"%s\",%n" - + "\"language\": \"java\",%n" - + "\"runtimeId\": \"%s\",%n" - + "\"type\": \"symdb\",%n" - + "\"uploadId\": \"%s\",%n" - + "\"batchNum\": %d,%n" - + "\"final\": false,%n" - + "\"attachmentSize\": %d%n" - + "}"; + private static final String EVENT_FORMAT = "{%n" + + "\"ddsource\": \"dd_debugger\",%n" + + "\"service\": \"%s\",%n" + + "\"version\": \"%s\",%n" + + "\"language\": \"java\",%n" + + "\"runtimeId\": \"%s\",%n" + + "\"type\": \"symdb\",%n" + + "\"uploadId\": \"%s\",%n" + + "\"batchNum\": %d,%n" + + "\"final\": false,%n" + + "\"attachmentSize\": %d%n" + + "}"; static final int MAX_SYMDB_UPLOAD_SIZE = 50 * 1024 * 1024; private final String serviceName; @@ -179,16 +178,15 @@ private void doUpload( } private BatchUploader.MultiPartContent buildEvent(long currentBatch, int attachmentSize) { - byte[] eventContent = - String.format( - EVENT_FORMAT, - serviceName, - version, - runtimeId, - uploadId.toString(), - currentBatch, - attachmentSize) - .getBytes(StandardCharsets.UTF_8); + byte[] eventContent = String.format( + EVENT_FORMAT, + serviceName, + version, + runtimeId, + uploadId.toString(), + currentBatch, + attachmentSize) + .getBytes(StandardCharsets.UTF_8); return new BatchUploader.MultiPartContent( eventContent, "event", "event.json", APPLICATION_JSON); } @@ -242,21 +240,24 @@ private void splitAndSend(List scopesToSerialize) { // split the jar scope in 2 jar scopes with half of the class scopes int half = jarScope.getScopes().size() / 2; List firstHalf = jarScope.getScopes().subList(0, half); - List secondHalf = jarScope.getScopes().subList(half, jarScope.getScopes().size()); + List secondHalf = + jarScope.getScopes().subList(half, jarScope.getScopes().size()); LOGGER.debug( "split jar scope {} in 2 jar scopes: {} and {}", jarScope.getName(), firstHalf.size(), secondHalf.size()); - splitAndSend( - Arrays.asList( - createJarScope(jarScope.getName(), firstHalf), - createJarScope(jarScope.getName(), secondHalf))); + splitAndSend(Arrays.asList( + createJarScope(jarScope.getName(), firstHalf), + createJarScope(jarScope.getName(), secondHalf))); } } private static Scope createJarScope(String jarName, List classScopes) { - return Scope.builder(ScopeType.JAR, jarName, 0, 0).name(jarName).scopes(classScopes).build(); + return Scope.builder(ScopeType.JAR, jarName, 0, 0) + .name(jarName) + .scopes(classScopes) + .build(); } private void updateStats(List scopesToSerialize, long size) { diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/AvroFilter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/AvroFilter.java index 8a7b1130d08..497e2bc8792 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/AvroFilter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/AvroFilter.java @@ -18,12 +18,10 @@ public boolean filterOut(Scope scope) { if (scope.getScopeType() == ScopeType.CLASS && scope.getSymbols() != null && scope.getSymbols().stream() - .anyMatch( - it -> - it.getSymbolType() == SymbolType.STATIC_FIELD - && "SCHEMA$".equals(it.getName()) - && it.getType() != null - && it.getType().contains("org.apache.avro.Schema"))) { + .anyMatch(it -> it.getSymbolType() == SymbolType.STATIC_FIELD + && "SCHEMA$".equals(it.getName()) + && it.getType() != null + && it.getType().contains("org.apache.avro.Schema"))) { return true; } // Otherwise, do not filter. diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/BasicSymDBReport.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/BasicSymDBReport.java index 3bb871a9e6c..12b0fc7a5c6 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/BasicSymDBReport.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/BasicSymDBReport.java @@ -40,17 +40,17 @@ public void addScannedJar(String jarPath) { } public void report() { - int totalClasses = classCountByJar.values().stream().mapToInt(Integer::intValue).sum(); - String content = - String.format( - "SymDB Report: Scanned jar count=%d, Total class count=%d, class count by jar: %s, Scanned jars: %s, Location errors: %s Missing jars: %s IOExceptions: %s", - scannedJars.size(), - totalClasses, - classCountByJar, - scannedJars, - locationErrors, - missingJars, - ioExceptions); + int totalClasses = + classCountByJar.values().stream().mapToInt(Integer::intValue).sum(); + String content = String.format( + "SymDB Report: Scanned jar count=%d, Total class count=%d, class count by jar: %s, Scanned jars: %s, Location errors: %s Missing jars: %s IOExceptions: %s", + scannedJars.size(), + totalClasses, + classCountByJar, + scannedJars, + locationErrors, + missingJars, + ioExceptions); LOGGER.info(content); } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/ProtoFilter.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/ProtoFilter.java index b5b94627122..3081a8c9f78 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/ProtoFilter.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/ProtoFilter.java @@ -48,10 +48,8 @@ private boolean hasProtoDescriptorField(Scope scope) { return scope.getScopeType() == ScopeType.CLASS && scope.getSymbols() != null && scope.getSymbols().stream() - .anyMatch( - it -> - it.getSymbolType() == SymbolType.STATIC_FIELD - && it.getType() != null - && it.getType().contains("com.google.protobuf.Descriptors")); + .anyMatch(it -> it.getSymbolType() == SymbolType.STATIC_FIELD + && it.getType() != null + && it.getType().contains("com.google.protobuf.Descriptors")); } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBEnablement.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBEnablement.java index 1643b1b5b6c..039689e9c8f 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBEnablement.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBEnablement.java @@ -127,12 +127,11 @@ public void startSymbolExtraction() { private void extractSymbolForLoadedClasses(SymDBReport symDBReport) { Class[] classesToExtract; try { - classesToExtract = - Arrays.stream(instrumentation.getAllLoadedClasses()) - // getAllLoadedClasses can return null classes (Class Unloading) - .filter(clazz -> clazz != null && !classNameFilter.isExcluded(clazz.getTypeName())) - .filter(instrumentation::isModifiableClass) - .toArray(Class[]::new); + classesToExtract = Arrays.stream(instrumentation.getAllLoadedClasses()) + // getAllLoadedClasses can return null classes (Class Unloading) + .filter(clazz -> clazz != null && !classNameFilter.isExcluded(clazz.getTypeName())) + .filter(instrumentation::isModifiableClass) + .toArray(Class[]::new); } catch (Throwable ex) { LOGGER.debug("Failed to get all loaded classes", ex); return; diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBReport.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBReport.java index d407acd5726..a8d2f5b2fbd 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBReport.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymDBReport.java @@ -16,24 +16,23 @@ public interface SymDBReport { void report(); - SymDBReport NO_OP = - new SymDBReport() { - @Override - public void addMissingJar(String jarPath) {} + SymDBReport NO_OP = new SymDBReport() { + @Override + public void addMissingJar(String jarPath) {} - @Override - public void addIOException(String jarPath, IOException e) {} + @Override + public void addIOException(String jarPath, IOException e) {} - @Override - public void addLocationError(String locationStr) {} + @Override + public void addLocationError(String locationStr) {} - @Override - public void incClassCount(String jarPath) {} + @Override + public void incClassCount(String jarPath) {} - @Override - public void addScannedJar(String jarPath) {} + @Override + public void addScannedJar(String jarPath) {} - @Override - public void report() {} - }; + @Override + public void report() {} + }; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolAggregator.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolAggregator.java index c88976187bd..16711a0f0ee 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolAggregator.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolAggregator.java @@ -65,12 +65,10 @@ public SymbolAggregator( } public void start() { - flushRemainingScopeScheduled = - AgentTaskScheduler.get() - .scheduleAtFixedRate(this::flushRemainingScopes, this, 0, 1, TimeUnit.SECONDS); - scanJarsScheduled = - AgentTaskScheduler.get() - .scheduleAtFixedRate(this::scanQueuedJars, this, 0, 1, TimeUnit.SECONDS); + flushRemainingScopeScheduled = AgentTaskScheduler.get() + .scheduleAtFixedRate(this::flushRemainingScopes, this, 0, 1, TimeUnit.SECONDS); + scanJarsScheduled = AgentTaskScheduler.get() + .scheduleAtFixedRate(this::scanQueuedJars, this, 0, 1, TimeUnit.SECONDS); } public void stop() { @@ -211,10 +209,8 @@ public void scanJar( try (JarFile jarFile = openJarFile(jarPathFile)) { jarFile.stream() .filter(jarEntry -> jarEntry.getName().endsWith(".class")) - .filter( - jarEntry -> - !classNameFilter.isExcluded( - Strings.getClassName(trimPrefixes(jarEntry.getName())))) + .filter(jarEntry -> !classNameFilter.isExcluded( + Strings.getClassName(trimPrefixes(jarEntry.getName())))) .forEach( jarEntry -> parseJarEntry(symDBReport, jarEntry, jarFile, jarPath, baos, buffer)); } @@ -243,10 +239,8 @@ private void scanDirectory( // explicitly no follow links walking the directory to avoid cycles .filter(path -> Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS)) .filter(path -> path.toString().endsWith(".class")) - .filter( - path -> - !classNameFilter.isExcluded( - Strings.getClassName(trimPrefixes(jarPath.relativize(path).toString())))) + .filter(path -> !classNameFilter.isExcluded( + Strings.getClassName(trimPrefixes(jarPath.relativize(path).toString())))) .forEach(path -> parseFileEntry(symDBReport, path, jarPath, baos, buffer)); alreadyScannedJars.add(jarPath.toString()); } catch (IOException e) { diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolExtractor.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolExtractor.java index d705ffc0175..d2d7fa8f29e 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolExtractor.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/symbol/SymbolExtractor.java @@ -65,20 +65,18 @@ private static Scope extractScopes(ClassNode classNode, String jarName) { } } List fields = extractFields(classNode); - LanguageSpecifics classSpecifics = - new LanguageSpecifics.Builder() - .addModifiers(extractClassModifiers(classNode.access)) - .addInterfaces(extractInterfaces(classNode)) - .addAnnotations(extractAnnotations(classNode.visibleAnnotations)) - .superClass(ASMHelper.extractSuperClass(classNode)) - .build(); - Scope classScope = - Scope.builder(ScopeType.CLASS, sourceFile, classStartLine, classEndLine) - .name(Strings.getClassName(classNode.name)) - .scopes(methodScopes) - .symbols(fields) - .languageSpecifics(classSpecifics) - .build(); + LanguageSpecifics classSpecifics = new LanguageSpecifics.Builder() + .addModifiers(extractClassModifiers(classNode.access)) + .addInterfaces(extractInterfaces(classNode)) + .addAnnotations(extractAnnotations(classNode.visibleAnnotations)) + .superClass(ASMHelper.extractSuperClass(classNode)) + .build(); + Scope classScope = Scope.builder(ScopeType.CLASS, sourceFile, classStartLine, classEndLine) + .name(Strings.getClassName(classNode.name)) + .scopes(methodScopes) + .symbols(fields) + .languageSpecifics(classSpecifics) + .build(); return Scope.builder(ScopeType.JAR, jarName, 0, 0) .name(jarName) .scopes(new ArrayList<>(Collections.singletonList(classScope))) @@ -102,18 +100,16 @@ private static List extractFields(ClassNode classNode) { for (FieldNode fieldNode : classNode.fields) { SymbolType symbolType = ASMHelper.isStaticField(fieldNode) ? SymbolType.STATIC_FIELD : SymbolType.FIELD; - LanguageSpecifics fieldSpecifics = - new LanguageSpecifics.Builder() - .addModifiers(extractFieldModifiers(fieldNode.access)) - .addAnnotations(extractAnnotations(fieldNode.visibleAnnotations)) - .build(); - fields.add( - new Symbol( - symbolType, - fieldNode.name, - 0, - Type.getType(fieldNode.desc).getClassName(), - fieldSpecifics)); + LanguageSpecifics fieldSpecifics = new LanguageSpecifics.Builder() + .addModifiers(extractFieldModifiers(fieldNode.access)) + .addAnnotations(extractAnnotations(fieldNode.visibleAnnotations)) + .build(); + fields.add(new Symbol( + symbolType, + fieldNode.name, + 0, + Type.getType(fieldNode.desc).getClassName(), + fieldSpecifics)); } return fields; } @@ -132,21 +128,20 @@ private static List extractMethods( if (method.name.startsWith("lambda$")) { methodScopeType = ScopeType.CLOSURE; } - LanguageSpecifics methodSpecifics = - new LanguageSpecifics.Builder() - .addModifiers(extractMethodModifiers(classNode, method, method.access)) - .addAnnotations(extractAnnotations(method.visibleAnnotations)) - .returnType(Type.getType(method.desc).getReturnType().getClassName()) - .build(); - Scope methodScope = - Scope.builder(methodScopeType, sourceFile, methodLineInfo.start, methodLineInfo.end) - .name(method.name) - .scopes(varScopes) - .symbols(methodSymbols) - .hasInjectibleLines(!methodLineInfo.ranges.isEmpty()) - .injectibleLines(methodLineInfo.ranges) - .languageSpecifics(methodSpecifics) - .build(); + LanguageSpecifics methodSpecifics = new LanguageSpecifics.Builder() + .addModifiers(extractMethodModifiers(classNode, method, method.access)) + .addAnnotations(extractAnnotations(method.visibleAnnotations)) + .returnType(Type.getType(method.desc).getReturnType().getClassName()) + .build(); + Scope methodScope = Scope.builder( + methodScopeType, sourceFile, methodLineInfo.start, methodLineInfo.end) + .name(method.name) + .scopes(varScopes) + .symbols(methodSymbols) + .hasInjectibleLines(!methodLineInfo.ranges.isEmpty()) + .injectibleLines(methodLineInfo.ranges) + .languageSpecifics(methodSpecifics) + .build(); methodScopes.add(methodScope); } return methodScopes; @@ -399,20 +394,18 @@ private static void extractScopesFromVariables( continue; } minLine = Math.min(line, minLine); - varSymbols.add( - new Symbol( - SymbolType.LOCAL, var.name, line, Type.getType(var.desc).getClassName(), null)); + varSymbols.add(new Symbol( + SymbolType.LOCAL, var.name, line, Type.getType(var.desc).getClassName(), null)); } Integer endLine = monotonicLineMap.get(entry.getKey().getLabel()); if (endLine == null) { LOGGER.debug("Cannot find the line from end label"); continue; } - Scope varScope = - Scope.builder(ScopeType.LOCAL, sourceFile, minLine, endLine) - .symbols(varSymbols) - .scopes(new ArrayList<>()) - .build(); + Scope varScope = Scope.builder(ScopeType.LOCAL, sourceFile, minLine, endLine) + .symbols(varSymbols) + .scopes(new ArrayList<>()) + .build(); tmpScopes.add(varScope); } nestScopes(varScopes, tmpScopes); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/uploader/BatchUploader.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/uploader/BatchUploader.java index 993d8194668..501b163369b 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/uploader/BatchUploader.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/uploader/BatchUploader.java @@ -144,30 +144,28 @@ public BatchUploader(String name, Config config, String endpoint, RetryPolicy re apiKey = config.getApiKey(); this.ratelimitedLogger = ratelimitedLogger; // This is the same thing OkHttp Dispatcher is doing except thread naming and daemonization - okHttpExecutorService = - new ThreadPoolExecutor( - 0, - Integer.MAX_VALUE, - 60, - TimeUnit.SECONDS, - new SynchronousQueue<>(), - new AgentThreadFactory(DEBUGGER_HTTP_DISPATCHER)); + okHttpExecutorService = new ThreadPoolExecutor( + 0, + Integer.MAX_VALUE, + 60, + TimeUnit.SECONDS, + new SynchronousQueue<>(), + new AgentThreadFactory(DEBUGGER_HTTP_DISPATCHER)); this.retryPolicy = retryPolicy; this.containerId = containerId; this.entityId = entityId; Duration requestTimeout = Duration.ofSeconds(config.getDynamicInstrumentationUploadTimeout()); - client = - OkHttpUtils.buildHttpClient( - config, - new Dispatcher(okHttpExecutorService), - urlBase, - true, /* retry */ - MAX_RUNNING_REQUESTS, - null, /* proxyHost */ - null, /* proxyPort */ - null, /* proxyUsername */ - null, /* proxyPassword */ - requestTimeout.toMillis()); + client = OkHttpUtils.buildHttpClient( + config, + new Dispatcher(okHttpExecutorService), + urlBase, + true, /* retry */ + MAX_RUNNING_REQUESTS, + null, /* proxyHost */ + null, /* proxyPort */ + null, /* proxyUsername */ + null, /* proxyPassword */ + requestTimeout.toMillis()); responseCallback = new ResponseCallback(name, ratelimitedLogger, inflightRequests, client, retryPolicy); debuggerMetrics = DebuggerMetrics.getInstance(config); @@ -273,7 +271,8 @@ private void buildAndSendRequest(RequestBody body, int contentLength, String tag requestBuilder.addHeader(HEADER_DD_ENTITY_ID, entityId); } Request request = requestBuilder.build(); - LOGGER.debug("[{}] Sending request: {} CT: {}", name, request, request.body().contentType()); + LOGGER.debug( + "[{}] Sending request: {} CT: {}", name, request, request.body().contentType()); enqueueCall(client, request, responseCallback, retryPolicy, 0, inflightRequests); } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/ClassNameFiltering.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/ClassNameFiltering.java index 2fe3681b12a..394360fdd89 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/ClassNameFiltering.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/ClassNameFiltering.java @@ -50,7 +50,8 @@ public boolean isExcluded(String className) { } static boolean isLambdaProxyClass(String className) { - return className.contains("Lambda") && LAMBDA_PROXY_CLASS_PATTERN.matcher(className).matches(); + return className.contains("Lambda") + && LAMBDA_PROXY_CLASS_PATTERN.matcher(className).matches(); } int shadedIndexOf(String className) { diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java index 098c183c849..5e36a6c45b9 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/DebuggerMetrics.java @@ -17,14 +17,13 @@ public class DebuggerMetrics implements StatsDClient { private DebuggerMetrics(Config config) { if (config.isDynamicInstrumentationMetricsEnabled()) { - statsd = - DDAgentStatsDClientManager.statsDClientManager() - .statsDClient( - config.getJmxFetchStatsdHost(), - config.getJmxFetchStatsdPort(), - config.getDogStatsDNamedPipe(), - STATSD_NAMESPACE_PREFIX, - new String[0]); + statsd = DDAgentStatsDClientManager.statsDClientManager() + .statsDClient( + config.getJmxFetchStatsdHost(), + config.getJmxFetchStatsdPort(), + config.getDogStatsDNamedPipe(), + STATSD_NAMESPACE_PREFIX, + new String[0]); } else { statsd = StatsDClient.NO_OP; } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiHelper.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiHelper.java index 94d11367ce3..663563406a4 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiHelper.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiHelper.java @@ -56,6 +56,8 @@ public static Moshi createMoshiSymbol() { } public static Moshi createMoshiWatches() { - return new Moshi.Builder().add(ValueScript.class, new ValueScript.ValueScriptAdapter()).build(); + return new Moshi.Builder() + .add(ValueScript.class, new ValueScript.ValueScriptAdapter()) + .build(); } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiSnapshotHelper.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiSnapshotHelper.java index 5bbb2d05ca3..b5441ff59ba 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiSnapshotHelper.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/MoshiSnapshotHelper.java @@ -104,12 +104,10 @@ public CapturesAdapter( Moshi moshi, Duration captureTimeout, JsonAdapter capturedContextAdapter) { this.capturedContextAdapter = capturedContextAdapter; this.captureTimeOut = captureTimeout; - linesAdapter = - moshi.adapter( - Types.newParameterizedType(Map.class, Integer.class, CapturedContext.class)); - caughtExceptionsAdapter = - moshi.adapter( - Types.newParameterizedType(List.class, CapturedContext.CapturedThrowable.class)); + linesAdapter = moshi.adapter( + Types.newParameterizedType(Map.class, Integer.class, CapturedContext.class)); + caughtExceptionsAdapter = moshi.adapter( + Types.newParameterizedType(List.class, CapturedContext.CapturedThrowable.class)); } @Override @@ -176,12 +174,11 @@ public void toJson(JsonWriter jsonWriter, CapturedContext capturedContext) throw // only capture expressions are serialized into the snapshot jsonWriter.name(CAPTURE_EXPRESSIONS); jsonWriter.beginObject(); - SerializationResult resultCaptureExpressions = - toJsonCapturedValues( - jsonWriter, - capturedContext.getCaptureExpressions(), - capturedContext.getLimits(), - timeoutChecker); + SerializationResult resultCaptureExpressions = toJsonCapturedValues( + jsonWriter, + capturedContext.getCaptureExpressions(), + capturedContext.getLimits(), + timeoutChecker); jsonWriter.endObject(); // captureExpressions handleSerializationResult(jsonWriter, resultCaptureExpressions); jsonWriter.endObject(); @@ -189,27 +186,21 @@ public void toJson(JsonWriter jsonWriter, CapturedContext capturedContext) throw } jsonWriter.name(ARGUMENTS); jsonWriter.beginObject(); - SerializationResult resultArgs = - toJsonCapturedValues( - jsonWriter, - capturedContext.getArguments(), - capturedContext.getLimits(), - timeoutChecker); + SerializationResult resultArgs = toJsonCapturedValues( + jsonWriter, capturedContext.getArguments(), capturedContext.getLimits(), timeoutChecker); jsonWriter.endObject(); // ARGUMENTS jsonWriter.name(LOCALS); jsonWriter.beginObject(); - SerializationResult resultLocals = - toJsonCapturedValues( - jsonWriter, capturedContext.getLocals(), capturedContext.getLimits(), timeoutChecker); + SerializationResult resultLocals = toJsonCapturedValues( + jsonWriter, capturedContext.getLocals(), capturedContext.getLimits(), timeoutChecker); jsonWriter.endObject(); // LOCALS jsonWriter.name(STATIC_FIELDS); jsonWriter.beginObject(); - SerializationResult resultStaticFields = - toJsonCapturedValues( - jsonWriter, - capturedContext.getStaticFields(), - capturedContext.getLimits(), - timeoutChecker); + SerializationResult resultStaticFields = toJsonCapturedValues( + jsonWriter, + capturedContext.getStaticFields(), + capturedContext.getLimits(), + timeoutChecker); jsonWriter.endObject(); handleSerializationResult(jsonWriter, resultLocals, resultArgs, resultStaticFields); jsonWriter.name(THROWABLE); @@ -225,24 +216,22 @@ private void handleSerializationResult(JsonWriter jsonWriter, SerializationResul switch (result) { case OK: break; - case FIELD_COUNT: - { - if (!fieldCountReported) { - jsonWriter.name(NOT_CAPTURED_REASON); - jsonWriter.value(FIELD_COUNT_REASON); - fieldCountReported = true; - } - break; + case FIELD_COUNT: { + if (!fieldCountReported) { + jsonWriter.name(NOT_CAPTURED_REASON); + jsonWriter.value(FIELD_COUNT_REASON); + fieldCountReported = true; } - case TIMEOUT: - { - if (!timeoutReported) { - jsonWriter.name(NOT_CAPTURED_REASON); - jsonWriter.value(TIMEOUT_REASON); - timeoutReported = true; - } - break; + break; + } + case TIMEOUT: { + if (!timeoutReported) { + jsonWriter.name(NOT_CAPTURED_REASON); + jsonWriter.value(TIMEOUT_REASON); + timeoutReported = true; } + break; + } default: throw new RuntimeException("Unsupported serialization result: " + result); } @@ -277,11 +266,8 @@ private SerializationResult toJsonCapturedValues( } jsonWriter.name(entry.getKey()); CapturedContext.CapturedValue capturedValue = entry.getValue(); - jsonWriter.value( - Okio.buffer( - Okio.source( - new ByteArrayInputStream( - capturedValue.getStrValue().getBytes(StandardCharsets.UTF_8))))); + jsonWriter.value(Okio.buffer(Okio.source(new ByteArrayInputStream( + capturedValue.getStrValue().getBytes(StandardCharsets.UTF_8))))); count++; } return SerializationResult.OK; @@ -495,36 +481,31 @@ public void objectEpilogue(Object value) throws Exception { @Override public void notCaptured(SerializerWithLimits.NotCapturedReason reason) throws Exception { switch (reason) { - case MAX_DEPTH: - { - jsonWriter.name(NOT_CAPTURED_REASON); - jsonWriter.value(DEPTH_REASON); - break; - } - case FIELD_COUNT: - { - jsonWriter.name(NOT_CAPTURED_REASON); - jsonWriter.value(FIELD_COUNT_REASON); - break; - } - case TIMEOUT: - { - jsonWriter.name(NOT_CAPTURED_REASON); - jsonWriter.value(TIMEOUT_REASON); - break; - } - case REDACTED_IDENT: - { - jsonWriter.name(NOT_CAPTURED_REASON); - jsonWriter.value(REDACTED_IDENT_REASON); - break; - } - case REDACTED_TYPE: - { - jsonWriter.name(NOT_CAPTURED_REASON); - jsonWriter.value(REDACTED_TYPE_REASON); - break; - } + case MAX_DEPTH: { + jsonWriter.name(NOT_CAPTURED_REASON); + jsonWriter.value(DEPTH_REASON); + break; + } + case FIELD_COUNT: { + jsonWriter.name(NOT_CAPTURED_REASON); + jsonWriter.value(FIELD_COUNT_REASON); + break; + } + case TIMEOUT: { + jsonWriter.name(NOT_CAPTURED_REASON); + jsonWriter.value(TIMEOUT_REASON); + break; + } + case REDACTED_IDENT: { + jsonWriter.name(NOT_CAPTURED_REASON); + jsonWriter.value(REDACTED_IDENT_REASON); + break; + } + case REDACTED_TYPE: { + jsonWriter.name(NOT_CAPTURED_REASON); + jsonWriter.value(REDACTED_TYPE_REASON); + break; + } default: throw new RuntimeException("Unsupported NotCapturedReason: " + reason); } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/SnapshotPruner.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/SnapshotPruner.java index 216441237b0..baa5bf06359 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/SnapshotPruner.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/SnapshotPruner.java @@ -33,12 +33,11 @@ public static String prune(String snapshot, int maxTargetedSize, int minLevel) { SnapshotPruner snapshotPruner = new SnapshotPruner(snapshot); Collection leaves = snapshotPruner.getLeaves(minLevel); PriorityQueue sortedLeaves = - new PriorityQueue<>( - Comparator.comparing((Node n) -> n.notCapturedDepth) - .thenComparingInt((Node n) -> n.level) - .thenComparing((Node n) -> n.notCaptured) - .thenComparingInt(Node::size) - .reversed()); + new PriorityQueue<>(Comparator.comparing((Node n) -> n.notCapturedDepth) + .thenComparingInt((Node n) -> n.level) + .thenComparing((Node n) -> n.notCaptured) + .thenComparingInt(Node::size) + .reversed()); sortedLeaves.addAll(leaves); int total = 0; Map nodes = new HashMap<>(); @@ -98,43 +97,39 @@ enum State { @Override public State parse(SnapshotPruner pruner, char c, int index) { switch (c) { - case '{': - { - Node n = new Node(index, pruner.currentLevel); - pruner.currentLevel++; - if (!pruner.stack.isEmpty()) { - n.parent = pruner.stack.peekLast(); - n.parent.children.add(n); - } - pruner.stack.addLast(n); - return this; - } - case '}': - { - Node n = pruner.stack.removeLast(); - n.end = index; - pruner.currentLevel--; - if (pruner.stack.isEmpty()) { - pruner.root = n; - return null; - } - return this; + case '{': { + Node n = new Node(index, pruner.currentLevel); + pruner.currentLevel++; + if (!pruner.stack.isEmpty()) { + n.parent = pruner.stack.peekLast(); + n.parent.children.add(n); } - case '"': - { - pruner.strMatchIdx = 0; - pruner.matchingString = NOT_CAPTURED_REASON; - pruner.onStringMatches = - () -> { - Node n = pruner.stack.peekLast(); - if (n == null) { - throw new IllegalStateException("empty stack"); - } - n.notCaptured = true; - return NOT_CAPTURED; - }; - return STRING; + pruner.stack.addLast(n); + return this; + } + case '}': { + Node n = pruner.stack.removeLast(); + n.end = index; + pruner.currentLevel--; + if (pruner.stack.isEmpty()) { + pruner.root = n; + return null; } + return this; + } + case '"': { + pruner.strMatchIdx = 0; + pruner.matchingString = NOT_CAPTURED_REASON; + pruner.onStringMatches = () -> { + Node n = pruner.stack.peekLast(); + if (n == null) { + throw new IllegalStateException("empty stack"); + } + n.notCaptured = true; + return NOT_CAPTURED; + }; + return STRING; + } default: return this; } @@ -144,18 +139,16 @@ public State parse(SnapshotPruner pruner, char c, int index) { @Override public State parse(SnapshotPruner pruner, char c, int index) { switch (c) { - case '"': - { - if (pruner.strMatchIdx == pruner.matchingString.length()) { - return pruner.onStringMatches.get(); - } - return OBJECT; - } - case '\\': - { - pruner.strMatchIdx = -1; - return ESCAPE; + case '"': { + if (pruner.strMatchIdx == pruner.matchingString.length()) { + return pruner.onStringMatches.get(); } + return OBJECT; + } + case '\\': { + pruner.strMatchIdx = -1; + return ESCAPE; + } default: if (pruner.strMatchIdx > -1) { char current = pruner.matchingString.charAt(pruner.strMatchIdx++); @@ -171,21 +164,19 @@ public State parse(SnapshotPruner pruner, char c, int index) { @Override public State parse(SnapshotPruner pruner, char c, int index) { switch (c) { - case '"': - { - pruner.strMatchIdx = 0; - pruner.matchingString = DEPTH; - pruner.onStringMatches = - () -> { - Node n = pruner.stack.peekLast(); - if (n == null) { - throw new IllegalStateException("empty stack"); - } - n.notCapturedDepth = true; - return OBJECT; - }; - return STRING; - } + case '"': { + pruner.strMatchIdx = 0; + pruner.matchingString = DEPTH; + pruner.onStringMatches = () -> { + Node n = pruner.stack.peekLast(); + if (n == null) { + throw new IllegalStateException("empty stack"); + } + n.notCapturedDepth = true; + return OBJECT; + }; + return STRING; + } case ' ': case ':': case '\n': diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java index 5144cc9f7c3..3876ff08c21 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java @@ -173,11 +173,10 @@ public void methodProbeAtExit() throws IOException, URISyntaxException { @Test public void methodProbeAtExitWithCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") - .when(new ProbeCondition(DSL.when(DSL.eq(ref("arg"), DSL.value("1"))), "arg == '1'")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") + .when(new ProbeCondition(DSL.when(DSL.eq(ref("arg"), DSL.value("1"))), "arg == '1'")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -194,10 +193,11 @@ public void methodProbeAtExitWithCondition() throws IOException, URISyntaxExcept public void localVarHoistingNoPreviousStore() throws IOException, URISyntaxException { final String CLASS_NAME = "com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper"; TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "detectEncoding", null); - Class testClass = - loadClass( - CLASS_NAME, - getClass().getResource("/classfiles/ByteSourceJsonBootstrapper.classfile").getFile()); + Class testClass = loadClass( + CLASS_NAME, + getClass() + .getResource("/classfiles/ByteSourceJsonBootstrapper.classfile") + .getFile()); assertNotNull(testClass); } @@ -241,10 +241,9 @@ public void resolutionThrows() throws IOException, URISyntaxException { createMethodProbe(PROBE_ID2, CLASS_NAME, "main", "int (java.lang.String)"); TestSnapshotListener listener = installProbes(lineProbe, methodProbe); DebuggerAgentHelper.injectSink(listener); - DebuggerContext.initProbeResolver( - probeIndex -> { - throw new IllegalArgumentException("oops"); - }); + DebuggerContext.initProbeResolver(probeIndex -> { + throw new IllegalArgumentException("oops"); + }); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(3, result); @@ -274,7 +273,8 @@ public void constructorFirstLine() throws IOException, URISyntaxException { verify(probeStatusSink).addError(probeIdCaptor.capture(), strCaptor.capture()); assertEquals(LINE_PROBE_ID2.getId(), probeIdCaptor.getAllValues().get(0).getId()); assertEquals( - "Cannot instrument the first line of a constructor", strCaptor.getAllValues().get(0)); + "Cannot instrument the first line of a constructor", + strCaptor.getAllValues().get(0)); } @Test @@ -319,9 +319,8 @@ public void veryOldClassFileWithJsrRet() throws Exception { public void oldClass1_1() throws Exception { final String CLASS_NAME = "org.apache.commons.lang.BooleanUtils"; // compiled with jdk 1.1 TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "toBoolean", null); - Class testClass = - loadClass( - CLASS_NAME, getClass().getResource("/classfiles/BooleanUtils.classfile").getFile()); + Class testClass = loadClass( + CLASS_NAME, getClass().getResource("/classfiles/BooleanUtils.classfile").getFile()); boolean result = Reflect.onClass(testClass).call("toBoolean", Boolean.TRUE).get(); assertTrue(result); @@ -397,10 +396,9 @@ public void inheritedConstructor() throws Exception { @Test public void largeStackInheritedConstructor() throws Exception { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot15"; - TestSnapshotListener listener = - installProbes( - createMethodProbe(PROBE_ID1, CLASS_NAME, "", "()"), - createMethodProbe(PROBE_ID2, CLASS_NAME, "", "(String, long, String)")); + TestSnapshotListener listener = installProbes( + createMethodProbe(PROBE_ID1, CLASS_NAME, "", "()"), + createMethodProbe(PROBE_ID2, CLASS_NAME, "", "(String, long, String)")); Class testClass = compileAndLoadClass(CLASS_NAME); long result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(4_000_000_001L, result); @@ -410,10 +408,9 @@ public void largeStackInheritedConstructor() throws Exception { @Test public void multiMethods() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; - TestSnapshotListener listener = - installProbes( - createMethodProbe(PROBE_ID1, CLASS_NAME, "f1", "(int)"), - createMethodProbe(PROBE_ID2, CLASS_NAME, "f2", "(int)")); + TestSnapshotListener listener = installProbes( + createMethodProbe(PROBE_ID1, CLASS_NAME, "f1", "(int)"), + createMethodProbe(PROBE_ID2, CLASS_NAME, "f2", "(int)")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(48, result); @@ -470,10 +467,9 @@ public void insideSynchronizedBlock() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; final int LINE_START = 46; final int LINE_END = 48; - LogProbe logProbe = - createProbeBuilder(PROBE_ID) - .where(CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END) - .build(); + LogProbe logProbe = createProbeBuilder(PROBE_ID) + .where(CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "synchronizedBlock").get(); @@ -498,10 +494,9 @@ public void outsideSynchronizedBlock() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; final int LINE_START = 45; final int LINE_END = 49; - LogProbe logProbe = - createProbeBuilder(PROBE_ID) - .where(CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END) - .build(); + LogProbe logProbe = createProbeBuilder(PROBE_ID) + .where(CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "synchronizedBlock").get(); @@ -555,9 +550,8 @@ public void sourceFileProbeFullPath() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot10"; String DIR_CLASS_NAME = CLASS_NAME.replace('.', '/'); int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - TestSnapshotListener listener = - installProbes( - createLineProbe(LINE_PROBE_ID1, "src/main/java/" + DIR_CLASS_NAME + ".java", line)); + TestSnapshotListener listener = installProbes( + createLineProbe(LINE_PROBE_ID1, "src/main/java/" + DIR_CLASS_NAME + ".java", line)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(2, result); @@ -575,9 +569,8 @@ public void sourceFileProbeFullPathTopLevelClass() throws IOException, URISyntax final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot10"; String DIR_CLASS_NAME = CLASS_NAME.replace('.', '/'); int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID2); - TestSnapshotListener listener = - installProbes( - createLineProbe(LINE_PROBE_ID2, "src/main/java/" + DIR_CLASS_NAME + ".java", line)); + TestSnapshotListener listener = installProbes( + createLineProbe(LINE_PROBE_ID2, "src/main/java/" + DIR_CLASS_NAME + ".java", line)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(42 * 42, result); @@ -596,10 +589,9 @@ public void methodProbeLineProbeMix() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot11"; String DIR_CLASS_NAME = CLASS_NAME.replace('.', '/'); int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - TestSnapshotListener listener = - installProbes( - createLineProbe(LINE_PROBE_ID1, "src/main/java/" + DIR_CLASS_NAME + ".java", line), - createMethodProbe(PROBE_ID2, CLASS_NAME, "main", null)); + TestSnapshotListener listener = installProbes( + createLineProbe(LINE_PROBE_ID1, "src/main/java/" + DIR_CLASS_NAME + ".java", line), + createMethodProbe(PROBE_ID2, CLASS_NAME, "main", null)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(2, result); @@ -609,13 +601,15 @@ public void methodProbeLineProbeMix() throws IOException, URISyntaxException { assertNull(snapshot0.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot0.getCaptures().getLines().size()); Assertions.assertEquals( - "com.datadog.debugger.CapturedSnapshot11", snapshot0.getProbe().getLocation().getType()); + "com.datadog.debugger.CapturedSnapshot11", + snapshot0.getProbe().getLocation().getType()); assertEquals("main", snapshot0.getProbe().getLocation().getMethod()); assertCaptureArgs(snapshot0.getCaptures().getLines().get(line), "arg", "java.lang.String", "2"); assertCaptureLocals(snapshot0.getCaptures().getLines().get(line), "var1", "int", "1"); Snapshot snapshot1 = snapshots.get(1); assertEquals( - "com.datadog.debugger.CapturedSnapshot11", snapshot1.getProbe().getLocation().getType()); + "com.datadog.debugger.CapturedSnapshot11", + snapshot1.getProbe().getLocation().getType()); assertEquals("main", snapshot1.getProbe().getLocation().getMethod()); assertCaptureArgs(snapshot1.getCaptures().getEntry(), "arg", "java.lang.String", "2"); assertCaptureReturnValue(snapshot1.getCaptures().getReturn(), "int", "2"); @@ -780,9 +774,11 @@ public void hoistVarKotlin() { public void fieldExtractor() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; LogProbe.Builder builder = createProbeBuilder(PROBE_ID1, CLASS_NAME, "createSimpleData", "()"); - LogProbe simpleDataProbe = builder.capture(1, 100, 255, Limits.DEFAULT_FIELD_COUNT).build(); + LogProbe simpleDataProbe = + builder.capture(1, 100, 255, Limits.DEFAULT_FIELD_COUNT).build(); builder = createProbeBuilder(PROBE_ID2, CLASS_NAME, "createCompositeData", "()"); - LogProbe compositeDataProbe = builder.capture(1, 3, 255, Limits.DEFAULT_FIELD_COUNT).build(); + LogProbe compositeDataProbe = + builder.capture(1, 3, 255, Limits.DEFAULT_FIELD_COUNT).build(); TestSnapshotListener listener = installProbes(simpleDataProbe, compositeDataProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -813,7 +809,8 @@ public void fieldExtractorDeep2() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; LogProbe.Builder builder = createProbeBuilder(PROBE_ID, CLASS_NAME, "createCompositeData", "()"); - LogProbe compositeDataProbe = builder.capture(2, 3, 255, Limits.DEFAULT_FIELD_COUNT).build(); + LogProbe compositeDataProbe = + builder.capture(2, 3, 255, Limits.DEFAULT_FIELD_COUNT).build(); TestSnapshotListener listener = installProbes(compositeDataProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -837,7 +834,8 @@ public void fieldExtractorDeep2() throws IOException, URISyntaxException { public void fieldExtractorLength() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; LogProbe.Builder builder = createProbeBuilder(PROBE_ID, CLASS_NAME, "createSimpleData", "()"); - LogProbe simpleDataProbe = builder.capture(1, 100, 2, Limits.DEFAULT_FIELD_COUNT).build(); + LogProbe simpleDataProbe = + builder.capture(1, 100, 2, Limits.DEFAULT_FIELD_COUNT).build(); TestSnapshotListener listener = installProbes(simpleDataProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -855,7 +853,8 @@ public void fieldExtractorLength() throws IOException, URISyntaxException { public void fieldExtractorDisabled() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; LogProbe.Builder builder = createProbeBuilder(PROBE_ID, CLASS_NAME, "createSimpleData", "()"); - LogProbe simpleDataProbe = builder.capture(0, 100, 50, Limits.DEFAULT_FIELD_COUNT).build(); + LogProbe simpleDataProbe = + builder.capture(0, 100, 50, Limits.DEFAULT_FIELD_COUNT).build(); TestSnapshotListener listener = installProbes(simpleDataProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -872,7 +871,8 @@ public void fieldExtractorDisabled() throws IOException, URISyntaxException { public void fieldExtractorDepth0() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; LogProbe.Builder builder = createProbeBuilder(PROBE_ID, CLASS_NAME, "createSimpleData", "()"); - LogProbe simpleDataProbe = builder.capture(0, 100, 50, Limits.DEFAULT_FIELD_COUNT).build(); + LogProbe simpleDataProbe = + builder.capture(0, 100, 50, Limits.DEFAULT_FIELD_COUNT).build(); TestSnapshotListener listener = installProbes(simpleDataProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -890,7 +890,8 @@ public void fieldExtractorDepth0() throws IOException, URISyntaxException { public void fieldExtractorDepth1() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; LogProbe.Builder builder = createProbeBuilder(PROBE_ID, CLASS_NAME, "createSimpleData", "()"); - LogProbe simpleDataProbe = builder.capture(1, 100, 50, Limits.DEFAULT_FIELD_COUNT).build(); + LogProbe simpleDataProbe = + builder.capture(1, 100, 50, Limits.DEFAULT_FIELD_COUNT).build(); TestSnapshotListener listener = installProbes(simpleDataProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -1015,24 +1016,20 @@ public void uncaughtException() throws IOException, URISyntaxException { public void uncaughtExceptionCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot05"; final String LOG_TEMPLATE = "exception msg={@exception.detailMessage}"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "triggerUncaughtException", "()") - .evaluateAt(MethodLocation.EXIT) - .when( - new ProbeCondition( - DSL.when( - DSL.and( - DSL.instanceOf( - ref("@exception"), DSL.value("CapturedSnapshot05$CustomException")), - DSL.eq( - DSL.getMember(ref("@exception"), "detailMessage"), - DSL.value("oops")), - DSL.eq( - DSL.getMember(ref("@exception"), "additionalMsg"), - DSL.value("I did it again")))), - "@exception instanceof \"CapturedSnapshot05$CustomException\" and @exception.detailMessage == 'oops' and @exception.additionalMsg == 'I did it again'")) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "triggerUncaughtException", "()") + .evaluateAt(MethodLocation.EXIT) + .when( + new ProbeCondition( + DSL.when(DSL.and( + DSL.instanceOf( + ref("@exception"), DSL.value("CapturedSnapshot05$CustomException")), + DSL.eq(DSL.getMember(ref("@exception"), "detailMessage"), DSL.value("oops")), + DSL.eq( + DSL.getMember(ref("@exception"), "additionalMsg"), + DSL.value("I did it again")))), + "@exception instanceof \"CapturedSnapshot05$CustomException\" and @exception.detailMessage == 'oops' and @exception.additionalMsg == 'I did it again'")) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); try { @@ -1057,7 +1054,8 @@ public void caughtException() throws IOException, URISyntaxException { TestSnapshotListener listener = installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "triggerCaughtException", "()")); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "triggerCaughtException").get(); + int result = + Reflect.onClass(testClass).call("main", "triggerCaughtException").get(); assertEquals(42, result); Snapshot snapshot = assertOneSnapshot(listener); assertCaptureThrowable( @@ -1079,7 +1077,8 @@ public void lineEmptyCaughtException() throws IOException, URISyntaxException { LogProbe probe3 = createLineProbe(LINE_PROBE_ID3, CLASS_NAME, line3); TestSnapshotListener listener = installProbes(probe1, probe2, probe3); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "triggerSwallowedException").get(); + int result = + Reflect.onClass(testClass).call("main", "triggerSwallowedException").get(); assertEquals(-1, result); List snapshots = assertSnapshots(listener, 3, LINE_PROBE_ID1, LINE_PROBE_ID2, LINE_PROBE_ID3); @@ -1113,14 +1112,12 @@ public void lineEmptyCaughtException() throws IOException, URISyntaxException { public void noUncaughtExceptionCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; final String LOG_TEMPLATE = "exception?: {isDefined(@exception)}"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (String)") - .evaluateAt(MethodLocation.EXIT) - .when( - new ProbeCondition( - DSL.when(not(DSL.isDefined(ref("@exception")))), "not(isDefined(@exception))")) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (String)") + .evaluateAt(MethodLocation.EXIT) + .when(new ProbeCondition( + DSL.when(not(DSL.isDefined(ref("@exception")))), "not(isDefined(@exception))")) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); @@ -1132,13 +1129,12 @@ public void noUncaughtExceptionCondition() throws IOException, URISyntaxExceptio public void rateLimitSnapshot() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - LogProbe logProbes = - new LogProbe.Builder() - .language(LANGUAGE) - .probeId(LINE_PROBE_ID1) - .where(CLASS_NAME, line) - .sampling(new LogProbe.Sampling(1)) - .build(); + LogProbe logProbes = new LogProbe.Builder() + .language(LANGUAGE) + .probeId(LINE_PROBE_ID1) + .where(CLASS_NAME, line) + .sampling(new LogProbe.Sampling(1)) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); for (int i = 0; i < 100; i++) { @@ -1151,14 +1147,15 @@ public void rateLimitSnapshot() throws IOException, URISyntaxException { @Test public void globalRateLimitSnapshot() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; - LogProbe probe1 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "f1", "(int)").sampling(10).build(); - LogProbe probe2 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "f2", "(int)").sampling(10).build(); - Configuration config = - Configuration.builder() - .setService(SERVICE_NAME) - .add(probe1, probe2) - .add(new LogProbe.Sampling(1)) - .build(); + LogProbe probe1 = + createProbeBuilder(PROBE_ID1, CLASS_NAME, "f1", "(int)").sampling(10).build(); + LogProbe probe2 = + createProbeBuilder(PROBE_ID1, CLASS_NAME, "f2", "(int)").sampling(10).build(); + Configuration config = Configuration.builder() + .setService(SERVICE_NAME) + .add(probe1, probe2) + .add(new LogProbe.Sampling(1)) + .build(); TestSnapshotListener listener = installProbes(config); Class testClass = compileAndLoadClass(CLASS_NAME); for (int i = 0; i < 100; i++) { @@ -1171,28 +1168,24 @@ public void globalRateLimitSnapshot() throws IOException, URISyntaxException { @Test public void simpleConditionTest() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe logProbe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when( - DSL.and( - // this is always true - DSL.and( - // this reference is resolved directly from the snapshot - DSL.eq(ref("fld"), DSL.value(11)), - // this reference chain needs to use reflection - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), - "msg"), - DSL.value("hello"))), - DSL.and( - DSL.eq(ref("arg"), DSL.value("5")), - DSL.ge(ref(ValueReferences.DURATION_REF), DSL.value(0L))))), - "(fld == 11 && typed.fld.fld.msg == \"hello\") && (arg == '5' && @duration >= 0)")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe logProbe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition( + DSL.when(DSL.and( + // this is always true + DSL.and( + // this reference is resolved directly from the snapshot + DSL.eq(ref("fld"), DSL.value(11)), + // this reference chain needs to use reflection + DSL.eq( + DSL.getMember( + DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + DSL.and( + DSL.eq(ref("arg"), DSL.value("5")), + DSL.ge(ref(ValueReferences.DURATION_REF), DSL.value(0L))))), + "(fld == 11 && typed.fld.fld.msg == \"hello\") && (arg == '5' && @duration >= 0)")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); for (int i = 0; i < 100; i++) { @@ -1208,25 +1201,21 @@ public void simpleConditionTest() throws IOException, URISyntaxException { public void lineProbeCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - LogProbe logProbe = - createProbeBuilder(LINE_PROBE_ID1, CLASS_NAME, line) - .when( - new ProbeCondition( - DSL.when( - DSL.and( - // this is always true - DSL.and( - // this reference is resolved directly from the snapshot - DSL.eq(ref("fld"), DSL.value(11)), - // this reference chain needs to use reflection - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), - "msg"), - DSL.value("hello"))), - DSL.eq(ref("arg"), DSL.value("5")))), - "(fld == 11 && typed.fld.fld.msg == \"hello\") && arg == '5'")) - .build(); + LogProbe logProbe = createProbeBuilder(LINE_PROBE_ID1, CLASS_NAME, line) + .when(new ProbeCondition( + DSL.when(DSL.and( + // this is always true + DSL.and( + // this reference is resolved directly from the snapshot + DSL.eq(ref("fld"), DSL.value(11)), + // this reference chain needs to use reflection + DSL.eq( + DSL.getMember( + DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + DSL.eq(ref("arg"), DSL.value("5")))), + "(fld == 11 && typed.fld.fld.msg == \"hello\") && arg == '5'")) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); for (int i = 0; i < 100; i++) { @@ -1245,11 +1234,9 @@ public void lineProbeCondition() throws IOException, URISyntaxException { public void lineProbeConditionFailed() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - LogProbe logProbe = - createProbeBuilder(LINE_PROBE_ID1, CLASS_NAME, line) - .when( - new ProbeCondition(DSL.when(DSL.eq(ref("foobar"), nullValue())), "foobar == null")) - .build(); + LogProbe logProbe = createProbeBuilder(LINE_PROBE_ID1, CLASS_NAME, line) + .when(new ProbeCondition(DSL.when(DSL.eq(ref("foobar"), nullValue())), "foobar == null")) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "0").get(); @@ -1258,19 +1245,19 @@ public void lineProbeConditionFailed() throws IOException, URISyntaxException { assertNull(snapshot.getCaptures().getLines()); assertEquals(1, snapshot.getEvaluationErrors().size()); assertEquals( - "Cannot dereference field: foobar", snapshot.getEvaluationErrors().get(0).getMessage()); + "Cannot dereference field: foobar", + snapshot.getEvaluationErrors().get(0).getMessage()); } @Test public void staticFieldCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot19"; - LogProbe logProbe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "process", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when(DSL.eq(ref("strField"), DSL.value("foo"))), "strField == 'foo'")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe logProbe = createProbeBuilder( + PROBE_ID, CLASS_NAME, "process", "int (java.lang.String)") + .when(new ProbeCondition( + DSL.when(DSL.eq(ref("strField"), DSL.value("foo"))), "strField == 'foo'")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "0").get(); @@ -1290,11 +1277,10 @@ public void staticFieldCondition() throws IOException, URISyntaxException { public void simpleFalseConditionTest() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID2); - LogProbe logProbe = - createProbeBuilder(LINE_PROBE_ID2, CLASS_NAME, line) - .when(new ProbeCondition(DSL.when(DSL.eq(ref("arg"), DSL.value("5"))), "arg == '5'")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe logProbe = createProbeBuilder(LINE_PROBE_ID2, CLASS_NAME, line) + .when(new ProbeCondition(DSL.when(DSL.eq(ref("arg"), DSL.value("5"))), "arg == '5'")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "0").get(); @@ -1305,18 +1291,13 @@ public void simpleFalseConditionTest() throws IOException, URISyntaxException { @Test public void nullCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when( - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), - "msg"), - DSL.value("hello"))), - "nullTyped.fld.fld.msg == 'hello'")) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition( + DSL.when(DSL.eq( + DSL.getMember(DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + "nullTyped.fld.fld.msg == 'hello'")) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1331,20 +1312,15 @@ public void nullCondition() throws IOException, URISyntaxException { @Test public void nullConditionTemplateOnly() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when( - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), - "msg"), - DSL.value("hello"))), - "nullTyped.fld.fld.msg == 'hello'")) - .captureSnapshot(false) - .template("plain log", Collections.emptyList()) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition( + DSL.when(DSL.eq( + DSL.getMember(DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + "nullTyped.fld.fld.msg == 'hello'")) + .captureSnapshot(false) + .template("plain log", Collections.emptyList()) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1360,18 +1336,14 @@ public void nullConditionTemplateOnly() throws IOException, URISyntaxException { @Test public void shortCircuitingCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when( - DSL.and( - DSL.isDefined(ref("@exception")), - DSL.contains( - DSL.getMember(ref("@exception"), "detailMessage"), - new StringValue("closed")))), - "isDefined(@exception) && contains(@exception.detailMessage, 'closed')")) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition( + DSL.when(DSL.and( + DSL.isDefined(ref("@exception")), + DSL.contains( + DSL.getMember(ref("@exception"), "detailMessage"), new StringValue("closed")))), + "isDefined(@exception) && contains(@exception.detailMessage, 'closed')")) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1383,14 +1355,11 @@ public void shortCircuitingCondition() throws IOException, URISyntaxException { @Test public void wellKnownClassesCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when( - DSL.eq(DSL.getMember(ref("maybeStr"), "value"), DSL.value("maybe foo"))), - "maybeStr.value == 'maybe foo'")) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition( + DSL.when(DSL.eq(DSL.getMember(ref("maybeStr"), "value"), DSL.value("maybe foo"))), + "maybeStr.value == 'maybe foo'")) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1447,14 +1416,12 @@ private List doMergedProbeConditions( ProbeCondition probeCondition1, ProbeCondition probeCondition2, int expectedSnapshots) throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe1 = - createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", "int (java.lang.String)") - .when(probeCondition1) - .build(); - LogProbe probe2 = - createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", "int (java.lang.String)") - .when(probeCondition2) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", "int (java.lang.String)") + .when(probeCondition1) + .build(); + LogProbe probe2 = createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", "int (java.lang.String)") + .when(probeCondition2) + .build(); TestSnapshotListener listener = installProbes(probe1, probe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1466,39 +1433,35 @@ private List doMergedProbeConditions( @Test public void mergedProbesConditionMainErrorAdditionalFalse() throws IOException, URISyntaxException { - ProbeCondition condition1 = - new ProbeCondition( - DSL.when( - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), - DSL.value("hello"))), - "nullTyped.fld.fld.msg == 'hello'"); + ProbeCondition condition1 = new ProbeCondition( + DSL.when(DSL.eq( + DSL.getMember(DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + "nullTyped.fld.fld.msg == 'hello'"); ProbeCondition condition2 = new ProbeCondition(DSL.when(DSL.FALSE), "false"); List snapshots = doMergedProbeConditions(condition1, condition2, 1); List evaluationErrors = snapshots.get(0).getEvaluationErrors(); Assertions.assertEquals(1, evaluationErrors.size()); Assertions.assertEquals("nullTyped.fld.fld", evaluationErrors.get(0).getExpr()); - Assertions.assertEquals("Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); + Assertions.assertEquals( + "Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); } @Test public void mergedProbesConditionMainErrorAdditionalTrue() throws IOException, URISyntaxException { - ProbeCondition condition1 = - new ProbeCondition( - DSL.when( - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), - DSL.value("hello"))), - "nullTyped.fld.fld.msg == 'hello'"); + ProbeCondition condition1 = new ProbeCondition( + DSL.when(DSL.eq( + DSL.getMember(DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + "nullTyped.fld.fld.msg == 'hello'"); ProbeCondition condition2 = new ProbeCondition(DSL.when(DSL.TRUE), "true"); List snapshots = doMergedProbeConditions(condition1, condition2, 2); List evaluationErrors = snapshots.get(0).getEvaluationErrors(); Assertions.assertEquals(1, evaluationErrors.size()); Assertions.assertEquals("nullTyped.fld.fld", evaluationErrors.get(0).getExpr()); - Assertions.assertEquals("Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); + Assertions.assertEquals( + "Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); assertNull(snapshots.get(1).getEvaluationErrors()); } @@ -1506,56 +1469,49 @@ public void mergedProbesConditionMainErrorAdditionalTrue() public void mergedProbesConditionMainFalseAdditionalError() throws IOException, URISyntaxException { ProbeCondition condition1 = new ProbeCondition(DSL.when(DSL.FALSE), "false"); - ProbeCondition condition2 = - new ProbeCondition( - DSL.when( - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), - DSL.value("hello"))), - "nullTyped.fld.fld.msg == 'hello'"); + ProbeCondition condition2 = new ProbeCondition( + DSL.when(DSL.eq( + DSL.getMember(DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + "nullTyped.fld.fld.msg == 'hello'"); List snapshots = doMergedProbeConditions(condition1, condition2, 1); List evaluationErrors = snapshots.get(0).getEvaluationErrors(); Assertions.assertEquals(1, evaluationErrors.size()); Assertions.assertEquals("nullTyped.fld.fld", evaluationErrors.get(0).getExpr()); - Assertions.assertEquals("Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); + Assertions.assertEquals( + "Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); } @Test public void mergedProbesConditionMainTrueAdditionalError() throws IOException, URISyntaxException { ProbeCondition condition1 = new ProbeCondition(DSL.when(DSL.TRUE), "true"); - ProbeCondition condition2 = - new ProbeCondition( - DSL.when( - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), - DSL.value("hello"))), - "nullTyped.fld.fld.msg == 'hello'"); + ProbeCondition condition2 = new ProbeCondition( + DSL.when(DSL.eq( + DSL.getMember(DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + "nullTyped.fld.fld.msg == 'hello'"); List snapshots = doMergedProbeConditions(condition1, condition2, 2); assertNull(snapshots.get(0).getEvaluationErrors()); List evaluationErrors = snapshots.get(1).getEvaluationErrors(); Assertions.assertEquals(1, evaluationErrors.size()); Assertions.assertEquals("nullTyped.fld.fld", evaluationErrors.get(0).getExpr()); - Assertions.assertEquals("Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); + Assertions.assertEquals( + "Cannot dereference field: fld", evaluationErrors.get(0).getMessage()); } @Test public void mergedProbesConditionMixedLocation() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe1 = - createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", "int (java.lang.String)") - .when(new ProbeCondition(DSL.when(DSL.TRUE), "true")) - .evaluateAt(MethodLocation.DEFAULT) - .build(); - LogProbe probe2 = - createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when(DSL.ge(ref("@duration"), DSL.value(0))), "@duration >= 0")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition(DSL.when(DSL.TRUE), "true")) + .evaluateAt(MethodLocation.DEFAULT) + .build(); + LogProbe probe2 = createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", "int (java.lang.String)") + .when( + new ProbeCondition(DSL.when(DSL.ge(ref("@duration"), DSL.value(0))), "@duration >= 0")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe1, probe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1585,24 +1541,21 @@ public void mergedProbesDifferentSignature() throws IOException, URISyntaxExcept @Test public void mergedProbesWithCaptureExpressionsMixed() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe1 = - createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - null), - new LogProbe.CaptureExpression( - "nullTyped_fld", - new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), - null))) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + null), + new LogProbe.CaptureExpression( + "nullTyped_fld", + new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), + null))) + .build(); LogProbe probe2 = createMethodProbeAtExit(PROBE_ID2, CLASS_NAME, "doit", null); TestSnapshotListener listener = installProbes(probe1, probe2); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -1634,37 +1587,29 @@ public void mergedProbesWithCaptureExpressionsMixed() throws IOException, URISyn @Test public void mergedProbesWithDifferentCaptureExpressions() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe1 = - createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - null), - new LogProbe.CaptureExpression( - "nullTyped_fld", - new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), - null))) - .build(); - LogProbe probe2 = - createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "var1", new ValueScript(ref("var1"), "var1"), null), - new LogProbe.CaptureExpression( - "this_fld", - new ValueScript(DSL.getMember(ref("this"), "fld"), "this.fld"), - null))) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + null), + new LogProbe.CaptureExpression( + "nullTyped_fld", + new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), + null))) + .build(); + LogProbe probe2 = createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression("var1", new ValueScript(ref("var1"), "var1"), null), + new LogProbe.CaptureExpression( + "this_fld", new ValueScript(DSL.getMember(ref("this"), "fld"), "this.fld"), null))) + .build(); TestSnapshotListener listener = installProbes(probe1, probe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1729,13 +1674,11 @@ public void fields() throws IOException, URISyntaxException { public void inheritedFields() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; final String INHERITED_CLASS_NAME = CLASS_NAME + "$Inherited"; - LogProbe probe = - createProbeBuilder(PROBE_ID, INHERITED_CLASS_NAME, "f", "()") - .when( - new ProbeCondition( - DSL.when(DSL.eq(ref("intValue"), DSL.value(24))), "intValue == 24")) - .evaluateAt(MethodLocation.ENTRY) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, INHERITED_CLASS_NAME, "f", "()") + .when( + new ProbeCondition(DSL.when(DSL.eq(ref("intValue"), DSL.value(24))), "intValue == 24")) + .evaluateAt(MethodLocation.ENTRY) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "inherited").get(); @@ -1772,13 +1715,11 @@ public void staticFields() throws IOException, URISyntaxException { public void staticInheritedFields() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot19"; final String INHERITED_CLASS_NAME = CLASS_NAME + "$Inherited"; - LogProbe logProbe = - createProbeBuilder(PROBE_ID, INHERITED_CLASS_NAME, "f", "()") - .when( - new ProbeCondition( - DSL.when(DSL.eq(ref("intValue"), DSL.value(48))), "intValue == 48")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe logProbe = createProbeBuilder(PROBE_ID, INHERITED_CLASS_NAME, "f", "()") + .when( + new ProbeCondition(DSL.when(DSL.eq(ref("intValue"), DSL.value(48))), "intValue == 48")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "inherited").get(); @@ -1798,7 +1739,8 @@ public void staticLambda() throws IOException, URISyntaxException { TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID1, CLASS_NAME, line)); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "static", "email@address").get(); + int result = + Reflect.onClass(testClass).call("main", "static", "email@address").get(); assertEquals(8, result); Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); CapturedContext context = snapshot.getCaptures().getLines().get(line); @@ -1813,7 +1755,8 @@ public void capturingLambda() throws IOException, URISyntaxException { TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID2, CLASS_NAME, line)); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "capturing", "email@address").get(); + int result = + Reflect.onClass(testClass).call("main", "capturing", "email@address").get(); assertEquals(8, result); Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID2, listener); CapturedContext context = snapshot.getCaptures().getLines().get(line); @@ -1829,7 +1772,8 @@ public void multiLambdas() throws IOException, URISyntaxException { TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID3, CLASS_NAME, line)); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "multi", "FOO1,FOO2,FOO3").get(); + int result = + Reflect.onClass(testClass).call("main", "multi", "FOO1,FOO2,FOO3").get(); assertEquals(3, result); Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID3, listener); CapturedContext context = snapshot.getCaptures().getLines().get(line); @@ -1845,11 +1789,10 @@ public void tracerInstrumentedClass() throws Exception { // load a class file that was previously instrumented by the DD tracer as JAX-RS resource Class testClass = loadClass(CLASS_NAME, getClass().getResource("/MyResource.class").getFile()); - Object result = - Reflect.onClass(testClass) - .create() - .call("createResource", (Object) null, (Object) null, 1) - .get(); + Object result = Reflect.onClass(testClass) + .create() + .call("createResource", (Object) null, (Object) null, 1) + .get(); Snapshot snapshot = assertOneSnapshot(listener); Map arguments = snapshot.getCaptures().getEntry().getArguments(); @@ -1876,9 +1819,13 @@ public void noCodeMethods() throws Exception { ArgumentCaptor strCaptor = ArgumentCaptor.forClass(String.class); verify(probeStatusSink, times(2)).addError(probeIdCaptor.capture(), strCaptor.capture()); assertEquals(PROBE_ID1.getId(), probeIdCaptor.getAllValues().get(0).getId()); - assertEquals("Cannot instrument an abstract or native method", strCaptor.getAllValues().get(0)); + assertEquals( + "Cannot instrument an abstract or native method", + strCaptor.getAllValues().get(0)); assertEquals(PROBE_ID2.getId(), probeIdCaptor.getAllValues().get(1).getId()); - assertEquals("Cannot instrument an abstract or native method", strCaptor.getAllValues().get(1)); + assertEquals( + "Cannot instrument an abstract or native method", + strCaptor.getAllValues().get(1)); } @Test @@ -1924,9 +1871,8 @@ public void noDebugInfoEmptyMethod() throws Exception { public void instrumentTheWorld() throws Exception { final String CLASS_NAME = "CapturedSnapshot01"; Map classFileBuffers = compile(CLASS_NAME); - TestSnapshotListener listener = - setupInstrumentTheWorldTransformer( - null, getClass().getResource("/include-files/singleClass.txt").getPath()); + TestSnapshotListener listener = setupInstrumentTheWorldTransformer( + null, getClass().getResource("/include-files/singleClass.txt").getPath()); Class testClass; try { testClass = loadClass(CLASS_NAME, classFileBuffers); @@ -1947,9 +1893,9 @@ public void instrumentTheWorld_excludeClass(String excludeFileName) throws Excep final String CLASS_NAME = "CapturedSnapshot01"; Map classFileBuffers = compile(CLASS_NAME); URL resource = getClass().getResource(excludeFileName); - TestSnapshotListener listener = - setupInstrumentTheWorldTransformer( - resource.getPath(), getClass().getResource("/include-files/singleClass.txt").getPath()); + TestSnapshotListener listener = setupInstrumentTheWorldTransformer( + resource.getPath(), + getClass().getResource("/include-files/singleClass.txt").getPath()); Class testClass; try { testClass = loadClass(CLASS_NAME, classFileBuffers); @@ -1999,11 +1945,10 @@ public void exceptionAsLocalVariable() throws IOException, URISyntaxException { @Test public void evaluateAtEntry() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") - .when(new ProbeCondition(DSL.when(DSL.eq(ref("arg"), DSL.value("1"))), "arg == '1'")) - .evaluateAt(MethodLocation.ENTRY) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") + .when(new ProbeCondition(DSL.when(DSL.eq(ref("arg"), DSL.value("1"))), "arg == '1'")) + .evaluateAt(MethodLocation.ENTRY) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -2014,12 +1959,10 @@ public void evaluateAtEntry() throws IOException, URISyntaxException { @Test public void evaluateAtExit() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") - .when( - new ProbeCondition(DSL.when(DSL.eq(ref("@return"), DSL.value(3))), "@return == 3")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") + .when(new ProbeCondition(DSL.when(DSL.eq(ref("@return"), DSL.value(3))), "@return == 3")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -2030,12 +1973,10 @@ public void evaluateAtExit() throws IOException, URISyntaxException { @Test public void evaluateAtExitFalse() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") - .when( - new ProbeCondition(DSL.when(DSL.eq(ref("@return"), DSL.value(0))), "@return == 0")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "int (java.lang.String)") + .when(new ProbeCondition(DSL.when(DSL.eq(ref("@return"), DSL.value(0))), "@return == 0")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -2054,11 +1995,10 @@ public void uncaughtExceptionConditionLocalVar() throws IOException, URISyntaxEx return; } final String CLASS_NAME = "CapturedSnapshot05"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "(String)") - .when(new ProbeCondition(DSL.when(DSL.ge(ref("after"), DSL.value(0))), "after >= 0")) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "main", "(String)") + .when(new ProbeCondition(DSL.when(DSL.ge(ref("after"), DSL.value(0))), "after >= 0")) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); try { @@ -2214,7 +2154,8 @@ public void duplicateLocalDifferentScope() throws IOException, URISyntaxExceptio createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "duplicateLocalDifferentScope", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "duplicateLocalDifferentScope").get(); + int result = + Reflect.onClass(testClass).call("main", "duplicateLocalDifferentScope").get(); assertEquals(28, result); Snapshot snapshot = assertOneSnapshot(listener); assertEquals(1, snapshot.getCaptures().getReturn().getLocals().size()); @@ -2290,7 +2231,8 @@ public void sameSlotAndTypeDifferentName() throws IOException, URISyntaxExceptio createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "sameSlotAndTypeDifferentName", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "sameSlotAndTypeDifferentName").get(); + int result = + Reflect.onClass(testClass).call("main", "sameSlotAndTypeDifferentName").get(); assertEquals(28, result); Snapshot snapshot = assertOneSnapshot(listener); // r and o cannot be hoisted in safe mode, because they have the same slot @@ -2314,7 +2256,8 @@ public void sameSlotAndNameOneReturn() throws IOException, URISyntaxException { createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "sameSlotAndNameOneReturn", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); - int result = Reflect.onClass(testClass).call("main", "sameSlotAndNameOneReturn").get(); + int result = + Reflect.onClass(testClass).call("main", "sameSlotAndNameOneReturn").get(); assertEquals(24, result); Snapshot snapshot = assertOneSnapshot(listener); // o is not hoisted in safe mode, because it has the same slot and name on different range @@ -2361,20 +2304,18 @@ public void enumValues() throws IOException, URISyntaxException { @Test public void enumCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot23"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "convert", null) - .evaluateAt(MethodLocation.EXIT) - .when( - new ProbeCondition( - DSL.when( - DSL.and( - DSL.eq(ref("@return"), DSL.value("TWO")), - DSL.eq(ref("@return"), DSL.value("MyEnum.TWO")), - DSL.eq( - ref("@return"), - DSL.value("com.datadog.debugger.CapturedSnapshot23$MyEnum.TWO")))), - "@return == 'TWO' && @return == 'MyEnum.TWO' && @return == 'com.datadog.debugger.CapturedSnapshot23$MyEnum.TWO'")) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "convert", null) + .evaluateAt(MethodLocation.EXIT) + .when( + new ProbeCondition( + DSL.when(DSL.and( + DSL.eq(ref("@return"), DSL.value("TWO")), + DSL.eq(ref("@return"), DSL.value("MyEnum.TWO")), + DSL.eq( + ref("@return"), + DSL.value("com.datadog.debugger.CapturedSnapshot23$MyEnum.TWO")))), + "@return == 'TWO' && @return == 'MyEnum.TWO' && @return == 'com.datadog.debugger.CapturedSnapshot23$MyEnum.TWO'")) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); @@ -2431,12 +2372,10 @@ public void unknownMapCount() throws IOException, URISyntaxException { } private Snapshot doUnknownCount(String CLASS_NAME) throws IOException, URISyntaxException { - LogProbe logProbe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .when( - new ProbeCondition( - DSL.when(DSL.ge(DSL.len(ref("holder")), DSL.value(0))), "len(holder) >= 0")) - .build(); + LogProbe logProbe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .when(new ProbeCondition( + DSL.when(DSL.ge(DSL.len(ref("holder")), DSL.value(0))), "len(holder) >= 0")) + .build(); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -2466,16 +2405,14 @@ public void dupLineProbeSameTemplate() throws IOException, URISyntaxException { int line1 = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID3); int line2 = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID4); assertTrue(line1 == line2); - LogProbe probe1 = - createProbeBuilder(LINE_PROBE_ID3, CLASS_NAME, line1) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .evaluateAt(MethodLocation.EXIT) - .build(); - LogProbe probe2 = - createProbeBuilder(LINE_PROBE_ID4, CLASS_NAME, line2) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe1 = createProbeBuilder(LINE_PROBE_ID3, CLASS_NAME, line1) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .evaluateAt(MethodLocation.EXIT) + .build(); + LogProbe probe2 = createProbeBuilder(LINE_PROBE_ID4, CLASS_NAME, line2) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe1, probe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -2491,12 +2428,11 @@ public void keywordRedaction() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot27"; final String LOG_TEMPLATE = "arg={arg} secret={secret} password={this.password} fromMap={strMap['password']}"; - LogProbe probe1 = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe1); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "secret123").get(); @@ -2527,35 +2463,26 @@ public void keywordRedaction() throws IOException, URISyntaxException { @Test public void keywordRedactionConditions() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot27"; - LogProbe probe1 = - createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) - .when( - new ProbeCondition( - DSL.when( - DSL.contains( - DSL.getMember(ref("this"), "password"), new StringValue("123"))), - "contains(this.password, '123')")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); - LogProbe probe2 = - createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", null) - .when( - new ProbeCondition( - DSL.when(DSL.eq(ref("password"), DSL.value("123"))), "password == '123'")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); - LogProbe probe3 = - createProbeBuilder(PROBE_ID3, CLASS_NAME, "doit", null) - .when( - new ProbeCondition( - DSL.when( - DSL.eq(DSL.index(ref("strMap"), DSL.value("password")), DSL.value("123"))), - "strMap['password'] == '123'")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) + .when(new ProbeCondition( + DSL.when(DSL.contains(DSL.getMember(ref("this"), "password"), new StringValue("123"))), + "contains(this.password, '123')")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); + LogProbe probe2 = createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", null) + .when(new ProbeCondition( + DSL.when(DSL.eq(ref("password"), DSL.value("123"))), "password == '123'")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); + LogProbe probe3 = createProbeBuilder(PROBE_ID3, CLASS_NAME, "doit", null) + .when(new ProbeCondition( + DSL.when(DSL.eq(DSL.index(ref("strMap"), DSL.value("password")), DSL.value("123"))), + "strMap['password'] == '123'")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe1, probe2, probe3); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "secret123").get(); @@ -2582,11 +2509,10 @@ public void typeRedactionBlockedProbe() throws IOException, URISyntaxException { when(config.getDynamicInstrumentationRedactedTypes()) .thenReturn("com.datadog.debugger.CapturedSnapshot27"); Redaction.addUserDefinedTypes(config); - LogProbe probe1 = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe1); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "secret123").get(); @@ -2606,12 +2532,11 @@ public void typeRedactionSnapshot() throws IOException, URISyntaxException { when(config.getDynamicInstrumentationRedactedTypes()) .thenReturn("com.datadog.debugger.CapturedSnapshot27$Creds"); Redaction.addUserDefinedTypes(config); - LogProbe probe1 = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe1); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "secret123").get(); @@ -2632,7 +2557,8 @@ public void typeRedactionSnapshot() throws IOException, URISyntaxException { getFields(snapshot.getCaptures().getReturn().getArguments().get("this")); CapturedContext.CapturedValue credsField = thisFields.get("creds"); assertEquals(REDACTED_TYPE_REASON, credsField.getNotCapturedReason()); - Map credMap = (Map) thisFields.get("credMap").getValue(); + Map credMap = + (Map) thisFields.get("credMap").getValue(); assertNull(credMap.get("dave")); } @@ -2643,37 +2569,29 @@ public void typeRedactionCondition() throws IOException, URISyntaxException { when(config.getDynamicInstrumentationRedactedTypes()) .thenReturn("com.datadog.debugger.CapturedSnapshot27$Creds"); Redaction.addUserDefinedTypes(config); - LogProbe probe1 = - createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) - .when( - new ProbeCondition( - DSL.when( - DSL.contains( - DSL.getMember(DSL.getMember(ref("this"), "creds"), "secretCode"), - new StringValue("123"))), - "contains(this.creds.secretCode, '123')")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); - LogProbe probe2 = - createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", null) - .when( - new ProbeCondition( - DSL.when(DSL.eq(DSL.getMember(ref("creds"), "secretCode"), DSL.value("123"))), - "creds.secretCode == '123'")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); - LogProbe probe3 = - createProbeBuilder(PROBE_ID3, CLASS_NAME, "doit", null) - .when( - new ProbeCondition( - DSL.when( - DSL.eq(DSL.index(ref("credMap"), DSL.value("dave")), DSL.value("123"))), - "credMap['dave'] == '123'")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe1 = createProbeBuilder(PROBE_ID1, CLASS_NAME, "doit", null) + .when(new ProbeCondition( + DSL.when(DSL.contains( + DSL.getMember(DSL.getMember(ref("this"), "creds"), "secretCode"), + new StringValue("123"))), + "contains(this.creds.secretCode, '123')")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); + LogProbe probe2 = createProbeBuilder(PROBE_ID2, CLASS_NAME, "doit", null) + .when(new ProbeCondition( + DSL.when(DSL.eq(DSL.getMember(ref("creds"), "secretCode"), DSL.value("123"))), + "creds.secretCode == '123'")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); + LogProbe probe3 = createProbeBuilder(PROBE_ID3, CLASS_NAME, "doit", null) + .when(new ProbeCondition( + DSL.when(DSL.eq(DSL.index(ref("credMap"), DSL.value("dave")), DSL.value("123"))), + "credMap['dave'] == '123'")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe1, probe2, probe3); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "secret123").get(); @@ -2772,12 +2690,11 @@ private void doSamplingTest( MockSampler probeSampler = new MockSampler(); MockSampler errorSampler = new MockSampler(); MockSampler globalSampler = new MockSampler(); - ProbeRateLimiter.setSamplerSupplier( - rate -> { - if (rate < 2) return errorSampler; - if (rate < 101) return probeSampler; - return globalSampler; - }); + ProbeRateLimiter.setSamplerSupplier(rate -> { + if (rate < 2) return errorSampler; + if (rate < 101) return probeSampler; + return globalSampler; + }); globalRateSetter.accept(1000); try { testRun.run(); @@ -2835,33 +2752,26 @@ public void allProbesSameMethod() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; final String METRIC_NAME = "count"; Where where = Where.of(CLASS_NAME, "main", null); - Configuration configuration = - Configuration.builder() - .add( - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where(where) - .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) - .decorations( - new SpanDecorationProbe.Decoration( - null, - Arrays.asList( - new SpanDecorationProbe.Tag( - "tag1", - new SpanDecorationProbe.TagValue( - "value1", parseTemplate("value1")))))) - .build()) - .add(SpanProbe.builder().probeId(PROBE_ID1).where(where).build()) - .add( - MetricProbe.builder() - .probeId(PROBE_ID2) - .metricName(METRIC_NAME) - .kind(MetricProbe.MetricKind.COUNT) - .where(where) - .build()) - .add(LogProbe.builder().probeId(PROBE_ID3).where(where).build()) - .add(TriggerProbe.builder().probeId(PROBE_ID4).where(where).build()) - .build(); + Configuration configuration = Configuration.builder() + .add(SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where(where) + .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) + .decorations(new SpanDecorationProbe.Decoration( + null, + Arrays.asList(new SpanDecorationProbe.Tag( + "tag1", new SpanDecorationProbe.TagValue("value1", parseTemplate("value1")))))) + .build()) + .add(SpanProbe.builder().probeId(PROBE_ID1).where(where).build()) + .add(MetricProbe.builder() + .probeId(PROBE_ID2) + .metricName(METRIC_NAME) + .kind(MetricProbe.MetricKind.COUNT) + .where(where) + .build()) + .add(LogProbe.builder().probeId(PROBE_ID3).where(where).build()) + .add(TriggerProbe.builder().probeId(PROBE_ID4).where(where).build()) + .build(); CoreTracer tracer = CoreTracer.builder().build(); TracerInstaller.forceInstallGlobalTracer(tracer); @@ -2908,24 +2818,21 @@ public void allProbesSameMethod() throws IOException, URISyntaxException { @Test public void captureExpressions() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - null), - new LogProbe.CaptureExpression( - "nullTyped_fld", - new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), - null))) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + null), + new LogProbe.CaptureExpression( + "nullTyped_fld", + new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), + null))) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -2944,27 +2851,22 @@ public void captureExpressions() throws IOException, URISyntaxException { @Test public void captureExpressionsWithCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - null), - new LogProbe.CaptureExpression( - "nullTyped_fld", - new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), - null))) - .when( - new ProbeCondition( - DSL.when(not(DSL.eq(ref("typed"), nullValue()))), "typed != null")) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + null), + new LogProbe.CaptureExpression( + "nullTyped_fld", + new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), + null))) + .when(new ProbeCondition(DSL.when(not(DSL.eq(ref("typed"), nullValue()))), "typed != null")) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -2983,29 +2885,21 @@ public void captureExpressionsWithCondition() throws IOException, URISyntaxExcep @Test public void captureExpressionsWithNullCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe logProbes = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition( - DSL.when( - DSL.eq( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), - "msg"), - DSL.value("hello"))), - "nullTyped.fld.fld.msg == 'hello'")) - .captureSnapshot(false) - .template("plain log", Collections.emptyList()) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - null))) - .build(); + LogProbe logProbes = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition( + DSL.when(DSL.eq( + DSL.getMember(DSL.getMember(DSL.getMember(ref("nullTyped"), "fld"), "fld"), "msg"), + DSL.value("hello"))), + "nullTyped.fld.fld.msg == 'hello'")) + .captureSnapshot(false) + .template("plain log", Collections.emptyList()) + .captureExpressions(Arrays.asList(new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + null))) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -3021,19 +2915,14 @@ public void captureExpressionsWithNullCondition() throws IOException, URISyntaxE @Test public void captureExpressionsWithRejectingCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .when(new ProbeCondition(DSL.when(DSL.eq(DSL.value(1), DSL.value(2))), "1 == 2")) - .template("plain log", Collections.emptyList()) - .captureExpressions( - Collections.singletonList( - new LogProbe.CaptureExpression( - "unknown_symbol", - new ValueScript(ref("doesNotExist"), "doesNotExist"), - null))) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .when(new ProbeCondition(DSL.when(DSL.eq(DSL.value(1), DSL.value(2))), "1 == 2")) + .template("plain log", Collections.emptyList()) + .captureExpressions(Collections.singletonList(new LogProbe.CaptureExpression( + "unknown_symbol", new ValueScript(ref("doesNotExist"), "doesNotExist"), null))) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); for (int i = 0; i < 5; i++) { @@ -3046,19 +2935,14 @@ public void captureExpressionsWithRejectingCondition() throws IOException, URISy @Test public void captureExpressionsPrimitives() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "this_fld", - new ValueScript(DSL.getMember(ref("this"), "fld"), "this.fld"), - null), - new LogProbe.CaptureExpression( - "var1", new ValueScript(ref("var1"), "var1"), null))) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "this_fld", new ValueScript(DSL.getMember(ref("this"), "fld"), "this.fld"), null), + new LogProbe.CaptureExpression("var1", new ValueScript(ref("var1"), "var1"), null))) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -3074,23 +2958,20 @@ public void captureExpressionsPrimitives() throws IOException, URISyntaxExceptio public void captureExpressionsLineProbe() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID3); - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, line) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - null), - new LogProbe.CaptureExpression( - "nullTyped_fld", - new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), - null))) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, line) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + null), + new LogProbe.CaptureExpression( + "nullTyped_fld", + new ValueScript(DSL.getMember(ref("nullTyped"), "fld"), "nullTyped.fld"), + null))) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -3106,37 +2987,32 @@ public void captureExpressionsLineProbe() throws IOException, URISyntaxException @Test public void captureExpressionsWithCaptureLimits() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - new LogProbe.Capture(3, 100, 3, 20)), - new LogProbe.CaptureExpression( - "typed", - new ValueScript(ref("typed"), "typed"), - new LogProbe.Capture(1, 1, 3, 20)))) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + new LogProbe.Capture(3, 100, 3, 20)), + new LogProbe.CaptureExpression( + "typed", + new ValueScript(ref("typed"), "typed"), + new LogProbe.Capture(1, 1, 3, 20)))) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(3, result); Snapshot snapshot = assertOneSnapshot(listener); - CapturedContext.CapturedValue msgValue = - deserializeCapturedValue( - snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed_fld_fld_msg")); + CapturedContext.CapturedValue msgValue = deserializeCapturedValue( + snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed_fld_fld_msg")); assertEquals("hel", msgValue.getValue()); assertEquals("truncated", msgValue.getNotCapturedReason()); - CapturedContext.CapturedValue typedValue = - deserializeCapturedValue( - snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed")); + CapturedContext.CapturedValue typedValue = deserializeCapturedValue( + snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed")); Map fields = (Map) typedValue.getValue(); CapturedContext.CapturedValue fldValue = fields.get("fld"); @@ -3147,36 +3023,30 @@ public void captureExpressionsWithCaptureLimits() throws IOException, URISyntaxE public void captureExpressionsWithInheritedCaptureLimits() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .capture(new LogProbe.Capture(1, 10, 3, 1)) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "typed_fld_fld_msg", - new ValueScript( - DSL.getMember( - DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), - "typed.fld.fld.msg"), - null), - new LogProbe.CaptureExpression( - "typed", new ValueScript(ref("typed"), "typed"), null))) - .build(); + LogProbe probe = createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .capture(new LogProbe.Capture(1, 10, 3, 1)) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "typed_fld_fld_msg", + new ValueScript( + DSL.getMember(DSL.getMember(DSL.getMember(ref("typed"), "fld"), "fld"), "msg"), + "typed.fld.fld.msg"), + null), + new LogProbe.CaptureExpression("typed", new ValueScript(ref("typed"), "typed"), null))) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(3, result); Snapshot snapshot = assertOneSnapshot(listener); - CapturedContext.CapturedValue msgValue = - deserializeCapturedValue( - snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed_fld_fld_msg")); + CapturedContext.CapturedValue msgValue = deserializeCapturedValue( + snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed_fld_fld_msg")); assertEquals("hel", msgValue.getValue()); assertEquals("truncated", msgValue.getNotCapturedReason()); - CapturedContext.CapturedValue typedValue = - deserializeCapturedValue( - snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed")); + CapturedContext.CapturedValue typedValue = deserializeCapturedValue( + snapshot.getCaptures().getReturn().getCaptureExpressions().get("typed")); Map fields = (Map) typedValue.getValue(); CapturedContext.CapturedValue fldValue = fields.get("fld"); @@ -3275,24 +3145,22 @@ public void noInstrumentationForAgentClasses() throws Exception { // Install a CodeOriginProbe targeting the agent's Types class by FQN. // This simulates a probe accidentally matching an agent class (e.g. via simple-name fallback // in TransformerDefinitionMatcher when a user class is also named "Types"). - CodeOriginProbe probe = - new CodeOriginProbe( - PROBE_ID, - true, - Where.of("com.datadog.debugger.instrumentation.Types", "descriptorToSignature", null)); + CodeOriginProbe probe = new CodeOriginProbe( + PROBE_ID, + true, + Where.of("com.datadog.debugger.instrumentation.Types", "descriptorToSignature", null)); installProbes(probe); byte[] typeBytes = getClassFileBytes(Types.class); // transform() proceeds to performInstrumentation(), which calls // CodeOriginInstrumenter.codeOriginCall() → accesses Types.DEBUGGER_CONTEXT_TYPE. // In production (when Types is not yet loaded), this re-enters DatadogClassLoader.loadClass() // and triggers LinkageError: duplicate class definition for Types. - byte[] result = - currentTransformer.transform( - Types.class.getClassLoader(), - "com/datadog/debugger/instrumentation/Types", - null, - null, - typeBytes); + byte[] result = currentTransformer.transform( + Types.class.getClassLoader(), + "com/datadog/debugger/instrumentation/Types", + null, + null, + typeBytes); assertNull(result); } @@ -3331,12 +3199,11 @@ private TestSnapshotListener setupInstrumentTheWorldTransformer( when(config.getDynamicInstrumentationUploadBatchSize()).thenReturn(100); TestSnapshotListener listener = new TestSnapshotListener(config, mock(ProbeStatusSink.class)); DebuggerAgentHelper.injectSink(listener); - currentTransformer = - DebuggerAgent.setupInstrumentTheWorldTransformer( - config, - instr, - new DebuggerSink( - config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); + currentTransformer = DebuggerAgent.setupInstrumentTheWorldTransformer( + config, + instr, + new DebuggerSink( + config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); DebuggerContext.initClassFilter(new DenyListHelper(null)); return listener; } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java index 4fa605c2cc1..5bb62d0e66e 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java @@ -84,7 +84,8 @@ protected void assertCaptureArgs( } protected void assertCaptureFieldCount(CapturedContext context, int expectedFieldCount) { - assertEquals(expectedFieldCount, getFields(context.getArguments().get("this")).size()); + assertEquals( + expectedFieldCount, getFields(context.getArguments().get("this")).size()); } public static Map getFields( @@ -111,14 +112,16 @@ public static Map getFields( protected void assertCaptureFields( CapturedContext context, String name, String typeName, String value) { - CapturedContext.CapturedValue field = getFields(context.getArguments().get("this")).get(name); + CapturedContext.CapturedValue field = + getFields(context.getArguments().get("this")).get(name); assertEquals(typeName, field.getType()); assertEquals(value, MoshiSnapshotTestHelper.getValue(field)); } protected void assertCaptureFields( CapturedContext context, String name, String typeName, Collection collection) { - CapturedContext.CapturedValue field = getFields(context.getArguments().get("this")).get(name); + CapturedContext.CapturedValue field = + getFields(context.getArguments().get("this")).get(name); assertEquals(typeName, field.getType()); Iterator iterator = collection.iterator(); for (Object obj : getCollection(field)) { @@ -162,7 +165,8 @@ private static Collection getCollection(CapturedContext.CapturedValue capture protected void assertCaptureFields( CapturedContext context, String name, String typeName, Map expectedMap) { - CapturedContext.CapturedValue field = getFields(context.getArguments().get("this")).get(name); + CapturedContext.CapturedValue field = + getFields(context.getArguments().get("this")).get(name); assertEquals(typeName, field.getType()); Map map = getMap(field); assertEquals(expectedMap.size(), map.size()); @@ -198,7 +202,8 @@ private Map getMap(CapturedContext.CapturedValue capturedValue) protected void assertCaptureFieldsNotCaptured( CapturedContext context, String name, String expectedReasonRegEx) { - CapturedContext.CapturedValue field = getFields(context.getArguments().get("this")).get(name); + CapturedContext.CapturedValue field = + getFields(context.getArguments().get("this")).get(name); assertTrue( field.getNotCapturedReason().matches(expectedReasonRegEx), field.getNotCapturedReason()); } @@ -305,8 +310,10 @@ protected static LogProbe createLineProbe(ProbeId id, String sourceFile, int lin } protected TestSnapshotListener installProbes(ProbeDefinition... probes) { - return installProbes( - Configuration.builder().setService(CapturedSnapshotTest.SERVICE_NAME).add(probes).build()); + return installProbes(Configuration.builder() + .setService(CapturedSnapshotTest.SERVICE_NAME) + .add(probes) + .build()); } public static LogProbe.Builder createProbeBuilder( @@ -335,20 +342,18 @@ protected TestSnapshotListener installProbes(Configuration configuration) { instrumentationListener = new MockInstrumentationListener(); probeStatusSink = mock(ProbeStatusSink.class); TestSnapshotListener listener = new TestSnapshotListener(config, probeStatusSink); - configurationUpdater = - new ConfigurationUpdater( - instr, - DebuggerTransformer::new, - config, - new DebuggerSink(config, probeStatusSink), - new ClassesToRetransformFinder()); - currentTransformer = - new DebuggerTransformer( - config, - configuration, - instrumentationListener, - configurationUpdater.getProbeMetadata(), - listener); + configurationUpdater = new ConfigurationUpdater( + instr, + DebuggerTransformer::new, + config, + new DebuggerSink(config, probeStatusSink), + new ClassesToRetransformFinder()); + currentTransformer = new DebuggerTransformer( + config, + configuration, + instrumentationListener, + configurationUpdater.getProbeMetadata(), + listener); instr.addTransformer(currentTransformer); DebuggerAgentHelper.injectSink(listener); DebuggerContext.initProbeResolver(configurationUpdater::resolve); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationComparerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationComparerTest.java index 044aa39bd1a..838e4622b0f 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationComparerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationComparerTest.java @@ -31,14 +31,12 @@ class ConfigurationComparerTest { @Test public void newDefinitions() { Configuration empty = createConfig(Collections.emptyList()); - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); - ConfigurationComparer configurationComparer = - new ConfigurationComparer( - empty, createConfig(Collections.singletonList(probe)), emptyMap()); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); + ConfigurationComparer configurationComparer = new ConfigurationComparer( + empty, createConfig(Collections.singletonList(probe)), emptyMap()); Collection addedDefinitions = configurationComparer.getAddedDefinitions(); Assertions.assertEquals(1, addedDefinitions.size()); Assertions.assertTrue(addedDefinitions.contains(probe)); @@ -48,14 +46,12 @@ public void newDefinitions() { @Test public void removeDefinitions() { Configuration empty = createConfig(Collections.emptyList()); - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); - ConfigurationComparer configurationComparer = - new ConfigurationComparer( - createConfig(Collections.singletonList(probe)), empty, emptyMap()); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); + ConfigurationComparer configurationComparer = new ConfigurationComparer( + createConfig(Collections.singletonList(probe)), empty, emptyMap()); Collection removedDefinitions = configurationComparer.getRemovedDefinitions(); Assertions.assertEquals(1, removedDefinitions.size()); Assertions.assertTrue(removedDefinitions.contains(probe)); @@ -72,11 +68,10 @@ public void hasProbeRelatedChangesEmpty() { @Test public void hasProbeRelatedChangesSame() { - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); Configuration config = createConfig(Collections.singletonList(probe)); ConfigurationComparer configurationComparer = new ConfigurationComparer(config, config, emptyMap()); @@ -86,11 +81,10 @@ public void hasProbeRelatedChangesSame() { @Test public void hasProbeRelatedChangesAdded() { Configuration empty = createConfig(Collections.emptyList()); - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); Configuration config = createConfig(Collections.singletonList(probe)); ConfigurationComparer configurationComparer = new ConfigurationComparer(empty, config, emptyMap()); @@ -102,11 +96,10 @@ public void hasProbeRelatedChangesAdded() { @Test public void hasProbeRelatedChangesRemoved() { Configuration empty = createConfig(Collections.emptyList()); - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); Configuration config = createConfig(Collections.singletonList(probe)); ConfigurationComparer configurationComparer = new ConfigurationComparer(config, empty, emptyMap()); @@ -117,59 +110,56 @@ public void hasProbeRelatedChangesRemoved() { @Test public void addDuplicate() { - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID1) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID1) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); Configuration singleProbeConfig = createConfig(Collections.singletonList(probe)); - LogProbe duplicatedProbe = - LogProbe.builder() - .probeId(PROBE_ID2) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe duplicatedProbe = LogProbe.builder() + .probeId(PROBE_ID2) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); Configuration duplicatedProbeConfig = createConfig(Arrays.asList(probe, duplicatedProbe)); ConfigurationComparer configurationComparer = new ConfigurationComparer(singleProbeConfig, duplicatedProbeConfig, emptyMap()); Assertions.assertTrue(configurationComparer.hasProbeRelatedChanges()); Assertions.assertFalse(configurationComparer.getAddedDefinitions().isEmpty()); - ProbeDefinition added = configurationComparer.getAddedDefinitions().iterator().next(); + ProbeDefinition added = + configurationComparer.getAddedDefinitions().iterator().next(); Assertions.assertEquals(duplicatedProbe, added); Assertions.assertTrue(configurationComparer.getRemovedDefinitions().isEmpty()); } @Test public void removeDuplicate() { - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID1) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID1) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); Configuration singleProbeConfig = createConfig(Collections.singletonList(probe)); - LogProbe duplicatedProbe = - LogProbe.builder() - .probeId(PROBE_ID2) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe duplicatedProbe = LogProbe.builder() + .probeId(PROBE_ID2) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); Configuration duplicatedProbeConfig = createConfig(Arrays.asList(probe, duplicatedProbe)); ConfigurationComparer configurationComparer = new ConfigurationComparer(duplicatedProbeConfig, singleProbeConfig, emptyMap()); Assertions.assertTrue(configurationComparer.hasProbeRelatedChanges()); Assertions.assertTrue(configurationComparer.getAddedDefinitions().isEmpty()); Assertions.assertFalse(configurationComparer.getRemovedDefinitions().isEmpty()); - ProbeDefinition removed = configurationComparer.getRemovedDefinitions().iterator().next(); + ProbeDefinition removed = + configurationComparer.getRemovedDefinitions().iterator().next(); Assertions.assertEquals(duplicatedProbe, removed); } @Test public void hasProbeRelatedChangesFilteredChanged() { Configuration empty = createConfig(Collections.emptyList()); - Configuration config = - Configuration.builder() - .setService(SERVICE_NAME) - .addAllowList( - new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) - .build(); + Configuration config = Configuration.builder() + .setService(SERVICE_NAME) + .addAllowList( + new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) + .build(); ConfigurationComparer configurationComparer = new ConfigurationComparer(empty, config, emptyMap()); Assertions.assertTrue(configurationComparer.hasProbeRelatedChanges()); @@ -177,48 +167,49 @@ public void hasProbeRelatedChangesFilteredChanged() { @Test public void hasProbeRelatedChangesWhenAllowListAddedWithProbe() { - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where("com.datadog.Blocked", "method", null).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where("com.datadog.Blocked", "method", null) + .build(); Map instrumentationResults = new HashMap<>(); instrumentationResults.put( probe.getProbeId().getEncodedId(), InstrumentationResult.Factory.blocked(probe.getWhere().getTypeName())); Configuration noFilterConfig = createConfig(Collections.singletonList(probe)); - Configuration config = - Configuration.builder() - .add(probe) - .addAllowList( - new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) - .build(); + Configuration config = Configuration.builder() + .add(probe) + .addAllowList( + new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) + .build(); ConfigurationComparer configurationComparer = new ConfigurationComparer(noFilterConfig, config, instrumentationResults); ClassesToRetransformFinder finder = new ClassesToRetransformFinder(); Assertions.assertTrue(configurationComparer.hasProbeRelatedChanges()); Assertions.assertTrue(finder.getAllChangedClasses(configurationComparer).isEmpty()); - Configuration changedAllowedList = - Configuration.builder() - .add(probe) - .addAllowList( - new Configuration.FilterList(Arrays.asList("com.datacat"), Collections.emptyList())) - .build(); + Configuration changedAllowedList = Configuration.builder() + .add(probe) + .addAllowList( + new Configuration.FilterList(Arrays.asList("com.datacat"), Collections.emptyList())) + .build(); ConfigurationComparer configurationComparer2 = new ConfigurationComparer(config, changedAllowedList, instrumentationResults); Assertions.assertTrue(configurationComparer2.hasProbeRelatedChanges()); Assertions.assertTrue(configurationComparer2.getAddedDefinitions().isEmpty()); Assertions.assertTrue(configurationComparer2.getRemovedDefinitions().isEmpty()); ClassesToRetransformFinder finder2 = new ClassesToRetransformFinder(); - Assertions.assertTrue( - finder2 - .getAllChangedClasses(configurationComparer2) - .contains(reverseStr(probe.getWhere().getTypeName()))); + Assertions.assertTrue(finder2 + .getAllChangedClasses(configurationComparer2) + .contains(reverseStr(probe.getWhere().getTypeName()))); } @Test public void hasProbeRelatedChangesWhenDenyListAddedWithProbe() { - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where("com.datadog.Blocked", "method", null).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where("com.datadog.Blocked", "method", null) + .build(); Map instrumentationResults = new HashMap<>(); instrumentationResults.put( @@ -226,26 +217,26 @@ public void hasProbeRelatedChangesWhenDenyListAddedWithProbe() { new InstrumentationResult( InstrumentationResult.Status.INSTALLED, "com.datadog.Blocked", "method")); Configuration noFilterConfig = createConfig(Collections.singletonList(probe)); - Configuration config = - Configuration.builder() - .add(probe) - .addDenyList( - new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) - .build(); + Configuration config = Configuration.builder() + .add(probe) + .addDenyList( + new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) + .build(); ConfigurationComparer configurationComparer = new ConfigurationComparer(noFilterConfig, config, instrumentationResults); Assertions.assertTrue(configurationComparer.hasProbeRelatedChanges()); ClassesToRetransformFinder finder = new ClassesToRetransformFinder(); - Assertions.assertTrue( - finder - .getAllChangedClasses(configurationComparer) - .contains(reverseStr(probe.getWhere().getTypeName()))); + Assertions.assertTrue(finder + .getAllChangedClasses(configurationComparer) + .contains(reverseStr(probe.getWhere().getTypeName()))); } @Test public void hasProbeRelatedChangesWhenChangeDenyListAndAddingProbe() { - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where("com.datadog.Blocked", "method", null).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where("com.datadog.Blocked", "method", null) + .build(); Map instrumentationResults = new HashMap<>(); @@ -253,20 +244,18 @@ public void hasProbeRelatedChangesWhenChangeDenyListAndAddingProbe() { instrumentationResults.put( probe.getId(), InstrumentationResult.Factory.blocked(probe.getWhere().getTypeName())); Configuration empty = createConfig(Collections.emptyList()); - Configuration config = - Configuration.builder() - .add(probe) - .addDenyList( - new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) - .build(); + Configuration config = Configuration.builder() + .add(probe) + .addDenyList( + new Configuration.FilterList(Arrays.asList("com.datadog"), Collections.emptyList())) + .build(); ConfigurationComparer configurationComparer = new ConfigurationComparer(empty, config, emptyMap()); Assertions.assertTrue(configurationComparer.hasProbeRelatedChanges()); ClassesToRetransformFinder finder = new ClassesToRetransformFinder(); - Assertions.assertTrue( - finder - .getAllChangedClasses(configurationComparer) - .contains(reverseStr(probe.getWhere().getTypeName()))); + Assertions.assertTrue(finder + .getAllChangedClasses(configurationComparer) + .contains(reverseStr(probe.getWhere().getTypeName()))); // remove the filtered list and see it will be re-transformed. Configuration noFilterConfig = createConfig(Collections.singletonList(probe)); @@ -274,22 +263,18 @@ public void hasProbeRelatedChangesWhenChangeDenyListAndAddingProbe() { new ConfigurationComparer(config, noFilterConfig, instrumentationResults); Assertions.assertTrue(configurationComparer2.hasProbeRelatedChanges()); ClassesToRetransformFinder finder2 = new ClassesToRetransformFinder(); - Assertions.assertTrue( - finder2 - .getAllChangedClasses(configurationComparer2) - .contains(reverseStr(probe.getWhere().getTypeName()))); + Assertions.assertTrue(finder2 + .getAllChangedClasses(configurationComparer2) + .contains(reverseStr(probe.getWhere().getTypeName()))); } @Test public void changedClassesFQClassName() { Configuration empty = createConfig(Collections.emptyList()); - Configuration config = - createConfig( - Arrays.asList( - LogProbe.builder() - .probeId(PROBE_ID) - .where("java.lang.String", "indexOf", null) - .build())); + Configuration config = createConfig(Arrays.asList(LogProbe.builder() + .probeId(PROBE_ID) + .where("java.lang.String", "indexOf", null) + .build())); ConfigurationComparer configurationComparer = new ConfigurationComparer(empty, config, emptyMap()); ClassesToRetransformFinder finder = new ClassesToRetransformFinder(); @@ -300,10 +285,8 @@ public void changedClassesFQClassName() { @Test public void changedClassesSimpleClassName() { Configuration empty = createConfig(Collections.emptyList()); - Configuration config = - createConfig( - Arrays.asList( - LogProbe.builder().probeId(PROBE_ID).where("String", "indexOf", null).build())); + Configuration config = createConfig(Arrays.asList( + LogProbe.builder().probeId(PROBE_ID).where("String", "indexOf", null).build())); ConfigurationComparer configurationComparer = new ConfigurationComparer(empty, config, emptyMap()); ClassesToRetransformFinder finder = new ClassesToRetransformFinder(); @@ -314,13 +297,10 @@ public void changedClassesSimpleClassName() { @Test public void changedClassesFullPath() { Configuration empty = createConfig(Collections.emptyList()); - Configuration config = - createConfig( - Arrays.asList( - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build())); + Configuration config = createConfig(Arrays.asList(LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build())); ConfigurationComparer configurationComparer = new ConfigurationComparer(empty, config, emptyMap()); ClassesToRetransformFinder finder = new ClassesToRetransformFinder(); @@ -331,45 +311,48 @@ public void changedClassesFullPath() { @Test public void allLoadedChangedClassesType() { - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "indexOf").build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where("java.lang.String", "indexOf") + .build(); doAllLoadedChangedClasses(probe, emptyMap(), String.class, false, String.class, HashMap.class); doAllLoadedChangedClasses(probe, emptyMap(), null, false, HashMap.class); } @Test public void allLoadedChangedClassesSimpleType() { - LogProbe probe = LogProbe.builder().probeId(PROBE_ID).where("String", "indexOf").build(); + LogProbe probe = + LogProbe.builder().probeId(PROBE_ID).where("String", "indexOf").build(); doAllLoadedChangedClasses(probe, emptyMap(), String.class, false, String.class, HashMap.class); doAllLoadedChangedClasses(probe, emptyMap(), null, false, HashMap.class); } @Test public void allLoadedChangedClasses() { - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build(); doAllLoadedChangedClasses(probe, emptyMap(), String.class, false, String.class, HashMap.class); doAllLoadedChangedClasses(probe, emptyMap(), null, false, HashMap.class); } @Test public void allLoadedChangedClassesSimpleFileName() { - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where(null, null, null, 1966, "String.java").build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "String.java") + .build(); doAllLoadedChangedClasses(probe, emptyMap(), String.class, false, String.class, HashMap.class); doAllLoadedChangedClasses(probe, emptyMap(), null, false, HashMap.class); } @Test public void allLoadedChangedClassesTypeTopLevelClass() { - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where("com.datadog.debugger.agent.MyTopLevelClass", "process") - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where("com.datadog.debugger.agent.MyTopLevelClass", "process") + .build(); doAllLoadedChangedClasses( probe, emptyMap(), MyTopLevelClass.class, true, MyTopLevelClass.class); } @@ -388,8 +371,10 @@ public void allLoadedChangedClassesTopLevelClassFileName() { Map> sourceFileMapping = new HashMap<>(); String simpleSourceFile = CLASS_FILENAME.substring(CLASS_FILENAME.lastIndexOf('/') + 1); sourceFileMapping.put(simpleSourceFile, Arrays.asList(MyTopLevelClass.class.getTypeName())); - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where(null, null, null, 8, CLASS_FILENAME).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 8, CLASS_FILENAME) + .build(); doAllLoadedChangedClasses( probe, sourceFileMapping, MyTopLevelClass.class, true, MyTopLevelClass.class); doAllLoadedChangedClasses( @@ -401,8 +386,10 @@ public void allLoadedChangedClassesTopLevelClassSimpleFileName() { final String CLASS_FILENAME = "TopLevelHelper.java"; Map> sourceFileMapping = new HashMap<>(); sourceFileMapping.put(CLASS_FILENAME, Arrays.asList(MyTopLevelClass.class.getTypeName())); - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where(null, null, null, 8, CLASS_FILENAME).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 8, CLASS_FILENAME) + .build(); doAllLoadedChangedClasses( probe, sourceFileMapping, TopLevelHelper.class, false, TopLevelHelper.class); doAllLoadedChangedClasses( @@ -419,8 +406,10 @@ public void allLoadedChangedClassesLargeInnerClasses() { String.format("com.datadog.debugger.agent.LargeInnerClasses$MyInnerClass%02d", i)); } sourceFileMapping.put(CLASS_FILENAME, classNames); - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where(null, null, null, 6, CLASS_FILENAME).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 6, CLASS_FILENAME) + .build(); doAllLoadedChangedClasses( probe, sourceFileMapping, LargeInnerClasses.class, false, LargeInnerClasses.class); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java index 16c13a783d1..6a58825188c 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java @@ -19,8 +19,8 @@ class ConfigurationFileLoaderTest { @Test public void load() throws Exception { - Path probeFilePath = - Paths.get(ConfigurationFileLoaderTest.class.getResource("/test_probe_file.json").toURI()); + Path probeFilePath = Paths.get( + ConfigurationFileLoaderTest.class.getResource("/test_probe_file.json").toURI()); Configuration configuration = ConfigurationFileLoader.from(probeFilePath, 1024 * 1024); assertNotNull(configuration); List definitions = configuration.getDefinitions(); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationTest.java index b0413b63a08..6a15a7dd62c 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationTest.java @@ -92,7 +92,8 @@ public void deserializeSpanDecorationProbes() throws Exception { "uuid == 'showMe'", spanDecorationProbes.get(0).getDecorations().get(0).getWhen().getDslExpression()); assertEquals( - "uuid", spanDecorationProbes.get(0).getDecorations().get(0).getTags().get(0).getName()); + "uuid", + spanDecorationProbes.get(0).getDecorations().get(0).getTags().get(0).getName()); assertEquals( "uuid={uuid}", spanDecorationProbes @@ -107,11 +108,15 @@ public void deserializeSpanDecorationProbes() throws Exception { SpanDecorationProbe.TargetSpan.ACTIVE, spanDecorationProbes.get(1).getTargetSpan()); assertNull(spanDecorationProbes.get(1).getDecorations().get(0).getWhen()); assertEquals( - "uuid", spanDecorationProbes.get(1).getDecorations().get(0).getTags().get(0).getName()); + "uuid", + spanDecorationProbes.get(1).getDecorations().get(0).getTags().get(0).getName()); assertEquals( - "tag2", spanDecorationProbes.get(1).getDecorations().get(0).getTags().get(1).getName()); - assertEquals(SpanDecorationProbe.TargetSpan.ROOT, spanDecorationProbes.get(2).getTargetSpan()); - assertEquals(SpanDecorationProbe.TargetSpan.ROOT, spanDecorationProbes.get(3).getTargetSpan()); + "tag2", + spanDecorationProbes.get(1).getDecorations().get(0).getTags().get(1).getName()); + assertEquals( + SpanDecorationProbe.TargetSpan.ROOT, spanDecorationProbes.get(2).getTargetSpan()); + assertEquals( + SpanDecorationProbe.TargetSpan.ROOT, spanDecorationProbes.get(3).getTargetSpan()); } @Test @@ -129,7 +134,8 @@ public void deserializeLogProbes() throws Exception { assertEquals("env", logProbe0.getTags()[1].getKey()); assertEquals("staging", logProbe0.getTags()[1].getValue()); assertEquals(8, logProbe0.getSegments().size()); - assertEquals("this is a log line customized! uuid=", logProbe0.getSegments().get(0).getStr()); + assertEquals( + "this is a log line customized! uuid=", logProbe0.getSegments().get(0).getStr()); assertEquals("uuid", logProbe0.getSegments().get(1).getExpr()); assertEquals(" result=", logProbe0.getSegments().get(2).getStr()); assertEquals("result", logProbe0.getSegments().get(3).getExpr()); @@ -139,13 +145,16 @@ public void deserializeLogProbes() throws Exception { assertEquals("contains(arg, 'foo')", logProbe0.getSegments().get(7).getExpr()); LogProbe logProbe1 = logProbes.get(1); assertEquals(2, logProbe1.getCaptureExpressions().size()); - LogProbe.CaptureExpression captureExpression0 = logProbe1.getCaptureExpressions().get(0); + LogProbe.CaptureExpression captureExpression0 = + logProbe1.getCaptureExpressions().get(0); assertEquals("uuid", captureExpression0.getName()); assertEquals("uuid", captureExpression0.getExpr().getDsl()); assertEquals(5, captureExpression0.getCapture().getMaxReferenceDepth()); - LogProbe.CaptureExpression captureExpression1 = logProbe1.getCaptureExpressions().get(1); + LogProbe.CaptureExpression captureExpression1 = + logProbe1.getCaptureExpressions().get(1); assertEquals("field1_map_key_array_3_field2", captureExpression1.getName()); - assertEquals("field1.map['key'].array[3].field2", captureExpression1.getExpr().getDsl()); + assertEquals( + "field1.map['key'].array[3].field2", captureExpression1.getExpr().getDsl()); assertNull(captureExpression1.getCapture()); } @@ -264,47 +273,43 @@ private void deserialize(String buffer) throws IOException { assertEquals("12-23", spanProbe2.getWhere().getLines()[0]); // span decoration probe assertEquals(1, config0.getSpanDecorationProbes().size()); - SpanDecorationProbe spanDecoration1 = config0.getSpanDecorationProbes().iterator().next(); + SpanDecorationProbe spanDecoration1 = + config0.getSpanDecorationProbes().iterator().next(); assertEquals(SpanDecorationProbe.TargetSpan.ACTIVE, spanDecoration1.getTargetSpan()); assertEquals( "arg1 == 'foo'", spanDecoration1.getDecorations().get(0).getWhen().getDslExpression()); assertEquals("id", spanDecoration1.getDecorations().get(0).getTags().get(0).getName()); assertEquals( - "{id}", spanDecoration1.getDecorations().get(0).getTags().get(0).getValue().getTemplate()); + "{id}", + spanDecoration1.getDecorations().get(0).getTags().get(0).getValue().getTemplate()); } private Configuration createConfig1() { LogProbe probe1 = createProbe("probe1", "java.lang.String", "indexOf", "(String)"); MetricProbe metric1 = createMetric("metric1", "metric_count", COUNT, "java.lang.String", "indexOf", "(String)"); - LogProbe log1 = - createLog( - "log1", "this is a log line with arg={arg}", "java.lang.String", "indexOf", "(String)"); + LogProbe log1 = createLog( + "log1", "this is a log line with arg={arg}", "java.lang.String", "indexOf", "(String)"); SpanProbe span1 = createSpan("span1", "java.lang.String", "indexOf", "(String)"); - TriggerProbe triggerProbe = - createTriggerProbe("debug1", "java.lang.String", "indexOf", "(String)") - .setSampling(new Sampling(47, 12.0)); + TriggerProbe triggerProbe = createTriggerProbe( + "debug1", "java.lang.String", "indexOf", "(String)") + .setSampling(new Sampling(47, 12.0)); - SpanDecorationProbe.Decoration decoration = - new SpanDecorationProbe.Decoration( - new ProbeCondition( - DSL.when(DSL.eq(DSL.ref("arg1"), DSL.value("foo"))), "arg1 == 'foo'"), - asList( - new SpanDecorationProbe.Tag( - "id", new SpanDecorationProbe.TagValue("{id}", parseTemplate("{id}"))))); - SpanDecorationProbe spanDecoration1 = - createDecorationSpan( - "decorateSpan1", - SpanDecorationProbe.TargetSpan.ACTIVE, - decoration, - "java.lang.String", - "indexOf", - "(String)"); + SpanDecorationProbe.Decoration decoration = new SpanDecorationProbe.Decoration( + new ProbeCondition(DSL.when(DSL.eq(DSL.ref("arg1"), DSL.value("foo"))), "arg1 == 'foo'"), + asList(new SpanDecorationProbe.Tag( + "id", new SpanDecorationProbe.TagValue("{id}", parseTemplate("{id}"))))); + SpanDecorationProbe spanDecoration1 = createDecorationSpan( + "decorateSpan1", + SpanDecorationProbe.TargetSpan.ACTIVE, + decoration, + "java.lang.String", + "indexOf", + "(String)"); Configuration.FilterList allowList = new Configuration.FilterList(asList("java.lang.util"), asList("java.lang.String")); - Configuration.FilterList denyList = - new Configuration.FilterList( - asList("java.security"), asList("javax.security.auth.AuthPermission")); + Configuration.FilterList denyList = new Configuration.FilterList( + asList("java.security"), asList("javax.security.auth.AuthPermission")); LogProbe.Sampling globalSampling = new LogProbe.Sampling(10.0); return new Configuration( "service1", @@ -318,37 +323,33 @@ private Configuration createConfig2() { LogProbe probe2 = createProbe("probe2", "java.util.Map", "put", null); MetricProbe metric2 = createMetric("metric2", "metric_gauge", GAUGE, "java.lang.String", "indexOf", "(String)"); - LogProbe log2 = - createLog( - "log2", - "{transactionId}={transactionStatus}, remaining: {{{count(transactions)}}}", - "java.lang.String", - "indexOf", - "(String)"); + LogProbe log2 = createLog( + "log2", + "{transactionId}={transactionStatus}, remaining: {{{count(transactions)}}}", + "java.lang.String", + "indexOf", + "(String)"); SpanProbe span2 = createSpan("span2", "String.java", 12, 23); TriggerProbe triggerProbe = createTriggerProbe("debug1", "String.java", "indexOf", "(String)"); - SpanDecorationProbe.Decoration decoration = - new SpanDecorationProbe.Decoration( - new ProbeCondition(DSL.when(DSL.eq(DSL.ref("arg"), DSL.value("foo"))), "arg == 'foo'"), - asList( - new SpanDecorationProbe.Tag( - "tag1", new SpanDecorationProbe.TagValue("{arg1}", parseTemplate("{arg1}"))), - new SpanDecorationProbe.Tag( - "tag2", new SpanDecorationProbe.TagValue("{arg2}", parseTemplate("{arg2}"))))); - SpanDecorationProbe spanDecoration2 = - createDecorationSpan( - "span2", - SpanDecorationProbe.TargetSpan.ACTIVE, - decoration, - "String.java", - "indexOf", - "(String)"); + SpanDecorationProbe.Decoration decoration = new SpanDecorationProbe.Decoration( + new ProbeCondition(DSL.when(DSL.eq(DSL.ref("arg"), DSL.value("foo"))), "arg == 'foo'"), + asList( + new SpanDecorationProbe.Tag( + "tag1", new SpanDecorationProbe.TagValue("{arg1}", parseTemplate("{arg1}"))), + new SpanDecorationProbe.Tag( + "tag2", new SpanDecorationProbe.TagValue("{arg2}", parseTemplate("{arg2}"))))); + SpanDecorationProbe spanDecoration2 = createDecorationSpan( + "span2", + SpanDecorationProbe.TargetSpan.ACTIVE, + decoration, + "String.java", + "indexOf", + "(String)"); Configuration.FilterList allowList = new Configuration.FilterList(asList("java.lang.util"), asList("java.lang.String")); - Configuration.FilterList denyList = - new Configuration.FilterList( - asList("java.security"), asList("javax.security.auth.AuthPermission")); + Configuration.FilterList denyList = new Configuration.FilterList( + asList("java.security"), asList("javax.security.auth.AuthPermission")); LogProbe.Sampling globalSampling = new LogProbe.Sampling(10.0); return new Configuration( "service2", diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationUpdaterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationUpdaterTest.java index c272c1d3147..362a8d48bca 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationUpdaterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationUpdaterTest.java @@ -83,11 +83,20 @@ public class ConfigurationUpdaterTest { private static final ProbeId SPAN_DECORATION_ID = new ProbeId("cfbf2918-e4c1-5fb9-b85e-937881d6f7e9", 1); - @Mock private Instrumentation inst; - @Mock private DebuggerTransformer transformer; - @Mock private Config tracerConfig; - @Mock private DebuggerSink debuggerSink; - @Mock private ProbeStatusSink probeStatusSink; + @Mock + private Instrumentation inst; + + @Mock + private DebuggerTransformer transformer; + + @Mock + private Config tracerConfig; + + @Mock + private DebuggerSink debuggerSink; + + @Mock + private ProbeStatusSink probeStatusSink; private DebuggerSink debuggerSinkWithMockStatusSink; @@ -112,9 +121,8 @@ public void acceptNoProbes() { public void acceptNewProbe() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - List logProbes = - singletonList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); + List logProbes = singletonList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -138,11 +146,11 @@ private void doTestAcceptMultiProbes(Function, String> getClassName, Cl throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(classes); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - List logProbes = - Arrays.stream(classes) - .map(getClassName) - .map(className -> LogProbe.builder().probeId(PROBE_ID).where(className, "foo").build()) - .collect(Collectors.toList()); + List logProbes = Arrays.stream(classes) + .map(getClassName) + .map(className -> + LogProbe.builder().probeId(PROBE_ID).where(className, "foo").build()) + .collect(Collectors.toList()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -156,10 +164,12 @@ private void doTestAcceptMultiProbes(Function, String> getClassName, Cl public void acceptDuplicatedProbes() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - List logProbes = - Arrays.asList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build(), - LogProbe.builder().probeId(PROBE_ID2).where("java.lang.String", "concat").build()); + List logProbes = Arrays.asList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build(), + LogProbe.builder() + .probeId(PROBE_ID2) + .where("java.lang.String", "concat") + .build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -176,9 +186,8 @@ public void accept2PhaseDuplicatedProbes() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); // phase 1: single probe definition - List logProbes = - Arrays.asList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); + List logProbes = Arrays.asList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -186,10 +195,12 @@ public void accept2PhaseDuplicatedProbes() { assertEquals(1, appliedDefinitions.size()); assertTrue(appliedDefinitions.containsKey(PROBE_ID.getEncodedId())); // phase 2: add duplicated probe definitions - logProbes = - Arrays.asList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build(), - LogProbe.builder().probeId(PROBE_ID2).where("java.lang.String", "concat").build()); + logProbes = Arrays.asList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build(), + LogProbe.builder() + .probeId(PROBE_ID2) + .where("java.lang.String", "concat") + .build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); appliedDefinitions = configurationUpdater.getAppliedDefinitions(); assertEquals(2, appliedDefinitions.size()); @@ -203,10 +214,12 @@ public void acceptRemoveDuplicatedProbes() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); // phase 1: duplicated probe definition - List logProbes = - Arrays.asList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build(), - LogProbe.builder().probeId(PROBE_ID2).where("java.lang.String", "concat").build()); + List logProbes = Arrays.asList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build(), + LogProbe.builder() + .probeId(PROBE_ID2) + .where("java.lang.String", "concat") + .build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -215,9 +228,8 @@ public void acceptRemoveDuplicatedProbes() { assertTrue(appliedDefinitions.containsKey(PROBE_ID.getEncodedId())); assertTrue(appliedDefinitions.containsKey(PROBE_ID2.getEncodedId())); // phase 2: remove duplicated probe definitions - logProbes = - Arrays.asList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); + logProbes = Arrays.asList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); appliedDefinitions = configurationUpdater.getAppliedDefinitions(); assertEquals(1, appliedDefinitions.size()); @@ -231,12 +243,12 @@ public void acceptRemoveDuplicatedProbes() { public void acceptDontDedupMetricProbes() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - List logProbes = - Arrays.asList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); - List metricProbes = - Arrays.asList( - MetricProbe.builder().probeId(METRIC_ID).where("java.lang.String", "concat").build()); + List logProbes = Arrays.asList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); + List metricProbes = Arrays.asList(MetricProbe.builder() + .probeId(METRIC_ID) + .where("java.lang.String", "concat") + .build()); List definitions = new ArrayList<>(metricProbes); definitions.addAll(logProbes); configurationUpdater.accept(REMOTE_CONFIG, definitions); @@ -254,12 +266,10 @@ public void acceptDontDedupMetricProbes() { public void acceptSourceFileLineNumber() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - singletonList( - LogProbe.builder() - .probeId(PROBE_ID) - .where(null, null, null, 1966, "src/main/java/java/lang/String.java") - .build()); + List logProbes = singletonList(LogProbe.builder() + .probeId(PROBE_ID) + .where(null, null, null, 1966, "src/main/java/java/lang/String.java") + .build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -272,19 +282,16 @@ public void acceptSourceFileLineNumber() throws UnmodifiableClassException { @Test public void acceptSourceFileLineNumberEmptyTypeName() throws UnmodifiableClassException { // create anonymous class for dealing with Class#getSimpleName returning empty string for it - Runnable runnable = - new Runnable() { - @Override - public void run() {} - }; + Runnable runnable = new Runnable() { + @Override + public void run() {} + }; when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class, runnable.getClass()}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - singletonList( - LogProbe.builder() - .probeId(PROBE_ID) - .where("", "", "", 1966, "java/lang/String.java") - .build()); + List logProbes = singletonList(LogProbe.builder() + .probeId(PROBE_ID) + .where("", "", "", 1966, "java/lang/String.java") + .build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -296,19 +303,16 @@ public void run() {} @Test public void acceptSourceFileLineNumberAnonymousClass() throws UnmodifiableClassException { - Runnable runnable = - new Runnable() { - @Override - public void run() {} - }; + Runnable runnable = new Runnable() { + @Override + public void run() {} + }; when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class, runnable.getClass()}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - singletonList( - LogProbe.builder() - .probeId(PROBE_ID) - .where("", "", "", 136, "ConfigurationUpdaterTest$2") - .build()); + List logProbes = singletonList(LogProbe.builder() + .probeId(PROBE_ID) + .where("", "", "", 136, "ConfigurationUpdaterTest$2") + .build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -322,18 +326,16 @@ public void run() {} public void acceptDeleteProbe() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class, HashMap.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - LogProbe probe1 = - LogProbe.builder() - .language(LANGUAGE) - .probeId(PROBE_ID) - .where("java.lang.String", "concat") - .build(); - LogProbe probe2 = - LogProbe.builder() - .language(LANGUAGE) - .probeId(PROBE_ID2) - .where("java.util.HashMap", "", "void ()") - .build(); + LogProbe probe1 = LogProbe.builder() + .language(LANGUAGE) + .probeId(PROBE_ID) + .where("java.lang.String", "concat") + .build(); + LogProbe probe2 = LogProbe.builder() + .language(LANGUAGE) + .probeId(PROBE_ID2) + .where("java.util.HashMap", "", "void ()") + .build(); List logProbes = Arrays.asList(probe1, probe2); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(probeStatusSink).addReceived(eq(PROBE_ID)); @@ -357,28 +359,25 @@ public void acceptDeleteProbe() throws UnmodifiableClassException { public void acceptDeleteProbeSameClass() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); AtomicInteger expectedDefinitions = new AtomicInteger(2); - ConfigurationUpdater configurationUpdater = - new ConfigurationUpdater( - inst, - (tracerConfig, configuration, listener, probeMetadata, debuggerSink) -> { - assertEquals(expectedDefinitions.get(), configuration.getDefinitions().size()); - return transformer; - }, - tracerConfig, - debuggerSinkWithMockStatusSink, - new ClassesToRetransformFinder()); - LogProbe probe1 = - LogProbe.builder() - .language(LANGUAGE) - .probeId(PROBE_ID) - .where("java.lang.String", "concat") - .build(); - LogProbe probe2 = - LogProbe.builder() - .language(LANGUAGE) - .probeId(PROBE_ID2) - .where("java.lang.String", "indexOf", "int (int)") - .build(); + ConfigurationUpdater configurationUpdater = new ConfigurationUpdater( + inst, + (tracerConfig, configuration, listener, probeMetadata, debuggerSink) -> { + assertEquals(expectedDefinitions.get(), configuration.getDefinitions().size()); + return transformer; + }, + tracerConfig, + debuggerSinkWithMockStatusSink, + new ClassesToRetransformFinder()); + LogProbe probe1 = LogProbe.builder() + .language(LANGUAGE) + .probeId(PROBE_ID) + .where("java.lang.String", "concat") + .build(); + LogProbe probe2 = LogProbe.builder() + .language(LANGUAGE) + .probeId(PROBE_ID2) + .where("java.lang.String", "indexOf", "int (int)") + .build(); List logProbes = Arrays.asList(probe1, probe2); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(probeStatusSink).addReceived(eq(PROBE_ID)); @@ -402,9 +401,8 @@ public void acceptDeleteProbeSameClass() throws UnmodifiableClassException { public void acceptClearProbes() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - List logProbes = - singletonList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); + List logProbes = singletonList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(probeStatusSink).addReceived(eq(PROBE_ID)); configurationUpdater.accept(REMOTE_CONFIG, null); @@ -418,22 +416,20 @@ public void acceptClearProbes() throws UnmodifiableClassException { public void resolve() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - singletonList( - LogProbe.builder() - .probeId(PROBE_ID) - .where("java.lang.String", "concat") - .when( - new ProbeCondition( - DSL.when(DSL.eq(DSL.ref("arg"), DSL.value("foo"))), "arg == 'foo'")) - .build()); + List logProbes = singletonList(LogProbe.builder() + .probeId(PROBE_ID) + .where("java.lang.String", "concat") + .when( + new ProbeCondition(DSL.when(DSL.eq(DSL.ref("arg"), DSL.value("foo"))), "arg == 'foo'")) + .build()); logProbes.get(0).buildLocation(null); configurationUpdater.accept(REMOTE_CONFIG, logProbes); configurationUpdater.getProbeMetadata().addProbe(logProbes.get(0)); ProbeImplementation probeImplementation = configurationUpdater.resolve(0); Assertions.assertEquals( PROBE_ID.getEncodedId(), probeImplementation.getProbeId().getEncodedId()); - Assertions.assertEquals("java.lang.String", probeImplementation.getLocation().getType()); + Assertions.assertEquals( + "java.lang.String", probeImplementation.getLocation().getType()); Assertions.assertEquals("concat", probeImplementation.getLocation().getMethod()); Assertions.assertNotNull(((LogProbe) probeImplementation).getProbeCondition()); } @@ -442,9 +438,8 @@ public void resolve() { public void resolveFails() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - singletonList( - LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); + List logProbes = singletonList( + LogProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).retransformClasses(eq(String.class)); // simulate that there is a snapshot probe instrumentation left in HashMap class @@ -456,9 +451,10 @@ public void resolveFails() throws UnmodifiableClassException { public void acceptNewMetric() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List metricProbes = - singletonList( - MetricProbe.builder().probeId(METRIC_ID).where("java.lang.String", "concat").build()); + List metricProbes = singletonList(MetricProbe.builder() + .probeId(METRIC_ID) + .where("java.lang.String", "concat") + .build()); configurationUpdater.accept(REMOTE_CONFIG, metricProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -471,9 +467,8 @@ public void acceptNewMetric() { public void acceptNewLog() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - singletonList( - LogProbe.builder().probeId(LOG_ID).where("java.lang.String", "concat").build()); + List logProbes = singletonList( + LogProbe.builder().probeId(LOG_ID).where("java.lang.String", "concat").build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -486,18 +481,16 @@ public void acceptNewLog() { public void acceptDeleteMetric() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class, HashMap.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - MetricProbe metricProbe1 = - MetricProbe.builder() - .language(LANGUAGE) - .probeId(METRIC_ID) - .where("java.lang.String", "concat") - .build(); - MetricProbe metricProbe2 = - MetricProbe.builder() - .language(LANGUAGE) - .probeId(METRIC_ID2) - .where("java.util.HashMap", "", "void ()") - .build(); + MetricProbe metricProbe1 = MetricProbe.builder() + .language(LANGUAGE) + .probeId(METRIC_ID) + .where("java.lang.String", "concat") + .build(); + MetricProbe metricProbe2 = MetricProbe.builder() + .language(LANGUAGE) + .probeId(METRIC_ID2) + .where("java.util.HashMap", "", "void ()") + .build(); List metricProbes = Arrays.asList(metricProbe1, metricProbe2); configurationUpdater.accept(REMOTE_CONFIG, metricProbes); metricProbes = singletonList(metricProbe1); @@ -518,18 +511,16 @@ public void acceptDeleteMetric() throws UnmodifiableClassException { public void acceptDeleteLog() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class, HashMap.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - LogProbe logProbe1 = - LogProbe.builder() - .language(LANGUAGE) - .probeId(LOG_ID) - .where("java.lang.String", "concat") - .build(); - LogProbe logProbe2 = - LogProbe.builder() - .language(LANGUAGE) - .probeId(LOG_ID2) - .where("java.util.HashMap", "", "void ()") - .build(); + LogProbe logProbe1 = LogProbe.builder() + .language(LANGUAGE) + .probeId(LOG_ID) + .where("java.lang.String", "concat") + .build(); + LogProbe logProbe2 = LogProbe.builder() + .language(LANGUAGE) + .probeId(LOG_ID2) + .where("java.util.HashMap", "", "void ()") + .build(); List logProbes = Arrays.asList(logProbe1, logProbe2); configurationUpdater.accept(REMOTE_CONFIG, logProbes); logProbes = singletonList(logProbe1); @@ -550,9 +541,10 @@ public void acceptDeleteLog() throws UnmodifiableClassException { public void acceptClearMetrics() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List metricProbes = - singletonList( - MetricProbe.builder().probeId(METRIC_ID).where("java.lang.String", "concat").build()); + List metricProbes = singletonList(MetricProbe.builder() + .probeId(METRIC_ID) + .where("java.lang.String", "concat") + .build()); configurationUpdater.accept(REMOTE_CONFIG, metricProbes); configurationUpdater.accept(REMOTE_CONFIG, null); verify(inst).removeTransformer(any()); @@ -564,9 +556,8 @@ public void acceptClearMetrics() throws UnmodifiableClassException { public void acceptClearLogs() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - singletonList( - LogProbe.builder().probeId(LOG_ID).where("java.lang.String", "concat").build()); + List logProbes = singletonList( + LogProbe.builder().probeId(LOG_ID).where("java.lang.String", "concat").build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); configurationUpdater.accept(REMOTE_CONFIG, null); verify(inst).removeTransformer(any()); @@ -579,26 +570,23 @@ public void acceptChangeProbeToMetric() throws UnmodifiableClassException { when(inst.getAllLoadedClasses()) .thenReturn(new Class[] {String.class, HashMap.class, StringBuilder.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - List logProbes = - Arrays.asList( - LogProbe.builder() - .language(LANGUAGE) - .probeId(PROBE_ID) - .where("java.lang.String", "concat") - .build(), - LogProbe.builder() - .language(LANGUAGE) - .probeId(PROBE_ID2) - .where("java.util.HashMap", "", "void ()") - .build()); + List logProbes = Arrays.asList( + LogProbe.builder() + .language(LANGUAGE) + .probeId(PROBE_ID) + .where("java.lang.String", "concat") + .build(), + LogProbe.builder() + .language(LANGUAGE) + .probeId(PROBE_ID2) + .where("java.util.HashMap", "", "void ()") + .build()); configurationUpdater.accept(REMOTE_CONFIG, logProbes); - List metricProbes = - singletonList( - MetricProbe.builder() - .language(LANGUAGE) - .probeId(METRIC_ID) - .where("java.lang.StringBuilder", "append") - .build()); + List metricProbes = singletonList(MetricProbe.builder() + .language(LANGUAGE) + .probeId(METRIC_ID) + .where("java.lang.StringBuilder", "append") + .build()); configurationUpdater.accept(REMOTE_CONFIG, metricProbes); verify(inst).removeTransformer(any()); ArgumentCaptor[]> captor = ArgumentCaptor.forClass(Class[].class); @@ -632,11 +620,10 @@ public void acceptNewSpan() { public void acceptNewDecorationSpan() { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSink); - SpanDecorationProbe spanProbe = - SpanDecorationProbe.builder() - .probeId(SPAN_DECORATION_ID) - .where("java.lang.String", "concat") - .build(); + SpanDecorationProbe spanProbe = SpanDecorationProbe.builder() + .probeId(SPAN_DECORATION_ID) + .where("java.lang.String", "concat") + .build(); configurationUpdater.accept(REMOTE_CONFIG, singletonList(spanProbe)); verify(inst).addTransformer(any(), eq(true)); verify(inst).getAllLoadedClasses(); @@ -672,7 +659,8 @@ public void methodParametersAttribute() throws Exception { ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); configurationUpdater.accept( REMOTE_CONFIG, - singletonList(LogProbe.builder().probeId(PROBE_ID).where(CLASS_NAME, "main").build())); + singletonList( + LogProbe.builder().probeId(PROBE_ID).where(CLASS_NAME, "main").build())); if (JavaVirtualMachine.isJavaVersionBetween(17, 0, 0, 17, 0, 20)) { // on JDK 17 with Spring6 class, transformation cannot happen verify(inst, times(2)).getAllLoadedClasses(); @@ -707,7 +695,8 @@ public void methodParametersAttributeRecord() ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); configurationUpdater.accept( REMOTE_CONFIG, - singletonList(LogProbe.builder().probeId(PROBE_ID).where(RECORD_NAME, "").build())); + singletonList( + LogProbe.builder().probeId(PROBE_ID).where(RECORD_NAME, "").build())); verify(inst).getAllLoadedClasses(); ArgumentCaptor[]> captor = ArgumentCaptor.forClass(Class[].class); verify(inst, times(1)).retransformClasses(captor.capture()); @@ -730,7 +719,8 @@ public void recordWithTypeAnnotation() ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); configurationUpdater.accept( REMOTE_CONFIG, - singletonList(LogProbe.builder().probeId(PROBE_ID).where(CLASS_NAME, "parse").build())); + singletonList( + LogProbe.builder().probeId(PROBE_ID).where(CLASS_NAME, "parse").build())); verify(inst).getAllLoadedClasses(); verify(inst, times(0)).retransformClasses(any()); } @@ -748,8 +738,10 @@ public void logProbeSamplers() throws IOException { // LogProbe objects. // Moshi skips transient fields, so sampler need to be initialized with initSamplers. LogProbe probe1Deserialized = deserializeLogProbe(serializeLogProbe(probe1).getBytes()); - LogProbe probe2 = - LogProbe.builder().probeId(PROBE_ID2).where("java.lang.String", "concat").build(); + LogProbe probe2 = LogProbe.builder() + .probeId(PROBE_ID2) + .where("java.lang.String", "concat") + .build(); configurationUpdater.accept(REMOTE_CONFIG, Arrays.asList(probe1Deserialized, probe2)); assertTrue(probe1Deserialized.isReadyToCapture()); assertTrue(probe2.isReadyToCapture()); @@ -759,12 +751,11 @@ public void logProbeSamplers() throws IOException { public void spanDecorationProbeSamplers() throws IOException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - SpanDecorationProbe probe1 = - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where("java.lang.String", "concat") - .evaluateAt(MethodLocation.EXIT) - .build(); + SpanDecorationProbe probe1 = SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where("java.lang.String", "concat") + .evaluateAt(MethodLocation.EXIT) + .build(); configurationUpdater.accept(REMOTE_CONFIG, singletonList(probe1)); assertCommitSpanDecorationProbe(probe1); @@ -774,12 +765,11 @@ public void spanDecorationProbeSamplers() throws IOException { // Moshi skips transient fields, so sampler need to be initialized with initSamplers. SpanDecorationProbe probe1Deserialized = deserializeSpanDecorationProbe(serializeSpanDecorationProbe(probe1).getBytes()); - SpanDecorationProbe probe2 = - SpanDecorationProbe.builder() - .probeId(PROBE_ID2) - .where("java.lang.String", "concat") - .evaluateAt(MethodLocation.EXIT) - .build(); + SpanDecorationProbe probe2 = SpanDecorationProbe.builder() + .probeId(PROBE_ID2) + .where("java.lang.String", "concat") + .evaluateAt(MethodLocation.EXIT) + .build(); configurationUpdater.accept(REMOTE_CONFIG, Arrays.asList(probe1Deserialized, probe2)); assertCommitSpanDecorationProbe(probe1Deserialized); assertCommitSpanDecorationProbe(probe2); @@ -800,8 +790,10 @@ private static void assertCommitSpanDecorationProbe(SpanDecorationProbe spanDeco public void triggerProbeSamplers() throws IOException { when(inst.getAllLoadedClasses()).thenReturn(new Class[] {String.class}); ConfigurationUpdater configurationUpdater = createConfigUpdater(debuggerSinkWithMockStatusSink); - TriggerProbe probe1 = - TriggerProbe.builder().probeId(PROBE_ID).where("java.lang.String", "concat").build(); + TriggerProbe probe1 = TriggerProbe.builder() + .probeId(PROBE_ID) + .where("java.lang.String", "concat") + .build(); configurationUpdater.accept(REMOTE_CONFIG, singletonList(probe1)); assertEvaluateTriggerProbe(probe1); @@ -811,8 +803,10 @@ public void triggerProbeSamplers() throws IOException { // Moshi skips transient fields, so sampler need to be initialized with initSamplers. TriggerProbe probe1Deserialized = deserializeTriggerProbe(serializeTriggerProbe(probe1).getBytes()); - TriggerProbe probe2 = - TriggerProbe.builder().probeId(PROBE_ID2).where("java.lang.String", "concat").build(); + TriggerProbe probe2 = TriggerProbe.builder() + .probeId(PROBE_ID2) + .where("java.lang.String", "concat") + .build(); configurationUpdater.accept(REMOTE_CONFIG, Arrays.asList(probe1Deserialized, probe2)); assertEvaluateTriggerProbe(probe1Deserialized); assertEvaluateTriggerProbe(probe2); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerAgentTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerAgentTest.java index 8245d7312e1..3fa56b5d53a 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerAgentTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerAgentTest.java @@ -49,8 +49,13 @@ public class DebuggerAgentTest { public static final String URL_PATH = "/foo"; - @Mock Config config; - @Mock Instrumentation inst; + + @Mock + Config config; + + @Mock + Instrumentation inst; + final MockWebServer server = new MockWebServer(); HttpUrl url; private ControllableEnvironmentVariables env = ControllableEnvironmentVariables.setup(); @@ -109,10 +114,8 @@ public void runEnabledWithDatadogAgent() throws InterruptedException, IOExceptio "{\"endpoints\": [\"v0.4/traces\", \"debugger/v1/input\", \"debugger/v1/diagnostics\", \"v0.7/config\"] }"; server.enqueue(new MockResponse().setResponseCode(200).setBody(infoContent)); server.enqueue(new MockResponse().setResponseCode(200).setBody(infoContent)); - try (BufferedReader reader = - new BufferedReader( - new InputStreamReader( - DebuggerAgentTest.class.getResourceAsStream("/test_probe.json")))) { + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(DebuggerAgentTest.class.getResourceAsStream("/test_probe.json")))) { String content = reader.lines().collect(Collectors.joining("\n")); String rcContent = RemoteConfigHelper.encode(content, "petclinic"); server.enqueue(new MockResponse().setResponseCode(200).setBody(rcContent)); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerProductChangesListenerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerProductChangesListenerTest.java index 94a5a4afdc8..1497b553053 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerProductChangesListenerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerProductChangesListenerTest.java @@ -41,7 +41,8 @@ public class DebuggerProductChangesListenerTest { private static final String SERVICE_NAME = "service-name"; - @Mock private Config tracerConfig; + @Mock + private Config tracerConfig; static class SimpleAcceptor implements ConfigurationAcceptor { private Collection definitions; @@ -156,14 +157,12 @@ public void parsingException() throws IOException { SimpleAcceptor acceptor = new SimpleAcceptor(); DebuggerProductChangesListener listener = new DebuggerProductChangesListener(acceptor); String probeUUID = UUID.randomUUID().toString(); - IOException ioException = - assertThrows( - IOException.class, - () -> - listener.accept( - createConfigKey("logProbe_" + probeUUID), - "{bad json}".getBytes(StandardCharsets.UTF_8), - NOOP)); + IOException ioException = assertThrows( + IOException.class, + () -> listener.accept( + createConfigKey("logProbe_" + probeUUID), + "{bad json}".getBytes(StandardCharsets.UTF_8), + NOOP)); assertNotNull(acceptor.lastException); assertEquals(ioException.getCause(), acceptor.lastException); } @@ -196,10 +195,8 @@ byte[] toContent(TriggerProbe probe) { } void acceptMetricProbe(DebuggerProductChangesListener listener, MetricProbe probe) { - assertDoesNotThrow( - () -> - listener.accept( - createConfigKey("metricProbe_" + probe.getId()), toContent(probe), NOOP)); + assertDoesNotThrow(() -> + listener.accept(createConfigKey("metricProbe_" + probe.getId()), toContent(probe), NOOP)); } void removeMetricProbe(DebuggerProductChangesListener listener, MetricProbe probe) { @@ -208,9 +205,8 @@ void removeMetricProbe(DebuggerProductChangesListener listener, MetricProbe prob } void acceptLogProbe(DebuggerProductChangesListener listener, LogProbe probe) { - assertDoesNotThrow( - () -> - listener.accept(createConfigKey("logProbe_" + probe.getId()), toContent(probe), NOOP)); + assertDoesNotThrow(() -> + listener.accept(createConfigKey("logProbe_" + probe.getId()), toContent(probe), NOOP)); } void removeLogProbe(DebuggerProductChangesListener listener, LogProbe probe) { @@ -218,24 +214,19 @@ void removeLogProbe(DebuggerProductChangesListener listener, LogProbe probe) { } void acceptSpanProbe(DebuggerProductChangesListener listener, SpanProbe probe) { - assertDoesNotThrow( - () -> - listener.accept(createConfigKey("spanProbe_" + probe.getId()), toContent(probe), NOOP)); + assertDoesNotThrow(() -> + listener.accept(createConfigKey("spanProbe_" + probe.getId()), toContent(probe), NOOP)); } void acceptSpanDecorationProbe( DebuggerProductChangesListener listener, SpanDecorationProbe probe) { - assertDoesNotThrow( - () -> - listener.accept( - createConfigKey("spanDecorationProbe_" + probe.getId()), toContent(probe), NOOP)); + assertDoesNotThrow(() -> listener.accept( + createConfigKey("spanDecorationProbe_" + probe.getId()), toContent(probe), NOOP)); } void acceptTriggerProbe(DebuggerProductChangesListener listener, TriggerProbe probe) { - assertDoesNotThrow( - () -> - listener.accept( - createConfigKey("triggerProbe_" + probe.getId()), toContent(probe), NOOP)); + assertDoesNotThrow(() -> + listener.accept(createConfigKey("triggerProbe_" + probe.getId()), toContent(probe), NOOP)); } void removeSpanProbe(DebuggerProductChangesListener listener, SpanProbe probe) { diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java index ce5fc834fa5..45fdd101198 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/DebuggerTransformerTest.java @@ -102,9 +102,8 @@ static void setupAll() throws Exception { GlobalTracer.forceRegister(mockTracer); // prepare the correlation fields golden muster - CORRELATION_FIELDS[0] = - CapturedContext.CapturedValue.of( - "dd.trace_id", "java.lang.String", mockTracer.getTraceId()); + CORRELATION_FIELDS[0] = CapturedContext.CapturedValue.of( + "dd.trace_id", "java.lang.String", mockTracer.getTraceId()); CORRELATION_FIELDS[1] = CapturedContext.CapturedValue.of("dd.span_id", "java.lang.String", mockTracer.getSpanId()); @@ -112,12 +111,11 @@ static void setupAll() throws Exception { freemarker.template.Configuration cfg = new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_29); cfg.setBooleanFormat("c"); - classTemplate = - new Template( - "classTemplate", - new InputStreamReader( - DebuggerTransformerTest.class.getResourceAsStream("/TargetClass.ftlh")), - cfg); + classTemplate = new Template( + "classTemplate", + new InputStreamReader( + DebuggerTransformerTest.class.getResourceAsStream("/TargetClass.ftlh")), + cfg); // TODO asserts are operating on 'toString()' which requires keeping the underlying object so we // just disable serialization for now DebuggerContext.initValueSerializer(null); @@ -152,11 +150,10 @@ public void testDump() { } LogProbe logProbe = LogProbe.builder().where("java.util.ArrayList", "add").probeId("", 0).build(); - DebuggerTransformer debuggerTransformer = - new DebuggerTransformer( - config, - new ProbeMetadata(), - new Configuration(SERVICE_NAME, Collections.singletonList(logProbe))); + DebuggerTransformer debuggerTransformer = new DebuggerTransformer( + config, + new ProbeMetadata(), + new Configuration(SERVICE_NAME, Collections.singletonList(logProbe))); debuggerTransformer.transform( ClassLoader.getSystemClassLoader(), "java.util.ArrayList", @@ -194,33 +191,30 @@ private void doTestMultiProbes( List logProbes = new ArrayList<>(); for (ProbeTestInfo probeInfo : probeInfos) { String className = getClassName.apply(probeInfo.clazz); - LogProbe logProbe = - LogProbe.builder() - .where(className, probeInfo.methodName, probeInfo.signature) - .probeId("", 0) - .build(); + LogProbe logProbe = LogProbe.builder() + .where(className, probeInfo.methodName, probeInfo.signature) + .probeId("", 0) + .build(); logProbes.add(logProbe); } Configuration configuration = new Configuration(SERVICE_NAME, logProbes); DebuggerTransformer debuggerTransformer = new DebuggerTransformer(config, new ProbeMetadata(), configuration); for (ProbeTestInfo probeInfo : probeInfos) { - byte[] newClassBuffer = - debuggerTransformer.transform( - ClassLoader.getSystemClassLoader(), - probeInfo.clazz.getName(), // always FQN - probeInfo.clazz, - null, - getClassFileBytes(probeInfo.clazz)); + byte[] newClassBuffer = debuggerTransformer.transform( + ClassLoader.getSystemClassLoader(), + probeInfo.clazz.getName(), // always FQN + probeInfo.clazz, + null, + getClassFileBytes(probeInfo.clazz)); Assertions.assertNotNull(newClassBuffer); } - byte[] newClassBuffer = - debuggerTransformer.transform( - ClassLoader.getSystemClassLoader(), - "java.util.HashSet", - HashSet.class, - null, - getClassFileBytes(HashSet.class)); + byte[] newClassBuffer = debuggerTransformer.transform( + ClassLoader.getSystemClassLoader(), + "java.util.HashSet", + HashSet.class, + null, + getClassFileBytes(HashSet.class)); assertNull(newClassBuffer); } @@ -243,30 +237,26 @@ public ProbeTestInfo(Class clazz, String methodName, String signature) { @Test public void testBlockedProbes() { Config config = createConfig(); - List logProbes = - Arrays.asList( - LogProbe.builder() - .language(LANGUAGE) - .probeId(PROBE_ID) - .where("java.lang.String", "toString") - .build()); + List logProbes = Arrays.asList(LogProbe.builder() + .language(LANGUAGE) + .probeId(PROBE_ID) + .where("java.lang.String", "toString") + .build()); Configuration configuration = new Configuration(SERVICE_NAME, logProbes); AtomicReference lastResult = new AtomicReference<>(null); - DebuggerTransformer debuggerTransformer = - new DebuggerTransformer( - config, - configuration, - ((definition, result) -> lastResult.set(result)), - new ProbeMetadata(), - new DebuggerSink( - config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); - byte[] newClassBuffer = - debuggerTransformer.transform( - ClassLoader.getSystemClassLoader(), - "java.lang.String", - String.class, - null, - getClassFileBytes(String.class)); + DebuggerTransformer debuggerTransformer = new DebuggerTransformer( + config, + configuration, + ((definition, result) -> lastResult.set(result)), + new ProbeMetadata(), + new DebuggerSink( + config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); + byte[] newClassBuffer = debuggerTransformer.transform( + ClassLoader.getSystemClassLoader(), + "java.lang.String", + String.class, + null, + getClassFileBytes(String.class)); assertNull(newClassBuffer); Assertions.assertNotNull(lastResult.get()); assertTrue(lastResult.get().isBlocked()); @@ -277,25 +267,24 @@ public void testBlockedProbes() { @Test public void classBeingRedefinedNull() { Config config = createConfig(); - LogProbe logProbe = LogProbe.builder().where("ArrayList", "add").probeId("", 0).build(); + LogProbe logProbe = + LogProbe.builder().where("ArrayList", "add").probeId("", 0).build(); Configuration configuration = new Configuration(SERVICE_NAME, Collections.singletonList(logProbe)); AtomicReference lastResult = new AtomicReference<>(null); - DebuggerTransformer debuggerTransformer = - new DebuggerTransformer( - config, - configuration, - ((definition, result) -> lastResult.set(result)), - new ProbeMetadata(), - new DebuggerSink( - config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); - byte[] newClassBuffer = - debuggerTransformer.transform( - ClassLoader.getSystemClassLoader(), - "java.util.ArrayList", - null, // classBeingRedefined - null, - getClassFileBytes(ArrayList.class)); + DebuggerTransformer debuggerTransformer = new DebuggerTransformer( + config, + configuration, + ((definition, result) -> lastResult.set(result)), + new ProbeMetadata(), + new DebuggerSink( + config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); + byte[] newClassBuffer = debuggerTransformer.transform( + ClassLoader.getSystemClassLoader(), + "java.util.ArrayList", + null, // classBeingRedefined + null, + getClassFileBytes(ArrayList.class)); Assertions.assertNotNull(newClassBuffer); Assertions.assertNotNull(lastResult.get()); Assertions.assertFalse(lastResult.get().isBlocked()); @@ -311,34 +300,36 @@ public void classGenerationFailed() { Config config = createConfig(); final String CLASS_NAME = ArrayList.class.getTypeName(); final String METHOD_NAME = "add"; - MockProbe mockProbe = MockProbe.builder(PROBE_ID).where(CLASS_NAME, METHOD_NAME).build(); - LogProbe logProbe1 = - LogProbe.builder().probeId("logprobe1", 0).where(CLASS_NAME, METHOD_NAME).build(); - LogProbe logProbe2 = - LogProbe.builder().probeId("logprobe2", 0).where(CLASS_NAME, METHOD_NAME).build(); - Configuration configuration = - Configuration.builder() - .setService(SERVICE_NAME) - .add(mockProbe, logProbe1, logProbe2) - .build(); + MockProbe mockProbe = + MockProbe.builder(PROBE_ID).where(CLASS_NAME, METHOD_NAME).build(); + LogProbe logProbe1 = LogProbe.builder() + .probeId("logprobe1", 0) + .where(CLASS_NAME, METHOD_NAME) + .build(); + LogProbe logProbe2 = LogProbe.builder() + .probeId("logprobe2", 0) + .where(CLASS_NAME, METHOD_NAME) + .build(); + Configuration configuration = Configuration.builder() + .setService(SERVICE_NAME) + .add(mockProbe, logProbe1, logProbe2) + .build(); AtomicReference lastResult = new AtomicReference<>(null); ProbeStatusSink probeStatusSink = mock(ProbeStatusSink.class); TestSnapshotListener listener = new TestSnapshotListener(config, probeStatusSink); - DebuggerTransformer debuggerTransformer = - new DebuggerTransformer( - config, - configuration, - ((definition, result) -> lastResult.set(result)), - new ProbeMetadata(), - listener); + DebuggerTransformer debuggerTransformer = new DebuggerTransformer( + config, + configuration, + ((definition, result) -> lastResult.set(result)), + new ProbeMetadata(), + listener); DebuggerAgentHelper.injectSink(listener); - byte[] newClassBuffer = - debuggerTransformer.transform( - ClassLoader.getSystemClassLoader(), - "java/util/ArrayList", - null, - null, - getClassFileBytes(ArrayList.class)); + byte[] newClassBuffer = debuggerTransformer.transform( + ClassLoader.getSystemClassLoader(), + "java/util/ArrayList", + null, + null, + getClassFileBytes(ArrayList.class)); assertNull(newClassBuffer); ArgumentCaptor strCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor probeIdCaptor = ArgumentCaptor.forClass(ProbeId.class); @@ -346,30 +337,21 @@ public void classGenerationFailed() { assertEquals("logprobe1", probeIdCaptor.getAllValues().get(0).getId()); assertEquals("logprobe2", probeIdCaptor.getAllValues().get(1).getId()); assertEquals(PROBE_ID.getId(), probeIdCaptor.getAllValues().get(2).getId()); - assertTrue( - strCaptor - .getAllValues() - .get(0) - .startsWith( - "Instrumentation failed for " - + CLASS_NAME - + ": org.objectweb.asm.MethodTooLargeException:")); - assertTrue( - strCaptor - .getAllValues() - .get(1) - .startsWith( - "Instrumentation failed for " - + CLASS_NAME - + ": org.objectweb.asm.MethodTooLargeException:")); - assertTrue( - strCaptor - .getAllValues() - .get(2) - .startsWith( - "Instrumentation failed for " - + CLASS_NAME - + ": org.objectweb.asm.MethodTooLargeException:")); + assertTrue(strCaptor + .getAllValues() + .get(0) + .startsWith("Instrumentation failed for " + CLASS_NAME + + ": org.objectweb.asm.MethodTooLargeException:")); + assertTrue(strCaptor + .getAllValues() + .get(1) + .startsWith("Instrumentation failed for " + CLASS_NAME + + ": org.objectweb.asm.MethodTooLargeException:")); + assertTrue(strCaptor + .getAllValues() + .get(2) + .startsWith("Instrumentation failed for " + CLASS_NAME + + ": org.objectweb.asm.MethodTooLargeException:")); } @Test @@ -381,25 +363,23 @@ public void ordering() { SpanProbe spanProbe = createMock(SpanProbe.class, invocationOrder, "span"); SpanDecorationProbe spanDecorationProbe = createMock(SpanDecorationProbe.class, invocationOrder, "spanDecoration"); - Configuration configuration = - Configuration.builder() - .add(spanDecorationProbe) - .add(spanProbe) - .add(metricProbe) - .add(logProbe) - .build(); - DebuggerTransformer debuggerTransformer = - new DebuggerTransformer( - config, - configuration, - (definition, result) -> { - if (result.isInstalled()) { - invocationOrder.add(definition); - } - }, - new ProbeMetadata(), - new DebuggerSink( - config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); + Configuration configuration = Configuration.builder() + .add(spanDecorationProbe) + .add(spanProbe) + .add(metricProbe) + .add(logProbe) + .build(); + DebuggerTransformer debuggerTransformer = new DebuggerTransformer( + config, + configuration, + (definition, result) -> { + if (result.isInstalled()) { + invocationOrder.add(definition); + } + }, + new ProbeMetadata(), + new DebuggerSink( + config, new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false))); debuggerTransformer.transform( ClassLoader.getSystemClassLoader(), ArrayList.class.getName(), // always FQN @@ -416,10 +396,9 @@ public void ordering() { T createMock( Class clazz, List invocationOrder, String id) { ProbeDefinition mock = mock(clazz); - doAnswer( - invocation -> { - return InstrumentationResult.Status.INSTALLED; - }) + doAnswer(invocation -> { + return InstrumentationResult.Status.INSTALLED; + }) .when(mock) .instrument(any(), anyList(), anyList()); when(mock.getProbeId()).thenReturn(new ProbeId(id, 0)); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/KotlinHelper.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/KotlinHelper.java index e389cd951b7..f66d4588f74 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/KotlinHelper.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/KotlinHelper.java @@ -25,11 +25,10 @@ public static Class compileAndLoad( String compilerOutputDir = "/tmp/" + CapturedSnapshotTest.class.getSimpleName() + "-kotlin"; args.setDestination(compilerOutputDir); args.setClasspath(System.getProperty("java.class.path")); - ExitCode exitCode = - compiler.exec( - new PrintingMessageCollector(System.out, MessageRenderer.WITHOUT_PATHS, true), - Services.EMPTY, - args); + ExitCode exitCode = compiler.exec( + new PrintingMessageCollector(System.out, MessageRenderer.WITHOUT_PATHS, true), + Services.EMPTY, + args); if (exitCode.getCode() != 0) { throw new RuntimeException("Kotlin compilation failed"); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/LogProbesInstrumentationTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/LogProbesInstrumentationTest.java index 7777a1d133a..653b39f4ea2 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/LogProbesInstrumentationTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/LogProbesInstrumentationTest.java @@ -91,9 +91,8 @@ public void methodLargePlainLog() throws IOException, URISyntaxException { @Test public void methodTemplateArgLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - TestSnapshotListener listener = - installMethodProbe( - "this is log line with arg={arg}", CLASS_NAME, "main", "int (java.lang.String)"); + TestSnapshotListener listener = installMethodProbe( + "this is log line with arg={arg}", CLASS_NAME, "main", "int (java.lang.String)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); Assertions.assertEquals(3, result); @@ -118,9 +117,8 @@ public void methodTemplateArgLogLarge() throws IOException, URISyntaxException { @Test public void methodTemplateLargeArgLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - TestSnapshotListener listener = - installMethodProbe( - "this is log line with arg={arg}", CLASS_NAME, "main", "int (java.lang.String)"); + TestSnapshotListener listener = installMethodProbe( + "this is log line with arg={arg}", CLASS_NAME, "main", "int (java.lang.String)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", STR_8K).get(); Assertions.assertEquals(3, result); @@ -148,15 +146,14 @@ public void methodTemplateTooLargeArgLog() throws IOException, URISyntaxExceptio @Test public void methodTemplateArgLogEvaluateAtExit() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe probe = - createProbeBuilder( - LOG_ID, - "this is log line with return={@return}", - CLASS_NAME, - "main", - "int (java.lang.String)") - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe = createProbeBuilder( + LOG_ID, + "this is log line with return={@return}", + CLASS_NAME, + "main", + "int (java.lang.String)") + .evaluateAt(MethodLocation.EXIT) + .build(); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -169,20 +166,18 @@ public void methodTemplateArgLogEvaluateAtExit() throws IOException, URISyntaxEx @Test public void mergedMethodTemplateArgLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe logProbe1 = - createMethodProbe( - LOG_ID1, - "this is log line #1 with arg={arg}", - CLASS_NAME, - "main", - "int (java.lang.String)"); - LogProbe logProbe2 = - createMethodProbe( - LOG_ID2, - "this is log line #2 with arg={arg}", - CLASS_NAME, - "main", - "int (java.lang.String)"); + LogProbe logProbe1 = createMethodProbe( + LOG_ID1, + "this is log line #1 with arg={arg}", + CLASS_NAME, + "main", + "int (java.lang.String)"); + LogProbe logProbe2 = createMethodProbe( + LOG_ID2, + "this is log line #2 with arg={arg}", + CLASS_NAME, + "main", + "int (java.lang.String)"); TestSnapshotListener listener = installProbes(logProbe1, logProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -229,24 +224,22 @@ public void mergedMethodTemplateMainNonCaptureAdditionalCapture() private List doMergedMethodTemplateMixCapture( boolean mainCapture, boolean additionalCapture) throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe logProbe1 = - createProbeBuilder( - LOG_ID1, - "this is log line #1 with arg={arg}", - CLASS_NAME, - "main", - "int (java.lang.String)") - .captureSnapshot(mainCapture) - .build(); - LogProbe logProbe2 = - createProbeBuilder( - LOG_ID2, - "this is log line #2 with arg={arg}", - CLASS_NAME, - "main", - "int (java.lang.String)") - .captureSnapshot(additionalCapture) - .build(); + LogProbe logProbe1 = createProbeBuilder( + LOG_ID1, + "this is log line #1 with arg={arg}", + CLASS_NAME, + "main", + "int (java.lang.String)") + .captureSnapshot(mainCapture) + .build(); + LogProbe logProbe2 = createProbeBuilder( + LOG_ID2, + "this is log line #2 with arg={arg}", + CLASS_NAME, + "main", + "int (java.lang.String)") + .captureSnapshot(additionalCapture) + .build(); TestSnapshotListener listener = installProbes(logProbe1, logProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -273,9 +266,8 @@ public void linePlainLog() throws IOException, URISyntaxException { public void lineTemplateVarLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID2); - TestSnapshotListener listener = - installLineProbe( - LINE_PROBE_ID2, "this is log line with local var={var1}", CLASS_NAME, line); + TestSnapshotListener listener = installLineProbe( + LINE_PROBE_ID2, "this is log line with local var={var1}", CLASS_NAME, line); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); Assertions.assertEquals(3, result); @@ -288,12 +280,11 @@ public void lineTemplateVarLog() throws IOException, URISyntaxException { public void lineTemplateMultipleVarLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - TestSnapshotListener listener = - installLineProbe( - LINE_PROBE_ID1, - "nullObject={nullObject} sdata={sdata.strValue} cdata={cdata.s1.intValue}", - CLASS_NAME, - line); + TestSnapshotListener listener = installLineProbe( + LINE_PROBE_ID1, + "nullObject={nullObject} sdata={sdata.strValue} cdata={cdata.s1.intValue}", + CLASS_NAME, + line); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); Assertions.assertEquals(143, result); @@ -306,12 +297,11 @@ public void lineTemplateMultipleVarLog() throws IOException, URISyntaxException public void lineTemplateEscapeLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID2); - TestSnapshotListener listener = - installLineProbe( - LINE_PROBE_ID2, - "this is log line with {{curly braces}} and with local var={{{var1}}}", - CLASS_NAME, - line); + TestSnapshotListener listener = installLineProbe( + LINE_PROBE_ID2, + "this is log line with {{curly braces}} and with local var={{{var1}}}", + CLASS_NAME, + line); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); Assertions.assertEquals(3, result); @@ -325,9 +315,8 @@ public void lineTemplateEscapeLog() throws IOException, URISyntaxException { public void lineTemplateInvalidVarLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID2); - TestSnapshotListener listener = - installLineProbe( - LINE_PROBE_ID2, "this is log line with local var={var42}", CLASS_NAME, line); + TestSnapshotListener listener = installLineProbe( + LINE_PROBE_ID2, "this is log line with local var={var42}", CLASS_NAME, line); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); Assertions.assertEquals(3, result); @@ -337,16 +326,16 @@ public void lineTemplateInvalidVarLog() throws IOException, URISyntaxException { "this is log line with local var={Cannot find symbol: var42}", snapshot.getMessage()); assertEquals(1, snapshot.getEvaluationErrors().size()); assertEquals("var42", snapshot.getEvaluationErrors().get(0).getExpr()); - assertEquals("Cannot find symbol: var42", snapshot.getEvaluationErrors().get(0).getMessage()); + assertEquals( + "Cannot find symbol: var42", snapshot.getEvaluationErrors().get(0).getMessage()); } @Test public void lineTemplateNullFieldLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot04"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - TestSnapshotListener listener = - installLineProbe( - LINE_PROBE_ID1, "this is log line with field={nullObject.intValue}", CLASS_NAME, line); + TestSnapshotListener listener = installLineProbe( + LINE_PROBE_ID1, "this is log line with field={nullObject.intValue}", CLASS_NAME, line); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "").get(); Assertions.assertEquals(143, result); @@ -357,19 +346,16 @@ public void lineTemplateNullFieldLog() throws IOException, URISyntaxException { assertEquals(1, snapshot.getEvaluationErrors().size()); assertEquals("nullObject.intValue", snapshot.getEvaluationErrors().get(0).getExpr()); assertEquals( - "Cannot dereference field: intValue", snapshot.getEvaluationErrors().get(0).getMessage()); + "Cannot dereference field: intValue", + snapshot.getEvaluationErrors().get(0).getMessage()); } @Test public void lineTemplateIndexOutOfBoundsLog() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; int line = getLineForLineProbe(CLASS_NAME, LINE_PROBE_ID1); - TestSnapshotListener listener = - installLineProbe( - LINE_PROBE_ID1, - "this is log line with element of list={strList[10]}", - CLASS_NAME, - line); + TestSnapshotListener listener = installLineProbe( + LINE_PROBE_ID1, "this is log line with element of list={strList[10]}", CLASS_NAME, line); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); Assertions.assertEquals(42, result); @@ -402,14 +388,13 @@ public void lineTemplateThisLog() throws IOException, URISyntaxException { public void conditionWithLogTemplateEvalError() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; final String LOG_TEMPLATE = "log line with arg={typoArg}"; - LogProbe logProbes = - createProbeBuilder(LOG_ID, LOG_TEMPLATE, CLASS_NAME, "doit", "int (java.lang.String)") - .when( - new ProbeCondition(DSL.when(DSL.eq(DSL.ref("arg"), DSL.value("5"))), "arg == '5'")) - .evaluateAt(MethodLocation.ENTRY) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .captureSnapshot(true) - .build(); + LogProbe logProbes = createProbeBuilder( + LOG_ID, LOG_TEMPLATE, CLASS_NAME, "doit", "int (java.lang.String)") + .when(new ProbeCondition(DSL.when(DSL.eq(DSL.ref("arg"), DSL.value("5"))), "arg == '5'")) + .evaluateAt(MethodLocation.ENTRY) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .captureSnapshot(true) + .build(); TestSnapshotListener listener = installProbes(logProbes); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "5").get(); @@ -420,15 +405,15 @@ public void conditionWithLogTemplateEvalError() throws IOException, URISyntaxExc Assertions.assertEquals(2, snapshot.getCaptures().getEntry().getArguments().size()); Assertions.assertEquals(1, snapshot.getEvaluationErrors().size()); Assertions.assertEquals( - "Cannot dereference field: typoArg", snapshot.getEvaluationErrors().get(0).getMessage()); + "Cannot dereference field: typoArg", + snapshot.getEvaluationErrors().get(0).getMessage()); } @Test public void mergedMethodTemplateMainNoErrorAdditionalLogError() throws IOException, URISyntaxException { - List snapshots = - doMergedMethodTemplateMixLogError( - "this is log line #1 with arg={arg}", "this is log line #2 with arg={typoArg}"); + List snapshots = doMergedMethodTemplateMixLogError( + "this is log line #1 with arg={arg}", "this is log line #2 with arg={typoArg}"); Snapshot snapshot0 = snapshots.get(0); assertEquals(LOG_ID1.getId(), snapshot0.getProbe().getId()); assertNotNull(snapshot0.getCaptures().getEntry()); @@ -449,9 +434,8 @@ public void mergedMethodTemplateMainNoErrorAdditionalLogError() @Test public void mergedMethodTemplateMainLogErrorAdditionalNoError() throws IOException, URISyntaxException { - List snapshots = - doMergedMethodTemplateMixLogError( - "this is log line #1 with arg={typoArg}", "this is log line #2 with arg={arg}"); + List snapshots = doMergedMethodTemplateMixLogError( + "this is log line #1 with arg={typoArg}", "this is log line #2 with arg={arg}"); Snapshot snapshot0 = snapshots.get(0); assertEquals(LOG_ID1.getId(), snapshot0.getProbe().getId()); assertNotNull(snapshot0.getCaptures().getEntry()); @@ -472,9 +456,8 @@ public void mergedMethodTemplateMainLogErrorAdditionalNoError() @Test public void mergedMethodTemplateMainLogErrorAdditionalLogError() throws IOException, URISyntaxException { - List snapshots = - doMergedMethodTemplateMixLogError( - "this is log line #1 with arg={typoArg1}", "this is log line #2 with arg={typoArg2}"); + List snapshots = doMergedMethodTemplateMixLogError( + "this is log line #1 with arg={typoArg1}", "this is log line #2 with arg={typoArg2}"); Snapshot snapshot0 = snapshots.get(0); assertEquals(LOG_ID1.getId(), snapshot0.getProbe().getId()); assertNotNull(snapshot0.getCaptures().getEntry()); @@ -498,15 +481,14 @@ public void mergedMethodTemplateMainLogErrorAdditionalLogError() private List doMergedMethodTemplateMixLogError( String mainTemplate, String additionalTemplate) throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe logProbe1 = - createProbeBuilder(LOG_ID1, mainTemplate, CLASS_NAME, "main", "int (java.lang.String)") - .captureSnapshot(true) - .build(); - LogProbe logProbe2 = - createProbeBuilder( - LOG_ID2, additionalTemplate, CLASS_NAME, "main", "int (java.lang.String)") - .captureSnapshot(true) - .build(); + LogProbe logProbe1 = createProbeBuilder( + LOG_ID1, mainTemplate, CLASS_NAME, "main", "int (java.lang.String)") + .captureSnapshot(true) + .build(); + LogProbe logProbe2 = createProbeBuilder( + LOG_ID2, additionalTemplate, CLASS_NAME, "main", "int (java.lang.String)") + .captureSnapshot(true) + .build(); TestSnapshotListener listener = installProbes(logProbe1, logProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -518,17 +500,20 @@ private List doMergedMethodTemplateMixLogError( private TestSnapshotListener installMethodProbe( String template, String typeName, String methodName, String signature) { LogProbe logProbe = createMethodProbe(LOG_ID, template, typeName, methodName, signature); - return installProbes(Configuration.builder().setService(SERVICE_NAME).add(logProbe).build()); + return installProbes( + Configuration.builder().setService(SERVICE_NAME).add(logProbe).build()); } private TestSnapshotListener installLineProbe( ProbeId probeId, String template, String sourceFile, int line) { LogProbe logProbe = createLineProbe(probeId, template, sourceFile, line); - return installProbes(Configuration.builder().setService(SERVICE_NAME).add(logProbe).build()); + return installProbes( + Configuration.builder().setService(SERVICE_NAME).add(logProbe).build()); } private TestSnapshotListener installProbes(LogProbe... logProbes) { - return installProbes(Configuration.builder().setService(SERVICE_NAME).add(logProbes).build()); + return installProbes( + Configuration.builder().setService(SERVICE_NAME).add(logProbes).build()); } private static LogProbe.Builder createProbeBuilder( diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/MetricProbesInstrumentationTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/MetricProbesInstrumentationTest.java index 413fa216cb9..8f2cd9c2413 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/MetricProbesInstrumentationTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/MetricProbesInstrumentationTest.java @@ -96,15 +96,10 @@ public void methodIncCountMetric() throws IOException, URISyntaxException { public void methodIncCountWithTagsMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "call_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "main", - "int (java.lang.String)", - null, - new String[] {"tag1:foo1", "tag2:foo2"}); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, COUNT, CLASS_NAME, "main", "int (java.lang.String)", null, new String[] { + "tag1:foo1", "tag2:foo2" + }); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(3, result); @@ -118,14 +113,13 @@ public void methodIncCountWithTagsMetric() throws IOException, URISyntaxExceptio public void methodConstantValueMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; final String METRIC_NAME = "call_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "main", - "int (java.lang.String)", - new ValueScript(DSL.value(42L), "42")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "main", + "int (java.lang.String)", + new ValueScript(DSL.value(42L), "42")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(3, result); @@ -137,14 +131,13 @@ public void methodConstantValueMetric() throws IOException, URISyntaxException { public void invalidConstantValueMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "call_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "main", - "int (java.lang.String)", - new ValueScript(DSL.value(42.0), "42.0")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "main", + "int (java.lang.String)", + new ValueScript(DSL.value(42.0), "42.0")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(3, result); @@ -157,14 +150,13 @@ public void invalidConstantValueMetric() throws IOException, URISyntaxException public void invalidValueMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "call_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "main", - "int (java.lang.String)", - new ValueScript(DSL.ref("value"), "value")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "main", + "int (java.lang.String)", + new ValueScript(DSL.ref("value"), "value")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(3, result); @@ -176,22 +168,20 @@ public void invalidValueMetric() throws IOException, URISyntaxException { public void multiInvalidValueMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "call_count"; - MetricProbe metric1 = - MetricProbe.builder() - .probeId(METRIC_ID1) - .metricName(METRIC_NAME) - .kind(COUNT) - .where(CLASS_NAME, "main", "int (java.lang.String)") - .valueScript(new ValueScript(DSL.ref("value"), "value")) - .build(); - MetricProbe metric2 = - MetricProbe.builder() - .probeId(METRIC_ID2) - .metricName(METRIC_NAME) - .kind(COUNT) - .where(CLASS_NAME, "main", "int (java.lang.String)") - .valueScript(new ValueScript(DSL.ref("invalid"), "invalid")) - .build(); + MetricProbe metric1 = MetricProbe.builder() + .probeId(METRIC_ID1) + .metricName(METRIC_NAME) + .kind(COUNT) + .where(CLASS_NAME, "main", "int (java.lang.String)") + .valueScript(new ValueScript(DSL.ref("value"), "value")) + .build(); + MetricProbe metric2 = MetricProbe.builder() + .probeId(METRIC_ID2) + .metricName(METRIC_NAME) + .kind(COUNT) + .where(CLASS_NAME, "main", "int (java.lang.String)") + .valueScript(new ValueScript(DSL.ref("invalid"), "invalid")) + .build(); MetricForwarderListener listener = installMetricProbes(metric1, metric2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -207,14 +197,13 @@ public void multiInvalidValueMetric() throws IOException, URISyntaxException { public void methodArgumentRefValueCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "f1", - "int (int)", - new ValueScript(DSL.ref("value"), "value")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "f1", + "int (int)", + new ValueScript(DSL.ref("value"), "value")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(48, result); @@ -226,14 +215,13 @@ public void methodArgumentRefValueCountMetric() throws IOException, URISyntaxExc public void methodArgumentRefValueGaugeMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_gauge"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - GAUGE, - CLASS_NAME, - "f1", - "int (int)", - new ValueScript(DSL.ref("value"), "value")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + GAUGE, + CLASS_NAME, + "f1", + "int (int)", + new ValueScript(DSL.ref("value"), "value")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(48, result); @@ -246,14 +234,13 @@ public void methodArgumentRefValueGaugeMetric() throws IOException, URISyntaxExc public void methodFieldRefValueGaugeDoubleMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_double_gauge"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - GAUGE, - CLASS_NAME, - "f", - "()", - new ValueScript(DSL.ref("doubleValue"), "doubleValue")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + GAUGE, + CLASS_NAME, + "f", + "()", + new ValueScript(DSL.ref("doubleValue"), "doubleValue")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); assertEquals(42, result); @@ -266,15 +253,14 @@ public void methodFieldRefValueGaugeDoubleMetric() throws IOException, URISyntax public void methodArgumentRefValueGaugeMetricWithTags() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_gauge"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - GAUGE, - CLASS_NAME, - "f1", - "int (int)", - new ValueScript(DSL.ref("value"), "value"), - new String[] {"tag1:foo1"}); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + GAUGE, + CLASS_NAME, + "f1", + "int (int)", + new ValueScript(DSL.ref("value"), "value"), + new String[] {"tag1:foo1"}); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertArrayEquals(new String[] {"tag1:foo1", METRIC_PROBEID_TAG}, listener.lastTags); @@ -284,14 +270,13 @@ public void methodArgumentRefValueGaugeMetricWithTags() throws IOException, URIS public void methodArgumentRefValueHistogramMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_histogram"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - HISTOGRAM, - CLASS_NAME, - "f1", - "int (int)", - new ValueScript(DSL.ref("value"), "value")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + HISTOGRAM, + CLASS_NAME, + "f1", + "int (int)", + new ValueScript(DSL.ref("value"), "value")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(48, result); @@ -304,14 +289,13 @@ public void methodArgumentRefValueHistogramMetric() throws IOException, URISynta public void methodFieldRefValueHistogramDoubleMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_double_histogram"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - HISTOGRAM, - CLASS_NAME, - "f", - "()", - new ValueScript(DSL.ref("doubleValue"), "doubleValue")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + HISTOGRAM, + CLASS_NAME, + "f", + "()", + new ValueScript(DSL.ref("doubleValue"), "doubleValue")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); assertEquals(42, result); @@ -325,15 +309,14 @@ public void methodArgumentRefValueHistogramMetricWithTags() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_histogram"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - HISTOGRAM, - CLASS_NAME, - "f1", - "int (int)", - new ValueScript(DSL.ref("value"), "value"), - new String[] {"tag1:foo1"}); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + HISTOGRAM, + CLASS_NAME, + "f1", + "int (int)", + new ValueScript(DSL.ref("value"), "value"), + new String[] {"tag1:foo1"}); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(48, result); @@ -346,14 +329,13 @@ public void methodArgumentRefValueHistogramMetricWithTags() public void methodArgumentRefValueDistributionMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_distribution"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - DISTRIBUTION, - CLASS_NAME, - "f1", - "int (int)", - new ValueScript(DSL.ref("value"), "value")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + DISTRIBUTION, + CLASS_NAME, + "f1", + "int (int)", + new ValueScript(DSL.ref("value"), "value")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(48, result); @@ -366,14 +348,13 @@ public void methodArgumentRefValueDistributionMetric() throws IOException, URISy public void methodFieldRefValueDistributionDoubleMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_double_distribution"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - DISTRIBUTION, - CLASS_NAME, - "f", - "()", - new ValueScript(DSL.ref("doubleValue"), "doubleValue")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + DISTRIBUTION, + CLASS_NAME, + "f", + "()", + new ValueScript(DSL.ref("doubleValue"), "doubleValue")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); assertEquals(42, result); @@ -386,12 +367,11 @@ public void methodFieldRefValueDistributionDoubleMetric() throws IOException, UR public void methodSyntheticReturnGaugeMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "syn_gauge"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.ref("@return"), "@return")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.ref("@return"), "@return")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -405,12 +385,11 @@ public void methodSyntheticReturnGaugeMetric() throws IOException, URISyntaxExce public void methodSyntheticReturnLenGaugeMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot32"; String METRIC_NAME = "syn_gauge"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) - .where(CLASS_NAME, "processArg", "(String)") - .valueScript(new ValueScript(DSL.len(DSL.ref("@return")), "len(@return)")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) + .where(CLASS_NAME, "processArg", "(String)") + .valueScript(new ValueScript(DSL.len(DSL.ref("@return")), "len(@return)")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "foobar").get(); @@ -425,12 +404,11 @@ public void methodSyntheticReturnInvalidType() throws IOException, URISyntaxExce final String CLASS_NAME = "CapturedSnapshot06"; final String INHERITED_CLASS_NAME = CLASS_NAME + "$Inherited"; String METRIC_NAME = "syn_gauge"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) - .where(INHERITED_CLASS_NAME, "", "()") - .valueScript(new ValueScript(DSL.ref("@return"), "@return")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) + .where(INHERITED_CLASS_NAME, "", "()") + .valueScript(new ValueScript(DSL.ref("@return"), "@return")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "").get(); @@ -443,12 +421,11 @@ public void methodSyntheticReturnInvalidType() throws IOException, URISyntaxExce public void methodSyntheticDurationGaugeMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "syn_gauge"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.ref("@duration"), "@duration")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.ref("@duration"), "@duration")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -462,12 +439,11 @@ public void methodSyntheticDurationGaugeMetric() throws IOException, URISyntaxEx public void methodSyntheticDurationKotlinDist() { final String CLASS_NAME = "CapturedSnapshot302"; String METRIC_NAME = "syn_dist"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, DISTRIBUTION) - .where(CLASS_NAME, "download", null) - .valueScript(new ValueScript(DSL.ref("@duration"), "@duration")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, DISTRIBUTION) + .where(CLASS_NAME, "download", null) + .valueScript(new ValueScript(DSL.ref("@duration"), "@duration")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); URL resource = CapturedSnapshotTest.class.getResource("/" + CLASS_NAME + ".kt"); List filesToDelete = new ArrayList<>(); @@ -489,12 +465,11 @@ public void methodSyntheticDurationKotlinDist() { public void methodSyntheticDurationExceptionGaugeMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot05"; String METRIC_NAME = "syn_gauge"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) - .where(CLASS_NAME, "main", "(String)") - .valueScript(new ValueScript(DSL.ref("@duration"), "@duration")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) + .where(CLASS_NAME, "main", "(String)") + .valueScript(new ValueScript(DSL.ref("@duration"), "@duration")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); try { @@ -513,14 +488,13 @@ public void lineArgumentRefValueCountMetric() throws IOException, URISyntaxExcep final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_count"; int line = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID1); - MetricProbe metricProbe = - createLineMetric( - LINE_METRIC_ID1, - METRIC_NAME, - COUNT, - CLASS_NAME, - new ValueScript(DSL.ref("value"), "value"), - line); + MetricProbe metricProbe = createLineMetric( + LINE_METRIC_ID1, + METRIC_NAME, + COUNT, + CLASS_NAME, + new ValueScript(DSL.ref("value"), "value"), + line); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -533,14 +507,8 @@ public void lineArgumentRefValueCountMetric() throws IOException, URISyntaxExcep public void invalidNameArgumentRefValueCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "f1", - "int (int)", - new ValueScript(DSL.ref("foo"), "foo")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, COUNT, CLASS_NAME, "f1", "int (int)", new ValueScript(DSL.ref("foo"), "foo")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(48, result); @@ -552,14 +520,13 @@ public void invalidNameArgumentRefValueCountMetric() throws IOException, URISynt public void invalidTypeArgumentRefValueCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; String METRIC_NAME = "argument_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "main", - "int (java.lang.String)", - new ValueScript(DSL.ref("arg"), "arg")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "main", + "int (java.lang.String)", + new ValueScript(DSL.ref("arg"), "arg")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(48, result); @@ -575,14 +542,13 @@ public void lineLocalRefValueCountMetric() throws IOException, URISyntaxExceptio final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "localvar_count"; int line = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID2); - MetricProbe metricProbe = - createLineMetric( - LINE_METRIC_ID2, - METRIC_NAME, - COUNT, - CLASS_NAME, - new ValueScript(DSL.ref("var1"), "var1"), - line); + MetricProbe metricProbe = createLineMetric( + LINE_METRIC_ID2, + METRIC_NAME, + COUNT, + CLASS_NAME, + new ValueScript(DSL.ref("var1"), "var1"), + line); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -596,14 +562,13 @@ public void invalidNameLocalRefValueCountMetric() throws IOException, URISyntaxE final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "localvar_count"; int line = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID2); - MetricProbe metricProbe = - createLineMetric( - LINE_METRIC_ID2, - METRIC_NAME, - COUNT, - CLASS_NAME, - new ValueScript(DSL.ref("foo"), "foo"), - line); + MetricProbe metricProbe = createLineMetric( + LINE_METRIC_ID2, + METRIC_NAME, + COUNT, + CLASS_NAME, + new ValueScript(DSL.ref("foo"), "foo"), + line); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -617,14 +582,13 @@ public void invalidTypeLocalRefValueCountMetric() throws IOException, URISyntaxE final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "localvar_count"; int line = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID2); - MetricProbe metricProbe = - createLineMetric( - LINE_METRIC_ID2, - METRIC_NAME, - COUNT, - CLASS_NAME, - new ValueScript(DSL.ref("arg"), "arg"), - line); + MetricProbe metricProbe = createLineMetric( + LINE_METRIC_ID2, + METRIC_NAME, + COUNT, + CLASS_NAME, + new ValueScript(DSL.ref("arg"), "arg"), + line); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -640,14 +604,13 @@ public void invalidTypeLocalRefValueCountMetric() throws IOException, URISyntaxE public void methodFieldRefValueCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "f", - "()", - new ValueScript(DSL.ref("intValue"), "intValue")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "f", + "()", + new ValueScript(DSL.ref("intValue"), "intValue")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -660,14 +623,13 @@ public void methodFieldRefValueCountMetric() throws IOException, URISyntaxExcept public void methodThisFieldRefValueCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "f", - "()", - new ValueScript(DSL.getMember(DSL.ref("this"), "intValue"), "this.intValue")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "f", + "()", + new ValueScript(DSL.getMember(DSL.ref("this"), "intValue"), "this.intValue")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -681,14 +643,13 @@ public void lineFieldRefValueCountMetric() throws IOException, URISyntaxExceptio final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_count"; int line = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID1); - MetricProbe metricProbe = - createLineMetric( - LINE_METRIC_ID1, - METRIC_NAME, - COUNT, - CLASS_NAME, - new ValueScript(DSL.getMember(DSL.ref("this"), "intValue"), "intValue"), - line); + MetricProbe metricProbe = createLineMetric( + LINE_METRIC_ID1, + METRIC_NAME, + COUNT, + CLASS_NAME, + new ValueScript(DSL.getMember(DSL.ref("this"), "intValue"), "intValue"), + line); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -704,24 +665,21 @@ public void lineMultiFieldRefValueCountMetric() throws IOException, URISyntaxExc String METRIC_NAME2 = "field2_count"; int line3 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID3); int line4 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID4); - MetricProbe metricProbe1 = - createLineMetric( - LINE_METRIC_ID3, - METRIC_NAME1, - COUNT, - CLASS_NAME, - new ValueScript(DSL.getMember(DSL.ref("sdata"), "intValue"), "sdata.intValue"), - line3); - MetricProbe metricProbe2 = - createLineMetric( - LINE_METRIC_ID4, - METRIC_NAME2, - COUNT, - CLASS_NAME, - new ValueScript( - DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s1"), "intValue"), - "cdata.s1.intValue"), - line4); + MetricProbe metricProbe1 = createLineMetric( + LINE_METRIC_ID3, + METRIC_NAME1, + COUNT, + CLASS_NAME, + new ValueScript(DSL.getMember(DSL.ref("sdata"), "intValue"), "sdata.intValue"), + line3); + MetricProbe metricProbe2 = createLineMetric( + LINE_METRIC_ID4, + METRIC_NAME2, + COUNT, + CLASS_NAME, + new ValueScript( + DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s1"), "intValue"), "cdata.s1.intValue"), + line4); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "").get(); @@ -739,25 +697,22 @@ public void nullMultiFieldRefValueCountMetric() throws IOException, URISyntaxExc String METRIC_NAME2 = "field2_count"; int line1 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID1); int line2 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID2); - MetricProbe metricProbe1 = - createLineMetric( - LINE_METRIC_ID1, - METRIC_NAME1, - COUNT, - CLASS_NAME, - new ValueScript( - DSL.getMember(DSL.ref("nullObject"), "intValue"), "nullObject.intValue"), - line1); - MetricProbe metricProbe2 = - createLineMetric( - LINE_METRIC_ID2, - METRIC_NAME2, - COUNT, - CLASS_NAME, - new ValueScript( - DSL.getMember(DSL.getMember(DSL.ref("cdata"), "nullsd"), "intValue"), - "cdata.nullsd.intValue"), - line2); + MetricProbe metricProbe1 = createLineMetric( + LINE_METRIC_ID1, + METRIC_NAME1, + COUNT, + CLASS_NAME, + new ValueScript(DSL.getMember(DSL.ref("nullObject"), "intValue"), "nullObject.intValue"), + line1); + MetricProbe metricProbe2 = createLineMetric( + LINE_METRIC_ID2, + METRIC_NAME2, + COUNT, + CLASS_NAME, + new ValueScript( + DSL.getMember(DSL.getMember(DSL.ref("cdata"), "nullsd"), "intValue"), + "cdata.nullsd.intValue"), + line2); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "").get(); @@ -774,24 +729,21 @@ public void invalidNameMultiFieldRefValueCountMetric() throws IOException, URISy String METRIC_NAME2 = "field2_count"; int line3 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID3); int line4 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID4); - MetricProbe metricProbe1 = - createLineMetric( - LINE_METRIC_ID3, - METRIC_NAME1, - COUNT, - CLASS_NAME, - new ValueScript(DSL.getMember(DSL.ref("sdata"), "foovalue"), "sdata.foovalue"), - line3); - MetricProbe metricProbe2 = - createLineMetric( - LINE_METRIC_ID4, - METRIC_NAME2, - COUNT, - CLASS_NAME, - new ValueScript( - DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s1"), "foovalue"), - "cdata.s1.foovalue"), - line4); + MetricProbe metricProbe1 = createLineMetric( + LINE_METRIC_ID3, + METRIC_NAME1, + COUNT, + CLASS_NAME, + new ValueScript(DSL.getMember(DSL.ref("sdata"), "foovalue"), "sdata.foovalue"), + line3); + MetricProbe metricProbe2 = createLineMetric( + LINE_METRIC_ID4, + METRIC_NAME2, + COUNT, + CLASS_NAME, + new ValueScript( + DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s1"), "foovalue"), "cdata.s1.foovalue"), + line4); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "").get(); @@ -811,24 +763,21 @@ public void invalidTypeMultiFieldRefValueCountMetric() throws IOException, URISy String METRIC_NAME2 = "field2_count"; int line3 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID3); int line4 = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID4); - MetricProbe metricProbe1 = - createLineMetric( - LINE_METRIC_ID3, - METRIC_NAME1, - COUNT, - CLASS_NAME, - new ValueScript(DSL.getMember(DSL.ref("sdata"), "strValue"), "sdata.strValue"), - line3); - MetricProbe metricProbe2 = - createLineMetric( - LINE_METRIC_ID4, - METRIC_NAME2, - COUNT, - CLASS_NAME, - new ValueScript( - DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s1"), "strValue"), - "cdata.s1.strValue"), - line4); + MetricProbe metricProbe1 = createLineMetric( + LINE_METRIC_ID3, + METRIC_NAME1, + COUNT, + CLASS_NAME, + new ValueScript(DSL.getMember(DSL.ref("sdata"), "strValue"), "sdata.strValue"), + line3); + MetricProbe metricProbe2 = createLineMetric( + LINE_METRIC_ID4, + METRIC_NAME2, + COUNT, + CLASS_NAME, + new ValueScript( + DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s1"), "strValue"), "cdata.s1.strValue"), + line4); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "").get(); @@ -849,14 +798,13 @@ public void invalidTypeMultiFieldRefValueCountMetric() throws IOException, URISy public void invalidNameFieldRefValueCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "f", - "()", - new ValueScript(DSL.ref("fooValue"), "fooValue")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "f", + "()", + new ValueScript(DSL.ref("fooValue"), "fooValue")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -869,14 +817,13 @@ public void invalidNameFieldRefValueCountMetric() throws IOException, URISyntaxE public void invalidTypeFieldRefValueCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_count"; - MetricForwarderListener listener = - installMethodMetric( - METRIC_NAME, - COUNT, - CLASS_NAME, - "f", - "()", - new ValueScript(DSL.ref("strValue"), "strValue")); + MetricForwarderListener listener = installMethodMetric( + METRIC_NAME, + COUNT, + CLASS_NAME, + "f", + "()", + new ValueScript(DSL.ref("strValue"), "strValue")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); assertEquals(42, result); @@ -892,15 +839,12 @@ public void metricThrows() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; ValueScript valueScript = new ValueScript(DSL.getMember(DSL.ref("this"), "intValue"), "intValue"); - MetricProbe countProbe = - createMethodMetric( - METRIC_ID1, "field_count", COUNT, CLASS_NAME, "f", "()", valueScript, null); - MetricProbe gaugeProbe = - createMethodMetric( - METRIC_ID2, "field_gauge", GAUGE, CLASS_NAME, "f", "()", valueScript, null); - MetricProbe histogramProbe = - createMethodMetric( - METRIC_ID3, "field_histo", HISTOGRAM, CLASS_NAME, "f", "()", valueScript, null); + MetricProbe countProbe = createMethodMetric( + METRIC_ID1, "field_count", COUNT, CLASS_NAME, "f", "()", valueScript, null); + MetricProbe gaugeProbe = createMethodMetric( + METRIC_ID2, "field_gauge", GAUGE, CLASS_NAME, "f", "()", valueScript, null); + MetricProbe histogramProbe = createMethodMetric( + METRIC_ID3, "field_histo", HISTOGRAM, CLASS_NAME, "f", "()", valueScript, null); MetricForwarderListener listener = installMetricProbes(countProbe, gaugeProbe, histogramProbe); listener.setThrowing(true); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -913,9 +857,8 @@ public void singleLineIncCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "call_count"; int line = getLineForLineProbe(CLASS_NAME, LINE_METRIC_ID1); - MetricForwarderListener listener = - installMetricProbes( - createLineMetric(LINE_METRIC_ID1, METRIC_NAME, COUNT, CLASS_NAME, null, line)); + MetricForwarderListener listener = installMetricProbes( + createLineMetric(LINE_METRIC_ID1, METRIC_NAME, COUNT, CLASS_NAME, null, line)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(3, result); @@ -929,10 +872,9 @@ public void multiLineIncCountMetric() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; String METRIC_NAME = "call_count"; MetricForwarderListener listener = - installMetricProbes( - createMetricBuilder(METRIC_ID, METRIC_NAME, COUNT) - .where("main", "int (java.lang.String)", null, null, "4-8") - .build()); + installMetricProbes(createMetricBuilder(METRIC_ID, METRIC_NAME, COUNT) + .where("main", "int (java.lang.String)", null, null, "4-8") + .build()); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); assertEquals(3, result); @@ -946,12 +888,11 @@ public void multiLineIncCountMetric() throws IOException, URISyntaxException { public void evaluateAtEntry() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_count"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, COUNT) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.ref("intValue"), "intValue")) - .evaluateAt(MethodLocation.ENTRY) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, COUNT) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.ref("intValue"), "intValue")) + .evaluateAt(MethodLocation.ENTRY) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -964,12 +905,11 @@ public void evaluateAtEntry() throws IOException, URISyntaxException { public void evaluateAtExit() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; String METRIC_NAME = "field_count"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, COUNT) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.ref("intValue"), "intValue")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, COUNT) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.ref("intValue"), "intValue")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -987,24 +927,21 @@ public void lenExpression() throws IOException, URISyntaxException { final ProbeId LISTSIZE_METRIC_ID = new ProbeId(LISTSIZE_METRIC, 1); final String MAPSIZE_METRIC = "mapsize"; final ProbeId MAPSIZE_METRIC_ID = new ProbeId(MAPSIZE_METRIC, 1); - MetricProbe metricProbe1 = - createMetricBuilder(STRLEN_METRIC_ID, STRLEN_METRIC, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.len(DSL.ref("strValue")), "len(strValue)")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbe2 = - createMetricBuilder(LISTSIZE_METRIC_ID, LISTSIZE_METRIC, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.len(DSL.ref("strList")), "len(strList)")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbe3 = - createMetricBuilder(MAPSIZE_METRIC_ID, MAPSIZE_METRIC, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.len(DSL.ref("strMap")), "len(strMap)")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe1 = createMetricBuilder(STRLEN_METRIC_ID, STRLEN_METRIC, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.len(DSL.ref("strValue")), "len(strValue)")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbe2 = createMetricBuilder(LISTSIZE_METRIC_ID, LISTSIZE_METRIC, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.len(DSL.ref("strList")), "len(strList)")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbe3 = createMetricBuilder(MAPSIZE_METRIC_ID, MAPSIZE_METRIC, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.len(DSL.ref("strMap")), "len(strMap)")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2, metricProbe3); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -1024,25 +961,21 @@ public void nullExpression() throws IOException, URISyntaxException { String NULLLEN_METRIC = "nulllen"; String MAPNULL_METRIC = "mapnull"; String NULL_METRIC = "null"; - MetricProbe metricProbe1 = - createMetricBuilder(METRIC_ID1, NULLLEN_METRIC, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.len(DSL.nullValue()), "len(null)")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbe2 = - createMetricBuilder(METRIC_ID2, MAPNULL_METRIC, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript( - new ValueScript(DSL.index(DSL.ref("strMap"), DSL.nullValue()), "strMap[null]")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbe3 = - createMetricBuilder(METRIC_ID3, NULL_METRIC, GAUGE) - .where(CLASS_NAME, "f", "()") - .valueScript(new ValueScript(DSL.nullValue(), "null")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe1 = createMetricBuilder(METRIC_ID1, NULLLEN_METRIC, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.len(DSL.nullValue()), "len(null)")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbe2 = createMetricBuilder(METRIC_ID2, MAPNULL_METRIC, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.index(DSL.ref("strMap"), DSL.nullValue()), "strMap[null]")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbe3 = createMetricBuilder(METRIC_ID3, NULL_METRIC, GAUGE) + .where(CLASS_NAME, "f", "()") + .valueScript(new ValueScript(DSL.nullValue(), "null")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2, metricProbe3); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -1052,7 +985,8 @@ public void nullExpression() throws IOException, URISyntaxException { ArgumentCaptor strCaptor = ArgumentCaptor.forClass(String.class); verify(probeStatusSink, times(3)).addError(any(), strCaptor.capture()); assertEquals( - "Unsupported type for len operation: java.lang.Object", strCaptor.getAllValues().get(0)); + "Unsupported type for len operation: java.lang.Object", + strCaptor.getAllValues().get(0)); assertEquals( "Incompatible type for expression: java.lang.String with expected types: [long,double]", strCaptor.getAllValues().get(1)); @@ -1070,30 +1004,23 @@ public void indexExpression() throws IOException, URISyntaxException { final ProbeId LISTIDX_METRIC_ID = new ProbeId(LISTIDX_METRIC, 1); final String MAPIDX_METRIC = "mapindex"; final ProbeId MAPIDX_METRIC_ID = new ProbeId(MAPIDX_METRIC, 1); - MetricProbe metricProbe1 = - createMetricBuilder(ARRAYIDX_METRIC_ID, ARRAYIDX_METRIC, GAUGE) - .where(CLASS_NAME, "doit", "(String)") - .valueScript( - new ValueScript(DSL.index(DSL.ref("intArray"), DSL.value(4)), "intArray[4]")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbe2 = - createMetricBuilder(LISTIDX_METRIC_ID, LISTIDX_METRIC, GAUGE) - .where(CLASS_NAME, "doit", "(String)") - .valueScript( - new ValueScript( - DSL.len(DSL.index(DSL.ref("strList"), DSL.value(1))), "len(strList[1])")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbe3 = - createMetricBuilder(MAPIDX_METRIC_ID, MAPIDX_METRIC, GAUGE) - .where(CLASS_NAME, "doit", "(String)") - .valueScript( - new ValueScript( - DSL.len(DSL.index(DSL.ref("strMap"), DSL.value("foo1"))), - "len(strMap['foo1'])")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe1 = createMetricBuilder(ARRAYIDX_METRIC_ID, ARRAYIDX_METRIC, GAUGE) + .where(CLASS_NAME, "doit", "(String)") + .valueScript(new ValueScript(DSL.index(DSL.ref("intArray"), DSL.value(4)), "intArray[4]")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbe2 = createMetricBuilder(LISTIDX_METRIC_ID, LISTIDX_METRIC, GAUGE) + .where(CLASS_NAME, "doit", "(String)") + .valueScript(new ValueScript( + DSL.len(DSL.index(DSL.ref("strList"), DSL.value(1))), "len(strList[1])")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbe3 = createMetricBuilder(MAPIDX_METRIC_ID, MAPIDX_METRIC, GAUGE) + .where(CLASS_NAME, "doit", "(String)") + .valueScript(new ValueScript( + DSL.len(DSL.index(DSL.ref("strMap"), DSL.value("foo1"))), "len(strMap['foo1'])")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2, metricProbe3); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -1114,22 +1041,18 @@ public void indexInvalidKeyTypeExpression() throws IOException, URISyntaxExcepti final ProbeId ARRAYSTRIDX_METRIC_ID = new ProbeId(ARRAYSTRIDX_METRIC, 1); final String ARRAYOOBIDX_METRIC = "arrayOutOfBoundsIndex"; final ProbeId ARRAYOOBIDX_METRIC_ID = new ProbeId(ARRAYOOBIDX_METRIC, 1); - MetricProbe metricProbe1 = - createMetricBuilder(ARRAYSTRIDX_METRIC_ID, ARRAYSTRIDX_METRIC, GAUGE) - .where(CLASS_NAME, "doit", "(String)") - .valueScript( - new ValueScript( - DSL.index(DSL.ref("intArray"), DSL.value("foo")), "intArray['foo']")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbe2 = - createMetricBuilder(ARRAYOOBIDX_METRIC_ID, ARRAYOOBIDX_METRIC, GAUGE) - .where(CLASS_NAME, "doit", "(String)") - // generates ArrayOutOfBoundsException - .valueScript( - new ValueScript(DSL.index(DSL.ref("intArray"), DSL.value(42)), "intArray[42]")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbe1 = createMetricBuilder(ARRAYSTRIDX_METRIC_ID, ARRAYSTRIDX_METRIC, GAUGE) + .where(CLASS_NAME, "doit", "(String)") + .valueScript( + new ValueScript(DSL.index(DSL.ref("intArray"), DSL.value("foo")), "intArray['foo']")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbe2 = createMetricBuilder(ARRAYOOBIDX_METRIC_ID, ARRAYOOBIDX_METRIC, GAUGE) + .where(CLASS_NAME, "doit", "(String)") + // generates ArrayOutOfBoundsException + .valueScript(new ValueScript(DSL.index(DSL.ref("intArray"), DSL.value(42)), "intArray[42]")) + .evaluateAt(MethodLocation.EXIT) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "f").get(); @@ -1149,29 +1072,22 @@ public void privateFieldValue() throws IOException, URISyntaxException { final String STRVALUE_METRIC = "strvalue_count"; final String LONGVALUE_METRIC = "longvalue_count"; final String INTVALUE_METRIC = "intvalue_count"; - MetricProbe metricProbe1 = - createMetricBuilder(METRIC_ID1, STRVALUE_METRIC, GAUGE) - .where(CLASS_NAME, 24) - .valueScript( - new ValueScript( - DSL.len(DSL.getMember(DSL.ref("sdata"), "strValue")), "len(sdata.strValue)")) - .build(); - MetricProbe metricProbe2 = - createMetricBuilder(METRIC_ID2, LONGVALUE_METRIC, GAUGE) - .where(CLASS_NAME, 24) - .valueScript( - new ValueScript( - DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s2"), "longValue"), - "cdata.s2.longValue")) - .build(); - MetricProbe metricProbe3 = - createMetricBuilder(METRIC_ID3, INTVALUE_METRIC, GAUGE) - .where(CLASS_NAME, 24) - .valueScript( - new ValueScript( - DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s2"), "intValue"), - "cdata.s2.intValue")) - .build(); + MetricProbe metricProbe1 = createMetricBuilder(METRIC_ID1, STRVALUE_METRIC, GAUGE) + .where(CLASS_NAME, 24) + .valueScript(new ValueScript( + DSL.len(DSL.getMember(DSL.ref("sdata"), "strValue")), "len(sdata.strValue)")) + .build(); + MetricProbe metricProbe2 = createMetricBuilder(METRIC_ID2, LONGVALUE_METRIC, GAUGE) + .where(CLASS_NAME, 24) + .valueScript(new ValueScript( + DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s2"), "longValue"), + "cdata.s2.longValue")) + .build(); + MetricProbe metricProbe3 = createMetricBuilder(METRIC_ID3, INTVALUE_METRIC, GAUGE) + .where(CLASS_NAME, 24) + .valueScript(new ValueScript( + DSL.getMember(DSL.getMember(DSL.ref("cdata"), "s2"), "intValue"), "cdata.s2.intValue")) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe1, metricProbe2, metricProbe3); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -1201,65 +1117,57 @@ public void primitivesFunction() throws IOException, URISyntaxException { final ProbeId METRIC_SHORT_ID = new ProbeId(METRIC_NAME_SHORT, 1); final String METRIC_NAME_CHAR = "char_arg_count"; final ProbeId METRIC_CHAR_ID = new ProbeId(METRIC_NAME_CHAR, 1); - MetricProbe metricProbeInt = - createMetricBuilder(METRIC_INT_ID, METRIC_NAME_INT, COUNT) - .where(CLASS_NAME, "intFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbeLong = - createMetricBuilder(METRIC_LONG_ID, METRIC_NAME_LONG, COUNT) - .where(CLASS_NAME, "longFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbeFloat = - createMetricBuilder(METRIC_FLOAT_ID, METRIC_NAME_FLOAT, GAUGE) - .where(CLASS_NAME, "floatFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbeDouble = - createMetricBuilder(METRIC_DOUBLE_ID, METRIC_NAME_DOUBLE, GAUGE) - .where(CLASS_NAME, "doubleFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbeBoolean = - createMetricBuilder(METRIC_BOOLEAN_ID, METRIC_NAME_BOOLEAN, COUNT) - .where(CLASS_NAME, "booleanFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbeByte = - createMetricBuilder(METRIC_BYTE_ID, METRIC_NAME_BYTE, COUNT) - .where(CLASS_NAME, "byteFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbeShort = - createMetricBuilder(METRIC_SHORT_ID, METRIC_NAME_SHORT, COUNT) - .where(CLASS_NAME, "shortFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); - MetricProbe metricProbeChar = - createMetricBuilder(METRIC_CHAR_ID, METRIC_NAME_CHAR, COUNT) - .where(CLASS_NAME, "charFunction") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .evaluateAt(MethodLocation.EXIT) - .build(); + MetricProbe metricProbeInt = createMetricBuilder(METRIC_INT_ID, METRIC_NAME_INT, COUNT) + .where(CLASS_NAME, "intFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbeLong = createMetricBuilder(METRIC_LONG_ID, METRIC_NAME_LONG, COUNT) + .where(CLASS_NAME, "longFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbeFloat = createMetricBuilder(METRIC_FLOAT_ID, METRIC_NAME_FLOAT, GAUGE) + .where(CLASS_NAME, "floatFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbeDouble = createMetricBuilder(METRIC_DOUBLE_ID, METRIC_NAME_DOUBLE, GAUGE) + .where(CLASS_NAME, "doubleFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbeBoolean = createMetricBuilder( + METRIC_BOOLEAN_ID, METRIC_NAME_BOOLEAN, COUNT) + .where(CLASS_NAME, "booleanFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbeByte = createMetricBuilder(METRIC_BYTE_ID, METRIC_NAME_BYTE, COUNT) + .where(CLASS_NAME, "byteFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbeShort = createMetricBuilder(METRIC_SHORT_ID, METRIC_NAME_SHORT, COUNT) + .where(CLASS_NAME, "shortFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); + MetricProbe metricProbeChar = createMetricBuilder(METRIC_CHAR_ID, METRIC_NAME_CHAR, COUNT) + .where(CLASS_NAME, "charFunction") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .evaluateAt(MethodLocation.EXIT) + .build(); - MetricForwarderListener listener = - installMetricProbes( - metricProbeInt, - metricProbeLong, - metricProbeFloat, - metricProbeDouble, - metricProbeBoolean, - metricProbeByte, - metricProbeShort, - metricProbeChar); + MetricForwarderListener listener = installMetricProbes( + metricProbeInt, + metricProbeLong, + metricProbeFloat, + metricProbeDouble, + metricProbeBoolean, + metricProbeByte, + metricProbeShort, + metricProbeChar); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "int").get(); assertEquals(42, result); @@ -1291,19 +1199,17 @@ public void primitivesFunction() throws IOException, URISyntaxException { public void localVarNotInScope() throws IOException, URISyntaxException { final String METRIC_NAME = "lenstr"; final String CLASS_NAME = "com.datadog.debugger.jaxrs.MyResource"; - MetricProbe metricProbe = - createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) - .where(CLASS_NAME, "createResource", null) - .valueScript(new ValueScript(DSL.len(DSL.ref("varStr")), "len(varStr)")) - .build(); + MetricProbe metricProbe = createMetricBuilder(METRIC_ID, METRIC_NAME, GAUGE) + .where(CLASS_NAME, "createResource", null) + .valueScript(new ValueScript(DSL.len(DSL.ref("varStr")), "len(varStr)")) + .build(); MetricForwarderListener listener = installMetricProbes(metricProbe); Class testClass = loadClass(CLASS_NAME, getClass().getResource("/MyResource.class").getFile()); - Object result = - Reflect.onClass(testClass) - .create() - .call("createResource", (Object) null, (Object) null, 1) - .get(); + Object result = Reflect.onClass(testClass) + .create() + .call("createResource", (Object) null, (Object) null, 1) + .get(); assertNotNull(result); assertFalse(listener.gauges.containsKey(METRIC_NAME)); } @@ -1315,9 +1221,8 @@ private MetricForwarderListener installMethodMetric( String methodName, String signature, ValueScript valueScript) { - MetricProbe metricProbe = - createMethodMetric( - METRIC_ID, metricName, metricKind, typeName, methodName, signature, valueScript, null); + MetricProbe metricProbe = createMethodMetric( + METRIC_ID, metricName, metricKind, typeName, methodName, signature, valueScript, null); return installMetricProbes(metricProbe); } @@ -1329,9 +1234,8 @@ private MetricForwarderListener installMethodMetric( String signature, ValueScript valueScript, String[] tags) { - MetricProbe metricProbe = - createMethodMetric( - METRIC_ID, metricName, metricKind, typeName, methodName, signature, valueScript, tags); + MetricProbe metricProbe = createMethodMetric( + METRIC_ID, metricName, metricKind, typeName, methodName, signature, valueScript, tags); return installMetricProbes(metricProbe); } @@ -1382,13 +1286,12 @@ private MetricForwarderListener installMetricProbes(Configuration configuration) .thenReturn("http://localhost:8126/debugger/v1/input"); when(config.getFinalDebuggerSymDBUrl()).thenReturn("http://localhost:8126/symdb/v1/input"); probeStatusSink = mock(ProbeStatusSink.class); - currentTransformer = - new DebuggerTransformer( - config, - configuration, - null, - new ProbeMetadata(), - new DebuggerSink(config, probeStatusSink)); + currentTransformer = new DebuggerTransformer( + config, + configuration, + null, + new ProbeMetadata(), + new DebuggerSink(config, probeStatusSink)); instr.addTransformer(currentTransformer); MetricForwarderListener listener = new MetricForwarderListener(); DebuggerContext.initMetricForwarder(listener); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ProbeStatusTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ProbeStatusTest.java index eeb6fcde8bf..d989fbae265 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ProbeStatusTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ProbeStatusTest.java @@ -31,7 +31,8 @@ class ProbeStatusTest { private static final String ERROR_MESSAGE = "Error installing probe " + PROBE_ID + "."; private static final String RUNTIME_ID = "foo"; - @Mock private Config config; + @Mock + private Config config; private Builder builder; @@ -44,30 +45,27 @@ void setUp() { @Test void builderReceived() { - ProbeStatus expected = - new ProbeStatus( - SERVICE_NAME, - RECEIVED_MESSAGE, - new Diagnostics(PROBE_ID, RUNTIME_ID, Status.RECEIVED, null)); + ProbeStatus expected = new ProbeStatus( + SERVICE_NAME, + RECEIVED_MESSAGE, + new Diagnostics(PROBE_ID, RUNTIME_ID, Status.RECEIVED, null)); ProbeStatus actual = builder.receivedMessage(PROBE_ID); assertEquals(expected, actual); } @Test void builderReceivedNullSafe() { - assertDoesNotThrow( - () -> { - builder.receivedMessage(null); - }); + assertDoesNotThrow(() -> { + builder.receivedMessage(null); + }); } @Test void builderInstalled() { - ProbeStatus expected = - new ProbeStatus( - SERVICE_NAME, - INSTALLED_MESSAGE, - new Diagnostics(PROBE_ID, RUNTIME_ID, Status.INSTALLED, null)); + ProbeStatus expected = new ProbeStatus( + SERVICE_NAME, + INSTALLED_MESSAGE, + new Diagnostics(PROBE_ID, RUNTIME_ID, Status.INSTALLED, null)); ProbeStatus actual = builder.installedMessage(PROBE_ID); assertEquals(expected, actual); } @@ -75,15 +73,14 @@ void builderInstalled() { @Test void builderErrorMessage() { String exceptionMessage = "foo"; - ProbeStatus expected = - new ProbeStatus( - SERVICE_NAME, - ERROR_MESSAGE, - new Diagnostics( - PROBE_ID, - RUNTIME_ID, - Status.ERROR, - new ProbeException("NO_TYPE", exceptionMessage, Collections.emptyList()))); + ProbeStatus expected = new ProbeStatus( + SERVICE_NAME, + ERROR_MESSAGE, + new Diagnostics( + PROBE_ID, + RUNTIME_ID, + Status.ERROR, + new ProbeException("NO_TYPE", exceptionMessage, Collections.emptyList()))); ProbeStatus actual = builder.errorMessage(PROBE_ID, exceptionMessage); assertEquals(expected, actual); } @@ -92,19 +89,17 @@ void builderErrorMessage() { void builderErrorThrowable() { String exceptionMessage = "foo"; Exception exception = new Exception(exceptionMessage); - List capturedStackFrames = - Arrays.stream(exception.getStackTrace()) - .map(CapturedStackFrame::from) - .collect(Collectors.toList()); - ProbeStatus expected = - new ProbeStatus( - SERVICE_NAME, - ERROR_MESSAGE, - new Diagnostics( - PROBE_ID, - RUNTIME_ID, - Status.ERROR, - new ProbeException("java.lang.Exception", exceptionMessage, capturedStackFrames))); + List capturedStackFrames = Arrays.stream(exception.getStackTrace()) + .map(CapturedStackFrame::from) + .collect(Collectors.toList()); + ProbeStatus expected = new ProbeStatus( + SERVICE_NAME, + ERROR_MESSAGE, + new Diagnostics( + PROBE_ID, + RUNTIME_ID, + Status.ERROR, + new ProbeException("java.lang.Exception", exceptionMessage, capturedStackFrames))); ProbeStatus actual = builder.errorMessage(PROBE_ID, exception); assertEquals(expected, actual); } @@ -141,10 +136,9 @@ void errorMessage() { @Test void errorException() { - List stackTrace = - Arrays.stream(Thread.currentThread().getStackTrace()) - .map(CapturedStackFrame::from) - .collect(Collectors.toList()); + List stackTrace = Arrays.stream(Thread.currentThread().getStackTrace()) + .map(CapturedStackFrame::from) + .collect(Collectors.toList()); ProbeException probeException = new ProbeException("java.lang.Exception", ERROR_MESSAGE, stackTrace); Diagnostics diagnostics = new Diagnostics(PROBE_ID, RUNTIME_ID, Status.ERROR, probeException); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SnapshotSerializationTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SnapshotSerializationTest.java index 3c45c046014..6491df23335 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SnapshotSerializationTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SnapshotSerializationTest.java @@ -120,11 +120,10 @@ public void roundTripCapturedValue() throws IOException, URISyntaxException { CapturedContext.CapturedValue normalNullLocal = CapturedContext.CapturedValue.of("normalNullLocal", String.class.getTypeName(), null); // this object generates InaccessibleObjectException since JDK16 when extracting its fields - CapturedContext.CapturedValue notCapturedLocal = - CapturedContext.CapturedValue.of( - "notCapturedLocal", - OperatingSystemMXBean.class.getTypeName(), - ManagementFactory.getOperatingSystemMXBean()); + CapturedContext.CapturedValue notCapturedLocal = CapturedContext.CapturedValue.of( + "notCapturedLocal", + OperatingSystemMXBean.class.getTypeName(), + ManagementFactory.getOperatingSystemMXBean()); context.addLocals( new CapturedContext.CapturedValue[] {normalValuedLocal, normalNullLocal, notCapturedLocal}); context.evaluate( @@ -170,15 +169,14 @@ public void roundTripCaughtException() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); Snapshot.Captures captures = snapshot.getCaptures(); - captures.addCaughtException( - new CapturedContext.CapturedThrowable( - IllegalArgumentException.class.getTypeName(), - "illegal argument", - Arrays.asList( - new CapturedStackFrame("f1", 12), - new CapturedStackFrame("f2", 23), - new CapturedStackFrame("f3", 34)), - null)); + captures.addCaughtException(new CapturedContext.CapturedThrowable( + IllegalArgumentException.class.getTypeName(), + "illegal argument", + Arrays.asList( + new CapturedStackFrame("f1", 12), + new CapturedStackFrame("f2", 23), + new CapturedStackFrame("f3", 34)), + null)); String buffer = adapter.toJson(snapshot); System.out.println("roundTripCaughtException: " + buffer); Snapshot deserializedSnapshot = adapter.fromJson(buffer); @@ -195,16 +193,14 @@ public void roundtripEntryReturn() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext entryCapturedContext = new CapturedContext(); - entryCapturedContext.addLocals( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("localInt", "int", "42") - }); + entryCapturedContext.addLocals(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("localInt", "int", "42") + }); snapshot.setEntry(entryCapturedContext); CapturedContext exitCapturedContext = new CapturedContext(); - exitCapturedContext.addLocals( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("localInt", "int", "42") - }); + exitCapturedContext.addLocals(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("localInt", "int", "42") + }); exitCapturedContext.addReturn( CapturedContext.CapturedValue.of(String.class.getTypeName(), "foo")); exitCapturedContext.addThrowable(new RuntimeException("Illegal argument")); @@ -259,10 +255,9 @@ public void roundtripLines() throws IOException { Snapshot snapshot = createSnapshot(); Snapshot.Captures captures = snapshot.getCaptures(); CapturedContext lineCapturedContext = new CapturedContext(); - lineCapturedContext.addLocals( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("localInt", "int", "42") - }); + lineCapturedContext.addLocals(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("localInt", "int", "42") + }); captures.addLine(24, lineCapturedContext); String buffer = adapter.toJson(snapshot); System.out.println("roundtripLines: " + buffer); @@ -354,9 +349,8 @@ public void wellKnownClasses() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue objLocal = - capturedValueDepth( - "objLocal", WellKnownClasses.class.getTypeName(), new WellKnownClasses(), 3); + CapturedContext.CapturedValue objLocal = capturedValueDepth( + "objLocal", WellKnownClasses.class.getTypeName(), new WellKnownClasses(), 3); context.addLocals(new CapturedContext.CapturedValue[] {objLocal}); snapshot.setExit(context); String buffer = adapter.toJson(snapshot); @@ -439,9 +433,8 @@ public void objectArray() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue localObjArray = - capturedValueDepth( - "localObjArray", Object[].class.getTypeName(), new Object[] {"foo", null, 42}, 3); + CapturedContext.CapturedValue localObjArray = capturedValueDepth( + "localObjArray", Object[].class.getTypeName(), new Object[] {"foo", null, 42}, 3); context.addLocals(new CapturedContext.CapturedValue[] {localObjArray}); snapshot.setExit(context); String buffer = adapter.toJson(snapshot); @@ -459,9 +452,8 @@ public void fieldObjectArray() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue localObj = - capturedValueDepth( - "localObj", ObjetArrayClass.class.getTypeName(), new ObjetArrayClass(), 3); + CapturedContext.CapturedValue localObj = capturedValueDepth( + "localObj", ObjetArrayClass.class.getTypeName(), new ObjetArrayClass(), 3); context.addLocals(new CapturedContext.CapturedValue[] {localObj}); snapshot.setExit(context); String buffer = adapter.toJson(snapshot); @@ -492,9 +484,8 @@ public void fieldPrimitiveArray() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue localObj = - capturedValueDepth( - "localObj", PrimitiveArrayClass.class.getTypeName(), new PrimitiveArrayClass(), 3); + CapturedContext.CapturedValue localObj = capturedValueDepth( + "localObj", PrimitiveArrayClass.class.getTypeName(), new PrimitiveArrayClass(), 3); context.addLocals(new CapturedContext.CapturedValue[] {localObj}); snapshot.setExit(context); String buffer = adapter.toJson(snapshot); @@ -764,18 +755,17 @@ public void synchronizedMapLockedByAnotherThread() throws Exception { syncMap.put("foo", "bar"); CountDownLatch locked = new CountDownLatch(1); CountDownLatch release = new CountDownLatch(1); - Thread holder = - new Thread( - () -> { - synchronized (syncMap) { - locked.countDown(); - try { - release.await(); - } catch (InterruptedException ignored) { - } - } - }, - "mutex-holder"); + Thread holder = new Thread( + () -> { + synchronized (syncMap) { + locked.countDown(); + try { + release.await(); + } catch (InterruptedException ignored) { + } + } + }, + "mutex-holder"); // daemon: a failed await below would otherwise leave the mutex held and block the test JVM holder.setDaemon(true); holder.start(); @@ -784,14 +774,14 @@ public void synchronizedMapLockedByAnotherThread() throws Exception { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - context.addLocals( - new CapturedContext.CapturedValue[] { - capturedValueDepth("syncMap", syncMap.getClass().getTypeName(), syncMap, 1) - }); + context.addLocals(new CapturedContext.CapturedValue[] { + capturedValueDepth("syncMap", syncMap.getClass().getTypeName(), syncMap, 1) + }); snapshot.setExit(context); String buffer = CompletableFuture.supplyAsync(() -> adapter.toJson(snapshot)).get(30, TimeUnit.SECONDS); - Map local = (Map) getLocalsFromJson(buffer).get("syncMap"); + Map local = + (Map) getLocalsFromJson(buffer).get("syncMap"); assertNull(local.get(ENTRIES)); assertNull(local.get(SIZE)); Map fields = (Map) local.get(FIELDS); @@ -838,11 +828,8 @@ public void length255() throws IOException { @Test public void capturesAdapterNull() { - MoshiSnapshotHelper.CapturesAdapter capturesAdapter = - new MoshiSnapshotHelper.CapturesAdapter( - MoshiSnapshotTestHelper.createMoshiSnapshot(), - Duration.of(5, ChronoUnit.SECONDS), - null); + MoshiSnapshotHelper.CapturesAdapter capturesAdapter = new MoshiSnapshotHelper.CapturesAdapter( + MoshiSnapshotTestHelper.createMoshiSnapshot(), Duration.of(5, ChronoUnit.SECONDS), null); Assertions.assertEquals("null", capturesAdapter.toJson(null)); } @@ -858,9 +845,8 @@ public void collectionUnknown() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue listLocal = - CapturedContext.CapturedValue.of( - "listLocal", List.class.getTypeName(), new ArrayList() {}); + CapturedContext.CapturedValue listLocal = CapturedContext.CapturedValue.of( + "listLocal", List.class.getTypeName(), new ArrayList() {}); context.addLocals(new CapturedContext.CapturedValue[] {listLocal}); snapshot.setExit(context); String buffer = adapter.toJson(snapshot); @@ -878,9 +864,8 @@ public void mapValueUnknown() throws IOException { JsonAdapter adapter = createSnapshotAdapter(); Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue mapLocal = - CapturedContext.CapturedValue.of( - "mapLocal", Map.class.getTypeName(), new HashMap() {}); + CapturedContext.CapturedValue mapLocal = CapturedContext.CapturedValue.of( + "mapLocal", Map.class.getTypeName(), new HashMap() {}); context.addLocals(new CapturedContext.CapturedValue[] {mapLocal}); snapshot.setExit(context); String buffer = adapter.toJson(snapshot); @@ -1037,9 +1022,8 @@ public void captureExpressions() throws IOException { map.put("foo3", "bar3"); context.addCaptureExpression( CapturedContext.CapturedValue.of("expr1", Map.class.getTypeName(), map)); - context.addCaptureExpression( - CapturedContext.CapturedValue.of( - "expr2", List.class.getTypeName(), Arrays.asList("1", "2", "3"))); + context.addCaptureExpression(CapturedContext.CapturedValue.of( + "expr2", List.class.getTypeName(), Arrays.asList("1", "2", "3"))); context.addCaptureExpression( CapturedContext.CapturedValue.of("expr3", Integer.TYPE.getTypeName(), 42)); snapshot.setExit(context); @@ -1191,9 +1175,8 @@ private Snapshot createSnapshotForRefDepth(int maxRefDepth) { capturedValueDepth("objArg", ComplexClass.class.getTypeName(), null, maxRefDepth); context.addArguments(new CapturedContext.CapturedValue[] {intArg, strArg, objArg}); CapturedContext.CapturedValue intLocal = capturedValueDepth("intLocal", "int", 42, maxRefDepth); - CapturedContext.CapturedValue objLocal = - capturedValueDepth( - "objLocal", ComplexClass.class.getTypeName(), new ComplexClass(), maxRefDepth); + CapturedContext.CapturedValue objLocal = capturedValueDepth( + "objLocal", ComplexClass.class.getTypeName(), new ComplexClass(), maxRefDepth); context.addLocals(new CapturedContext.CapturedValue[] {intLocal, objLocal}); snapshot.setExit(context); return snapshot; @@ -1202,43 +1185,36 @@ private Snapshot createSnapshotForRefDepth(int maxRefDepth) { private Snapshot createSnapshotForCollectionSize(int maxColSize) { Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue intArrayLocal = - capturedValueColSize( - "intArrayLocal", "int[]", new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, maxColSize); - CapturedContext.CapturedValue strArrayLocal = - capturedValueColSize( - "strArrayLocal", - String[].class.getTypeName(), - new String[] { - "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9" - }, - maxColSize); - CapturedContext.CapturedValue objArrayLocal = - capturedValueColSize( - "objArrayLocal", - Object[].class.getTypeName(), - new Object[] { - new ComplexClass(), - new ComplexClass(), - new ComplexClass(), - new ComplexClass(), - new ComplexClass(), - new ComplexClass(), - new ComplexClass(), - new ComplexClass(), - new ComplexClass(), - new ComplexClass() - }, - maxColSize); - CapturedContext.CapturedValue listLocal = - capturedValueColSize( - "listLocal", - List.class.getTypeName(), - new ArrayList<>( - Arrays.asList( - "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", - "foo9")), - maxColSize); + CapturedContext.CapturedValue intArrayLocal = capturedValueColSize( + "intArrayLocal", "int[]", new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, maxColSize); + CapturedContext.CapturedValue strArrayLocal = capturedValueColSize( + "strArrayLocal", + String[].class.getTypeName(), + new String[] {"foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9" + }, + maxColSize); + CapturedContext.CapturedValue objArrayLocal = capturedValueColSize( + "objArrayLocal", + Object[].class.getTypeName(), + new Object[] { + new ComplexClass(), + new ComplexClass(), + new ComplexClass(), + new ComplexClass(), + new ComplexClass(), + new ComplexClass(), + new ComplexClass(), + new ComplexClass(), + new ComplexClass(), + new ComplexClass() + }, + maxColSize); + CapturedContext.CapturedValue listLocal = capturedValueColSize( + "listLocal", + List.class.getTypeName(), + new ArrayList<>(Arrays.asList( + "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9")), + maxColSize); Map mapObj = new HashMap<>(); mapObj.put("foo0", "bar0"); mapObj.put("foo1", "bar1"); @@ -1252,10 +1228,9 @@ private Snapshot createSnapshotForCollectionSize(int maxColSize) { mapObj.put("foo9", "bar9"); CapturedContext.CapturedValue mapLocal = capturedValueColSize("mapLocal", Map.class.getTypeName(), mapObj, maxColSize); - context.addLocals( - new CapturedContext.CapturedValue[] { - intArrayLocal, strArrayLocal, objArrayLocal, listLocal, mapLocal - }); + context.addLocals(new CapturedContext.CapturedValue[] { + intArrayLocal, strArrayLocal, objArrayLocal, listLocal, mapLocal + }); snapshot.setExit(context); return snapshot; } @@ -1274,15 +1249,14 @@ private Snapshot createSnapshotForMapSize(int maxColSize) { strMap.put("foo7", "bar7"); strMap.put("foo8", "bar8"); strMap.put("foo9", "bar9"); - CapturedContext.CapturedValue map = - CapturedContext.CapturedValue.of( - "strMap", - strMap.getClass().getTypeName(), - strMap, - Limits.DEFAULT_REFERENCE_DEPTH, - maxColSize, - Limits.DEFAULT_LENGTH, - Limits.DEFAULT_FIELD_COUNT); + CapturedContext.CapturedValue map = CapturedContext.CapturedValue.of( + "strMap", + strMap.getClass().getTypeName(), + strMap, + Limits.DEFAULT_REFERENCE_DEPTH, + maxColSize, + Limits.DEFAULT_LENGTH, + Limits.DEFAULT_FIELD_COUNT); context.addLocals(new CapturedContext.CapturedValue[] {map}); snapshot.setExit(context); return snapshot; @@ -1291,15 +1265,14 @@ private Snapshot createSnapshotForMapSize(int maxColSize) { private Snapshot createSnapshotForLength(int maxLength) { Snapshot snapshot = createSnapshot(); CapturedContext context = new CapturedContext(); - CapturedContext.CapturedValue strLocal = - CapturedContext.CapturedValue.of( - "strLocal", - String.class.getTypeName(), - "0123456789", - Limits.DEFAULT_REFERENCE_DEPTH, - Limits.DEFAULT_COLLECTION_SIZE, - maxLength, - Limits.DEFAULT_FIELD_COUNT); + CapturedContext.CapturedValue strLocal = CapturedContext.CapturedValue.of( + "strLocal", + String.class.getTypeName(), + "0123456789", + Limits.DEFAULT_REFERENCE_DEPTH, + Limits.DEFAULT_COLLECTION_SIZE, + maxLength, + Limits.DEFAULT_FIELD_COUNT); context.addLocals(new CapturedContext.CapturedValue[] {strLocal}); snapshot.setExit(context); return snapshot; @@ -1313,9 +1286,8 @@ private Snapshot createSnapshotForFieldCount(int maxFieldCount) { Limits.DEFAULT_COLLECTION_SIZE, Limits.DEFAULT_LENGTH, maxFieldCount); - CapturedContext.CapturedValue fieldHolder = - capturedValueFieldCount( - THIS, FieldHolder.class.getTypeName(), new FieldHolder(), maxFieldCount); + CapturedContext.CapturedValue fieldHolder = capturedValueFieldCount( + THIS, FieldHolder.class.getTypeName(), new FieldHolder(), maxFieldCount); context.addArguments(new CapturedContext.CapturedValue[] {fieldHolder}); snapshot.setExit(context); return snapshot; diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SourceFileTrackingTransformerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SourceFileTrackingTransformerTest.java index d6ceea59d4a..de4a2470e9c 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SourceFileTrackingTransformerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SourceFileTrackingTransformerTest.java @@ -44,9 +44,8 @@ void transformTopLevel() throws IllegalClassFormatException { null, getClassFileBytes(MyTopLevelClass.class)); sourceFileTrackingTransformer.flush(); - changedClasses = - finder.getAllLoadedChangedClasses( - new Class[] {TopLevelHelper.class, MyTopLevelClass.class}, comparer); + changedClasses = finder.getAllLoadedChangedClasses( + new Class[] {TopLevelHelper.class, MyTopLevelClass.class}, comparer); assertEquals(2, changedClasses.size()); assertEquals(TopLevelHelper.class, changedClasses.get(0)); assertEquals(MyTopLevelClass.class, changedClasses.get(1)); @@ -91,12 +90,10 @@ void transformInner() throws IllegalClassFormatException { null, getClassFileBytes(InnerHelper.MySecondInner.class)); sourceFileTrackingTransformer.flush(); - changedClasses = - finder.getAllLoadedChangedClasses( - new Class[] { - InnerHelper.class, InnerHelper.MyInner.class, InnerHelper.MySecondInner.class - }, - comparer); + changedClasses = finder.getAllLoadedChangedClasses( + new Class[] {InnerHelper.class, InnerHelper.MyInner.class, InnerHelper.MySecondInner.class + }, + comparer); assertEquals(3, changedClasses.size()); assertEquals(InnerHelper.class, changedClasses.get(0)); assertEquals(InnerHelper.MyInner.class, changedClasses.get(1)); @@ -172,12 +169,12 @@ private static void replaceInByteArray(byte[] buffer, byte[] oldBytes, byte[] ne } private ConfigurationComparer createComparer(String sourceFile) { - Configuration emptyConfig = Configuration.builder().setService("service-name").build(); - Configuration newConfig = - Configuration.builder() - .setService("service-name") - .add(new LogProbe.Builder().probeId("", 1).where(sourceFile, 42).build()) - .build(); + Configuration emptyConfig = + Configuration.builder().setService("service-name").build(); + Configuration newConfig = Configuration.builder() + .setService("service-name") + .add(new LogProbe.Builder().probeId("", 1).where(sourceFile, 42).build()) + .build(); return new ConfigurationComparer(emptyConfig, newConfig, new HashMap<>()); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanDecorationProbeInstrumentationTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanDecorationProbeInstrumentationTest.java index 5bb18c36d7e..9f304a53cff 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanDecorationProbeInstrumentationTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanDecorationProbeInstrumentationTest.java @@ -247,12 +247,11 @@ public void methodActiveSpanSynthDuration() throws IOException, URISyntaxExcepti @Test public void methodActiveSpanSynthException() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot20"; - SpanDecorationProbe.Decoration decoration = - createDecoration( - eq(getMember(ref("@exception"), "detailMessage"), value("oops")), - "@exception.detailMessage == 'oops'", - "tag1", - "{@exception.detailMessage}"); + SpanDecorationProbe.Decoration decoration = createDecoration( + eq(getMember(ref("@exception"), "detailMessage"), value("oops")), + "@exception.detailMessage == 'oops'", + "tag1", + "{@exception.detailMessage}"); installSingleSpanDecoration( CLASS_NAME, ACTIVE, decoration, "processWithException", "int (java.lang.String)"); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -359,38 +358,33 @@ public void mixedWithLogProbes() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot20"; SpanDecorationProbe.Decoration decoration1 = createDecoration("tag1", "{intLocal}"); SpanDecorationProbe.Decoration decoration2 = createDecoration("tag2", "{arg}"); - SpanDecorationProbe spanDecoProbe1 = - createProbeBuilder( - PROBE_ID1, ACTIVE, singletonList(decoration1), CLASS_NAME, "process", null) - .evaluateAt(MethodLocation.EXIT) - .build(); - SpanDecorationProbe spanDecoProbe2 = - createProbeBuilder( - PROBE_ID2, ACTIVE, singletonList(decoration2), CLASS_NAME, "process", null) - .evaluateAt(MethodLocation.ENTRY) - .build(); - LogProbe logProbe1 = - LogProbe.builder() - .probeId(PROBE_ID3) - .where(CLASS_NAME, "process") - .captureSnapshot(true) - .capture(1, 50, 50, 10) - .build(); - LogProbe logProbe2 = - LogProbe.builder() - .probeId(PROBE_ID4) - .where(CLASS_NAME, "process") - .captureSnapshot(true) - .capture(5, 200, 200, 30) - .build(); - Configuration configuration = - Configuration.builder() - .setService(SERVICE_NAME) - .add(logProbe1) - .add(logProbe2) - .add(spanDecoProbe1) - .add(spanDecoProbe2) - .build(); + SpanDecorationProbe spanDecoProbe1 = createProbeBuilder( + PROBE_ID1, ACTIVE, singletonList(decoration1), CLASS_NAME, "process", null) + .evaluateAt(MethodLocation.EXIT) + .build(); + SpanDecorationProbe spanDecoProbe2 = createProbeBuilder( + PROBE_ID2, ACTIVE, singletonList(decoration2), CLASS_NAME, "process", null) + .evaluateAt(MethodLocation.ENTRY) + .build(); + LogProbe logProbe1 = LogProbe.builder() + .probeId(PROBE_ID3) + .where(CLASS_NAME, "process") + .captureSnapshot(true) + .capture(1, 50, 50, 10) + .build(); + LogProbe logProbe2 = LogProbe.builder() + .probeId(PROBE_ID4) + .where(CLASS_NAME, "process") + .captureSnapshot(true) + .capture(5, 200, 200, 30) + .build(); + Configuration configuration = Configuration.builder() + .setService(SERVICE_NAME) + .add(logProbe1) + .add(logProbe2) + .add(spanDecoProbe1) + .add(spanDecoProbe2) + .build(); installSpanDecorationProbes(CLASS_NAME, configuration); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -412,22 +406,19 @@ public void mixedEntryExit() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot20"; SpanDecorationProbe.Decoration decoration1 = createDecoration("tag1", "{intLocal}"); SpanDecorationProbe.Decoration decoration2 = createDecoration("tag2", "{arg}"); - SpanDecorationProbe spanDecoProbe1 = - createProbeBuilder( - PROBE_ID1, ACTIVE, singletonList(decoration1), CLASS_NAME, "process", null) - .evaluateAt(MethodLocation.EXIT) - .build(); - SpanDecorationProbe spanDecoProbe2 = - createProbeBuilder( - PROBE_ID2, ACTIVE, singletonList(decoration2), CLASS_NAME, "process", null) - .evaluateAt(MethodLocation.ENTRY) - .build(); - Configuration configuration = - Configuration.builder() - .setService(SERVICE_NAME) - .add(spanDecoProbe1) - .add(spanDecoProbe2) - .build(); + SpanDecorationProbe spanDecoProbe1 = createProbeBuilder( + PROBE_ID1, ACTIVE, singletonList(decoration1), CLASS_NAME, "process", null) + .evaluateAt(MethodLocation.EXIT) + .build(); + SpanDecorationProbe spanDecoProbe2 = createProbeBuilder( + PROBE_ID2, ACTIVE, singletonList(decoration2), CLASS_NAME, "process", null) + .evaluateAt(MethodLocation.ENTRY) + .build(); + Configuration configuration = Configuration.builder() + .setService(SERVICE_NAME) + .add(spanDecoProbe1) + .add(spanDecoProbe2) + .build(); installSpanDecorationProbes(CLASS_NAME, configuration); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.on(testClass).call("main", "1").get(); @@ -471,21 +462,18 @@ public void keywordRedaction() throws IOException, URISyntaxException { @Test public void keywordRedactionConditions() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot28"; - SpanDecorationProbe.Decoration decoration1 = - createDecoration( - DSL.contains(DSL.getMember(DSL.ref("this"), "password"), new StringValue("123")), - "contains(this.password, '123')", - "tag1", - "foo"); - SpanDecorationProbe.Decoration decoration2 = - createDecoration( - DSL.eq(DSL.ref("password"), DSL.value("123")), "password == '123'", "tag2", "foo"); - SpanDecorationProbe.Decoration decoration3 = - createDecoration( - DSL.eq(DSL.index(DSL.ref("strMap"), DSL.value("password")), DSL.value("123")), - "strMap['password'] == '123'", - "tag3", - "foo"); + SpanDecorationProbe.Decoration decoration1 = createDecoration( + DSL.contains(DSL.getMember(DSL.ref("this"), "password"), new StringValue("123")), + "contains(this.password, '123')", + "tag1", + "foo"); + SpanDecorationProbe.Decoration decoration2 = createDecoration( + DSL.eq(DSL.ref("password"), DSL.value("123")), "password == '123'", "tag2", "foo"); + SpanDecorationProbe.Decoration decoration3 = createDecoration( + DSL.eq(DSL.index(DSL.ref("strMap"), DSL.value("password")), DSL.value("123")), + "strMap['password'] == '123'", + "tag3", + "foo"); List decorations = asList(decoration1, decoration2, decoration3); installSingleSpanDecoration( @@ -552,26 +540,23 @@ public void typeRedactionConditions() throws IOException, URISyntaxException { when(config.getDynamicInstrumentationRedactedTypes()) .thenReturn("com.datadog.debugger.CapturedSnapshot28$Creds"); Redaction.addUserDefinedTypes(config); - SpanDecorationProbe.Decoration decoration1 = - createDecoration( - DSL.contains( - DSL.getMember(DSL.getMember(DSL.ref("this"), "creds"), "secretCode"), - new StringValue("123")), - "contains(this.creds.secretCode, '123')", - "tag1", - "foo"); - SpanDecorationProbe.Decoration decoration2 = - createDecoration( - DSL.eq(DSL.getMember(DSL.ref("creds"), "secretCode"), DSL.value("123")), - "creds.secretCode == '123'", - "tag2", - "foo"); - SpanDecorationProbe.Decoration decoration3 = - createDecoration( - DSL.eq(DSL.index(DSL.ref("credMap"), DSL.value("dave")), DSL.value("123")), - "credMap['dave'] == '123'", - "tag3", - "foo"); + SpanDecorationProbe.Decoration decoration1 = createDecoration( + DSL.contains( + DSL.getMember(DSL.getMember(DSL.ref("this"), "creds"), "secretCode"), + new StringValue("123")), + "contains(this.creds.secretCode, '123')", + "tag1", + "foo"); + SpanDecorationProbe.Decoration decoration2 = createDecoration( + DSL.eq(DSL.getMember(DSL.ref("creds"), "secretCode"), DSL.value("123")), + "creds.secretCode == '123'", + "tag2", + "foo"); + SpanDecorationProbe.Decoration decoration3 = createDecoration( + DSL.eq(DSL.index(DSL.ref("credMap"), DSL.value("dave")), DSL.value("123")), + "credMap['dave'] == '123'", + "tag3", + "foo"); List decorations = asList(decoration1, decoration2, decoration3); installSingleSpanDecoration( @@ -634,19 +619,15 @@ private void doSamplingTest( } private SpanDecorationProbe.Decoration createDecoration(String tagName, String valueDsl) { - List tags = - asList( - new SpanDecorationProbe.Tag( - tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); + List tags = asList(new SpanDecorationProbe.Tag( + tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); return new SpanDecorationProbe.Decoration(null, tags); } private SpanDecorationProbe.Decoration createDecoration( BooleanExpression expression, String dsl, String tagName, String valueDsl) { - List tags = - asList( - new SpanDecorationProbe.Tag( - tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); + List tags = asList(new SpanDecorationProbe.Tag( + tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); return new SpanDecorationProbe.Decoration(new ProbeCondition(DSL.when(expression), dsl), tags); } @@ -748,7 +729,8 @@ private static SpanDecorationProbe.Builder createProbeBuilder( private void installSpanProbes(String expectedClassName, SpanDecorationProbe... probes) { installSpanDecorationProbes( - expectedClassName, Configuration.builder().setService(SERVICE_NAME).add(probes).build()); + expectedClassName, + Configuration.builder().setService(SERVICE_NAME).add(probes).build()); } private void installSpanDecorationProbes(String expectedClassName, Configuration configuration) { @@ -765,9 +747,8 @@ private void installSpanDecorationProbes(String expectedClassName, Configuration } } ProbeMetadata probeMetadata = new ProbeMetadata(); - currentTransformer = - new DebuggerTransformer( - config, configuration, null, probeMetadata, new DebuggerSink(config, probeStatusSink)); + currentTransformer = new DebuggerTransformer( + config, configuration, null, probeMetadata, new DebuggerSink(config, probeStatusSink)); instr.addTransformer(currentTransformer); mockSink = new MockSink(config, probeStatusSink); DebuggerAgentHelper.injectSink(mockSink); @@ -776,11 +757,10 @@ private void installSpanDecorationProbes(String expectedClassName, Configuration } static ProbeImplementation resolver(String encodedProbeId, Configuration configuration) { - List> list1 = - asList( - configuration.getSpanDecorationProbes(), - configuration.getLogProbes(), - configuration.getTriggerProbes()); + List> list1 = asList( + configuration.getSpanDecorationProbes(), + configuration.getLogProbes(), + configuration.getTriggerProbes()); for (Collection list : list1) { ProbeImplementation probe = scanForProbe(encodedProbeId, list); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanProbeInstrumentationTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanProbeInstrumentationTest.java index ece84ac483c..dd3c91f346e 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanProbeInstrumentationTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SpanProbeInstrumentationTest.java @@ -145,13 +145,12 @@ private MockTracer installSpanProbes(Configuration configuration) { .thenReturn("http://localhost:8126/debugger/v1/input"); when(config.getFinalDebuggerSymDBUrl()).thenReturn("http://localhost:8126/symdb/v1/input"); probeStatusSink = mock(ProbeStatusSink.class); - currentTransformer = - new DebuggerTransformer( - config, - configuration, - null, - new ProbeMetadata(), - new DebuggerSink(config, probeStatusSink)); + currentTransformer = new DebuggerTransformer( + config, + configuration, + null, + new ProbeMetadata(), + new DebuggerSink(config, probeStatusSink)); instr.addTransformer(currentTransformer); mockSink = new MockSink(config, probeStatusSink); DebuggerAgentHelper.injectSink(mockSink); @@ -218,6 +217,10 @@ private static SpanProbe createSpan( private static SpanProbe createSpan( ProbeId id, String sourceFile, int lineFrom, int lineTill, String[] tags) { - return SpanProbe.builder().probeId(id).where(sourceFile, lineFrom, lineTill).tags(tags).build(); + return SpanProbe.builder() + .probeId(id) + .where(sourceFile, lineFrom, lineTill) + .tags(tags) + .build(); } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/StringTemplateBuilderTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/StringTemplateBuilderTest.java index 24b6ca671cb..aa0f7550b2f 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/StringTemplateBuilderTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/StringTemplateBuilderTest.java @@ -71,10 +71,9 @@ public void argTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "foo") - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "foo") + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("foo", message); } @@ -82,18 +81,16 @@ public void argTemplate() { @Test public void booleanArgTemplate() { List segments = new ArrayList<>(); - segments.add( - new LogProbe.Segment( - new ValueScript( - DSL.bool(DSL.contains(DSL.ref("arg"), new StringValue("o"))), "{arg}"))); - LogProbe probe = LogProbe.builder().template("{contains(arg, 'o')}", segments).build(); + segments.add(new LogProbe.Segment( + new ValueScript(DSL.bool(DSL.contains(DSL.ref("arg"), new StringValue("o"))), "{arg}"))); + LogProbe probe = + LogProbe.builder().template("{contains(arg, 'o')}", segments).build(); StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "foo") - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "foo") + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("true", message); } @@ -104,18 +101,16 @@ public void argMultipleInFlightTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "foo") - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "foo") + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); StringTemplateBuilder summaryBuilder2 = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext2 = new CapturedContext(); - capturedContext2.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "bar") - }); + capturedContext2.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("arg", String.class.getTypeName(), "bar") + }); String message2 = summaryBuilder2.evaluate(capturedContext2, new LogProbe.LogStatus(probe)); assertEquals("foo", message); assertEquals("bar", message2); @@ -127,10 +122,9 @@ public void argNullTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("nullObject", Object.class.getTypeName(), null) - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("nullObject", Object.class.getTypeName(), null) + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("null", message); } @@ -141,17 +135,13 @@ public void argArrayTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of( - "primArray", String.class.getTypeName(), new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}), - CapturedContext.CapturedValue.of( - "strArray", - String.class.getTypeName(), - new String[] { - "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9" - }) - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of( + "primArray", String.class.getTypeName(), new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}), + CapturedContext.CapturedValue.of("strArray", String.class.getTypeName(), new String[] { + "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9" + }) + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("[0, 1, 2, ...] [foo0, foo1, foo2, ...]", message); } @@ -162,23 +152,18 @@ public void argCollectionTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of( - "strList", - String.class.getTypeName(), - new ArrayList<>( - Arrays.asList( - "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", - "foo9"))), - CapturedContext.CapturedValue.of( - "strSet", - String.class.getTypeName(), - new LinkedHashSet<>( - Arrays.asList( - "bar0", "bar1", "bar2", "bar3", "bar4", "bar5", "bar6", "bar7", "bar8", - "bar9"))) - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of( + "strList", + String.class.getTypeName(), + new ArrayList<>(Arrays.asList( + "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9"))), + CapturedContext.CapturedValue.of( + "strSet", + String.class.getTypeName(), + new LinkedHashSet<>(Arrays.asList( + "bar0", "bar1", "bar2", "bar3", "bar4", "bar5", "bar6", "bar7", "bar8", "bar9"))) + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("[foo0, foo1, foo2, ...] [bar0, bar1, bar2, ...]", message); } @@ -193,10 +178,9 @@ public void argMapTemplate() { for (int i = 0; i < 10; i++) { map.put("foo" + i, "bar" + i); } - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("strMap", String.class.getTypeName(), map) - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("strMap", String.class.getTypeName(), map) + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("{[foo0=bar0], [foo1=bar1], [foo2=bar2], ...}", message); } @@ -218,10 +202,9 @@ public void argComplexObjectTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of("obj", Level0.class.getTypeName(), new Level0()) - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of("obj", Level0.class.getTypeName(), new Level0()) + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("{intField0=0, strField0=foo0, level1=...}", message); } @@ -232,11 +215,10 @@ public void argComplexObjectArrayTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of( - "array", Level0[].class.getTypeName(), new Level0[] {new Level0(), new Level0()}) - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of( + "array", Level0[].class.getTypeName(), new Level0[] {new Level0(), new Level0()}) + }); String message = summaryBuilder.evaluate(capturedContext, new LogProbe.LogStatus(probe)); assertEquals("[..., ...]", message); } @@ -249,11 +231,10 @@ public void argInaccessibleFieldTemplate() { StringTemplateBuilder summaryBuilder = new StringTemplateBuilder(probe.getSegments(), LIMITS, TIMEOUT); CapturedContext capturedContext = new CapturedContext(); - capturedContext.addArguments( - new CapturedContext.CapturedValue[] { - CapturedContext.CapturedValue.of( - "obj", Object.class.getTypeName(), ManagementFactory.getOperatingSystemMXBean()) - }); + capturedContext.addArguments(new CapturedContext.CapturedValue[] { + CapturedContext.CapturedValue.of( + "obj", Object.class.getTypeName(), ManagementFactory.getOperatingSystemMXBean()) + }); LogProbe.LogStatus status = new LogProbe.LogStatus(probe); String message = summaryBuilder.evaluate(capturedContext, status); assertEquals( diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ThirdPartyLibrariesTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ThirdPartyLibrariesTest.java index 01abb157469..eca341cc5ff 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ThirdPartyLibrariesTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ThirdPartyLibrariesTest.java @@ -33,10 +33,9 @@ void testGetExcludesContainsDefaultExclude() { void testGetExcludesWithExplicitExclude() { when(mockConfig.getThirdPartyIncludes()) .thenReturn(Collections.singleton("com.datadog.debugger")); - assertTrue( - ThirdPartyLibraries.INSTANCE - .getThirdPartyLibraries(mockConfig) - .contains("com.datadog.debugger")); + assertTrue(ThirdPartyLibraries.INSTANCE + .getThirdPartyLibraries(mockConfig) + .contains("com.datadog.debugger")); } @Test @@ -45,14 +44,12 @@ void testGetExcludesWithExplicitExcludeAndExplicitInclude() { .thenReturn(Collections.singleton("com.datadog.debugger")); when(mockConfig.getThirdPartyExcludes()) .thenReturn(Collections.singleton("com.datadog.debugger")); - assertTrue( - ThirdPartyLibraries.INSTANCE - .getThirdPartyLibraries(mockConfig) - .contains("com.datadog.debugger")); - assertTrue( - ThirdPartyLibraries.INSTANCE - .getThirdPartyExcludes(mockConfig) - .contains("com.datadog.debugger")); + assertTrue(ThirdPartyLibraries.INSTANCE + .getThirdPartyLibraries(mockConfig) + .contains("com.datadog.debugger")); + assertTrue(ThirdPartyLibraries.INSTANCE + .getThirdPartyExcludes(mockConfig) + .contains("com.datadog.debugger")); } @Test diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/TransformerDefinitionMatcherTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/TransformerDefinitionMatcherTest.java index 96b7bf2da05..81d503017f3 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/TransformerDefinitionMatcherTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/TransformerDefinitionMatcherTest.java @@ -46,12 +46,11 @@ public void simpleClassName() { public void simpleClassNameNoClassRedefined() { LogProbe probe = createProbe(PROBE_ID1, "String", "indexOf"); TransformerDefinitionMatcher matcher = createMatcher(probe); - List probeDefinitions = - matcher.match( - null, - getClassPath(String.class), - String.class.getTypeName(), - getClassFileBytes(String.class)); + List probeDefinitions = matcher.match( + null, + getClassPath(String.class), + String.class.getTypeName(), + getClassFileBytes(String.class)); assertEquals(1, probeDefinitions.size()); assertEquals(PROBE_ID1, probeDefinitions.get(0).getProbeId()); } @@ -95,9 +94,8 @@ public void sourceFileWindowsStyleFileName() { @Test public void sourceFileWindowsStyleAbsoluteFileName() { - LogProbe probe = - createProbe( - PROBE_ID1, "C:\\Users\\user\\project\\src\\main\\java\\java\\lang\\String.java", 23); + LogProbe probe = createProbe( + PROBE_ID1, "C:\\Users\\user\\project\\src\\main\\java\\java\\lang\\String.java", 23); TransformerDefinitionMatcher matcher = createMatcher(probe); List probeDefinitions = match(matcher, String.class); assertEquals(1, probeDefinitions.size()); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/el/ELIntegrationSanityTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/el/ELIntegrationSanityTest.java index 7b6382cae21..dcec34c5e86 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/el/ELIntegrationSanityTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/el/ELIntegrationSanityTest.java @@ -48,23 +48,20 @@ void extractAfterEl() throws IllegalAccessException { Limits initialLimits = new Limits(2, 0, Integer.MAX_VALUE, Integer.MAX_VALUE); // create new captured context CapturedContext capturedContext = new CapturedContext(); - CapturedContext.CapturedValue thisValue = - CapturedContext.CapturedValue.of( - "this", - Person.class.getName(), - p, - initialLimits.maxReferenceDepth, - initialLimits.maxCollectionSize, - initialLimits.maxLength, - initialLimits.maxFieldCount); + CapturedContext.CapturedValue thisValue = CapturedContext.CapturedValue.of( + "this", + Person.class.getName(), + p, + initialLimits.maxReferenceDepth, + initialLimits.maxCollectionSize, + initialLimits.maxLength, + initialLimits.maxFieldCount); capturedContext.addArguments(new CapturedContext.CapturedValue[] {thisValue}); // '.name.value' is not present in the snapshot - it needs to be retrieved via reflection - Value val = - DSL.getMember(DSL.ref("name"), "value") - .evaluate( - new EvalContext( - capturedContext, TimeoutChecker.create(Config.get(), Duration.ofMillis(1000)))); + Value val = DSL.getMember(DSL.ref("name"), "value") + .evaluate(new EvalContext( + capturedContext, TimeoutChecker.create(Config.get(), Duration.ofMillis(1000)))); // make sure the nested field was properly resolved assertEquals(p.name.value, val.getValue()); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/DefaultExceptionDebuggerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/DefaultExceptionDebuggerTest.java index 5fb5a05bf5d..da38c471cd5 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/DefaultExceptionDebuggerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/DefaultExceptionDebuggerTest.java @@ -63,9 +63,8 @@ public class DefaultExceptionDebuggerTest { @BeforeEach public void setUp() { configurationUpdater = mock(ConfigurationUpdater.class); - classNameFiltering = - new ClassNameFiltering( - new HashSet<>(singletonList("com.datadog.debugger.exception.ThirdPartyCode"))); + classNameFiltering = new ClassNameFiltering( + new HashSet<>(singletonList("com.datadog.debugger.exception.ThirdPartyCode"))); Config config = createConfig(); exceptionDebugger = new DefaultExceptionDebugger(configurationUpdater, classNameFiltering, config); @@ -122,29 +121,24 @@ public void nestedException() { Map snapshotMap = listener.snapshots.stream().collect(toMap(Snapshot::getId, Function.identity())); List lines = parseStackTrace(exception); - int expectedFrameIndex = - findFrameIndex( - lines, - "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createNestException"); + int expectedFrameIndex = findFrameIndex( + lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createNestException"); assertSnapshot( spanTags, snapshotMap, expectedFrameIndex, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest", "createNestException"); - expectedFrameIndex = - findFrameIndex( - lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.nestedException"); + expectedFrameIndex = findFrameIndex( + lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.nestedException"); assertSnapshot( spanTags, snapshotMap, expectedFrameIndex, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest", "nestedException"); - expectedFrameIndex = - findFrameIndex( - lines, - "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createTest1Exception"); + expectedFrameIndex = findFrameIndex( + lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createTest1Exception"); assertSnapshot( spanTags, snapshotMap, @@ -202,30 +196,24 @@ public void doubleNestedException() { Map snapshotMap = listener.snapshots.stream().collect(toMap(Snapshot::getId, Function.identity())); List lines = parseStackTrace(nestedException); - int expectedFrameIndex = - findFrameIndex( - lines, - "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createNestException"); + int expectedFrameIndex = findFrameIndex( + lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createNestException"); assertSnapshot( spanTags, snapshotMap, expectedFrameIndex, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest", "createNestException"); - expectedFrameIndex = - findFrameIndex( - lines, - "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.doubleNestedException"); + expectedFrameIndex = findFrameIndex( + lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.doubleNestedException"); assertSnapshot( spanTags, snapshotMap, expectedFrameIndex, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest", "doubleNestedException"); - expectedFrameIndex = - findFrameIndex( - lines, - "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createTest1Exception"); + expectedFrameIndex = findFrameIndex( + lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createTest1Exception"); assertSnapshot( spanTags, snapshotMap, @@ -272,10 +260,8 @@ public void nestedExceptionFullThirdParty() { Map snapshotMap = listener.snapshots.stream().collect(toMap(Snapshot::getId, Function.identity())); List lines = parseStackTrace(exception); - int expectedFrameIndex = - findFrameIndex( - lines, - "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createTest2Exception"); + int expectedFrameIndex = findFrameIndex( + lines, "com.datadog.debugger.exception.DefaultExceptionDebuggerTest.createTest2Exception"); assertSnapshot( spanTags, snapshotMap, @@ -295,22 +281,18 @@ public void filteringOutErrors() { @Test public void lambdaTruncatedInnerTraceFallback() { - RuntimeException exception = - new RuntimeException("lambda") { - // mock the stacktrace to simulate a truncated one - @Override - public StackTraceElement[] getStackTrace() { - return new StackTraceElement[] { - new StackTraceElement("Main", "handleRequest", "Main.java", 11), - new StackTraceElement( - "jdk.internal.reflect.DirectMethodHandleAccessor", - "invoke", - "Unknown Source", - -1), - new StackTraceElement("java.lang.reflect.Method", "invoke", "Unknown Source", -1) - }; - } + RuntimeException exception = new RuntimeException("lambda") { + // mock the stacktrace to simulate a truncated one + @Override + public StackTraceElement[] getStackTrace() { + return new StackTraceElement[] { + new StackTraceElement("Main", "handleRequest", "Main.java", 11), + new StackTraceElement( + "jdk.internal.reflect.DirectMethodHandleAccessor", "invoke", "Unknown Source", -1), + new StackTraceElement("java.lang.reflect.Method", "invoke", "Unknown Source", -1) }; + } + }; String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering); AgentSpan span = mock(AgentSpan.class); doAnswer(this::recordTags).when(span).setTag(anyString(), anyString()); @@ -425,19 +407,17 @@ private void generateSnapshots(RuntimeException exception) { private void rewriteSnapshotStacktrace( RuntimeException exception, Throwable throwable, int framesToRemove) { - ExceptionProbeManager.ThrowableState state = - exceptionDebugger - .getExceptionProbeManager() - .getStateByThrowable(ExceptionHelper.getInnerMostThrowable(exception)); + ExceptionProbeManager.ThrowableState state = exceptionDebugger + .getExceptionProbeManager() + .getStateByThrowable(ExceptionHelper.getInnerMostThrowable(exception)); Snapshot lastSnapshot = state.getSnapshots().get(state.getSnapshots().size() - 1); lastSnapshot.getStack().clear(); lastSnapshot .getStack() - .addAll( - Arrays.stream(throwable.getStackTrace()) - .skip(framesToRemove) - .map(CapturedStackFrame::from) - .collect(toList())); + .addAll(Arrays.stream(throwable.getStackTrace()) + .skip(framesToRemove) + .map(CapturedStackFrame::from) + .collect(toList())); } private void evalAndCommitProbe(RuntimeException exception, ExceptionProbe exceptionProbe) { @@ -452,16 +432,14 @@ private void evalAndCommitProbe(RuntimeException exception, ExceptionProbe excep private Map buildProbesByLocation() { BinaryOperator dropMerger = (oldValue, newValue) -> oldValue; return exceptionDebugger.getExceptionProbeManager().getProbes().stream() - .collect( - toMap( - probe -> - probe.getWhere().getTypeName() - + "::" - + probe.getWhere().getMethodName() - + ":" - + probe.getWhere().getLines()[0], - Function.identity(), - dropMerger)); + .collect(toMap( + probe -> probe.getWhere().getTypeName() + + "::" + + probe.getWhere().getMethodName() + + ":" + + probe.getWhere().getLines()[0], + Function.identity(), + dropMerger)); } private RuntimeException createNestException() { diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java index 64709cc54ee..f7930f43851 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java @@ -70,19 +70,17 @@ public class ExceptionProbeInstrumentationTest { private final Instrumentation instr = ByteBuddyAgent.install(); private final TestTraceInterceptor traceInterceptor = new TestTraceInterceptor(); private ClassFileTransformer currentTransformer; - private final ClassNameFilter classNameFiltering = - new ClassNameFiltering( - Stream.of( - "java.", - "jdk.", - "com.sun.", - "sun.", - "org.gradle.", - "worker.org.gradle.", - "org.junit.", - "org.joor.", - "com.datadog.debugger.exception.") - .collect(Collectors.toSet())); + private final ClassNameFilter classNameFiltering = new ClassNameFiltering(Stream.of( + "java.", + "jdk.", + "com.sun.", + "sun.", + "org.gradle.", + "worker.org.gradle.", + "org.junit.", + "org.joor.", + "com.datadog.debugger.exception.") + .collect(Collectors.toSet())); private MockSampler probeSampler; private MockSampler globalSampler; @@ -155,11 +153,14 @@ public void instrumentAndCaptureSnapshots() throws Exception { extractProbeIdsByMethodName(exceptionProbeManager); assertEquals(1, listener.snapshots.size()); Snapshot snapshot0 = listener.snapshots.get(0); - assertProbeId(probeIdsByMethodName, "processWithException", snapshot0.getProbe().getId()); - assertEquals("oops", snapshot0.getCaptures().getReturn().getCapturedThrowable().getMessage()); + assertProbeId( + probeIdsByMethodName, "processWithException", snapshot0.getProbe().getId()); + assertEquals( + "oops", snapshot0.getCaptures().getReturn().getCapturedThrowable().getMessage()); ProbeLocation location = snapshot0.getProbe().getLocation(); assertEquals( - location.getType() + "." + location.getMethod(), snapshot0.getStack().get(0).getFunction()); + location.getType() + "." + location.getMethod(), + snapshot0.getStack().get(0).getFunction()); MutableSpan span = traceInterceptor.getFirstSpan(); assertEquals(snapshot0.getExceptionId(), span.getTags().get(DD_DEBUG_ERROR_EXCEPTION_ID)); assertEquals(fingerprint, span.getTags().get(DD_DEBUG_ERROR_EXCEPTION_HASH)); @@ -199,10 +200,12 @@ public void differentExceptionsSameStack() throws Exception { callMethodThrowingIllegalArgException(testClass); assertEquals(2, listener.snapshots.size()); Snapshot snapshot0 = listener.snapshots.get(0); - assertProbeId(probeIdsByMethodName, "processWithException", snapshot0.getProbe().getId()); + assertProbeId( + probeIdsByMethodName, "processWithException", snapshot0.getProbe().getId()); assertExceptionMsg("oops", snapshot0); Snapshot snapshot1 = listener.snapshots.get(1); - assertProbeId(probeIdsByMethodName, "processWithException", snapshot1.getProbe().getId()); + assertProbeId( + probeIdsByMethodName, "processWithException", snapshot1.getProbe().getId()); assertExceptionMsg("illegal argument", snapshot1); MutableSpan span0 = traceInterceptor.getAllTraces().get(0).get(0); assertEquals(snapshot0.getExceptionId(), span0.getTags().get(DD_DEBUG_ERROR_EXCEPTION_ID)); @@ -240,11 +243,14 @@ public void recursive() throws Exception { assertProbeId(probeIdsByMethodName, "fiboException", snapshot0.getProbe().getId()); assertEquals( "oops fibo", snapshot0.getCaptures().getReturn().getCapturedThrowable().getMessage()); - assertEquals("1", getValue(snapshot0.getCaptures().getReturn().getArguments().get("n"))); + assertEquals( + "1", getValue(snapshot0.getCaptures().getReturn().getArguments().get("n"))); Snapshot snapshot1 = listener.snapshots.get(1); - assertEquals("2", getValue(snapshot1.getCaptures().getReturn().getArguments().get("n"))); + assertEquals( + "2", getValue(snapshot1.getCaptures().getReturn().getArguments().get("n"))); Snapshot snapshot2 = listener.snapshots.get(2); - assertEquals("3", getValue(snapshot2.getCaptures().getReturn().getArguments().get("n"))); + assertEquals( + "3", getValue(snapshot2.getCaptures().getReturn().getArguments().get("n"))); // sampling happens only once ont he first snapshot then forced for coordinated sampling assertEquals(1, probeSampler.getCallCount()); assertEquals(1, globalSampler.getCallCount()); @@ -284,8 +290,10 @@ public void mixedWithLogProbes() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot20"; Config config = createConfig(); ExceptionProbeManager exceptionProbeManager = new ExceptionProbeManager(classNameFiltering); - LogProbe logProbe = - LogProbe.builder().probeId(PROBE_ID).where(CLASS_NAME, "processWithException").build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where(CLASS_NAME, "processWithException") + .build(); Collection definitions = Arrays.asList(logProbe); TestSnapshotListener listener = setupExceptionDebugging(config, exceptionProbeManager, classNameFiltering, definitions); @@ -304,7 +312,8 @@ public void mixedWithLogProbes() throws IOException, URISyntaxException { Snapshot snapshot1 = listener.snapshots.get(1); assertEquals(PROBE_ID.getId(), snapshot1.getProbe().getId()); Snapshot snapshot2 = listener.snapshots.get(2); - assertProbeId(probeIdsByMethodName, "processWithException", snapshot2.getProbe().getId()); + assertProbeId( + probeIdsByMethodName, "processWithException", snapshot2.getProbe().getId()); } private static void assertExceptionMsg(String expectedMsg, Snapshot snapshot) { @@ -359,10 +368,9 @@ private String callMethodFiboException(Class testClass) { private static Map> extractProbeIdsByMethodName( ExceptionProbeManager exceptionProbeManager) { return exceptionProbeManager.getProbes().stream() - .collect( - Collectors.groupingBy( - exceptionProbe -> exceptionProbe.getWhere().getMethodName(), - Collectors.mapping(ExceptionProbe::getId, Collectors.toSet()))); + .collect(Collectors.groupingBy( + exceptionProbe -> exceptionProbe.getWhere().getMethodName(), + Collectors.mapping(ExceptionProbe::getId, Collectors.toSet()))); } private TestSnapshotListener setupExceptionDebugging( @@ -378,20 +386,18 @@ private TestSnapshotListener setupExceptionDebugging( ClassNameFilter classNameFiltering, Collection definitions) { ProbeStatusSink probeStatusSink = mock(ProbeStatusSink.class); - ConfigurationUpdater configurationUpdater = - new ConfigurationUpdater( - instr, - this::createTransformer, - config, - new DebuggerSink(config, probeStatusSink), - new ClassesToRetransformFinder()); + ConfigurationUpdater configurationUpdater = new ConfigurationUpdater( + instr, + this::createTransformer, + config, + new DebuggerSink(config, probeStatusSink), + new ClassesToRetransformFinder()); TestSnapshotListener listener = new TestSnapshotListener(config, probeStatusSink); DebuggerAgentHelper.injectSink(listener); DebuggerContext.initProbeResolver(configurationUpdater); DebuggerContext.initValueSerializer(new JsonSnapshotSerializer()); - DefaultExceptionDebugger exceptionDebugger = - new DefaultExceptionDebugger( - exceptionProbeManager, configurationUpdater, classNameFiltering, 100, 3, true); + DefaultExceptionDebugger exceptionDebugger = new DefaultExceptionDebugger( + exceptionProbeManager, configurationUpdater, classNameFiltering, 100, 3, true); DebuggerContext.initExceptionDebugger(exceptionDebugger); configurationUpdater.accept(REMOTE_CONFIG, definitions); return listener; diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeManagerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeManagerTest.java index 3cd66b78f5d..6f4fafa7ef0 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeManagerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeManagerTest.java @@ -34,17 +34,9 @@ public void instrumentStackTrace() { @Test void instrumentSingleFrame() { - ClassNameFiltering classNameFiltering = - new ClassNameFiltering( - Stream.of( - "java.", - "jdk.", - "sun.", - "com.sun.", - "org.gradle.", - "worker.org.gradle.", - "org.junit.") - .collect(Collectors.toSet())); + ClassNameFiltering classNameFiltering = new ClassNameFiltering(Stream.of( + "java.", "jdk.", "sun.", "com.sun.", "org.gradle.", "worker.org.gradle.", "org.junit.") + .collect(Collectors.toSet())); ExceptionProbeManager exceptionProbeManager = new ExceptionProbeManager(classNameFiltering); String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering); @@ -62,13 +54,12 @@ void filterAllFrames() { Config config = mock(Config.class); when(config.getThirdPartyExcludes()).thenReturn(Collections.emptySet()); when(config.getThirdPartyIncludes()) - .thenReturn( - Stream.of( - "org.gradle.", - "worker.org.gradle.", - "org.junit.", - "com.datadog.debugger.exception.ExceptionProbeManagerTest") - .collect(Collectors.toSet())); + .thenReturn(Stream.of( + "org.gradle.", + "worker.org.gradle.", + "org.junit.", + "com.datadog.debugger.exception.ExceptionProbeManagerTest") + .collect(Collectors.toSet())); ClassNameFiltering classNameFiltering = new ClassNameFiltering(config); ExceptionProbeManager exceptionProbeManager = new ExceptionProbeManager(classNameFiltering); String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering); @@ -87,25 +78,17 @@ void lastCapture() { assertTrue(exceptionProbeManager.shouldCaptureException(fingerprint)); exceptionProbeManager.updateLastCapture(fingerprint); assertFalse(exceptionProbeManager.shouldCaptureException(fingerprint)); - Clock clock = - Clock.fixed(Instant.now().plus(Duration.ofMinutes(61)), Clock.systemUTC().getZone()); + Clock clock = Clock.fixed( + Instant.now().plus(Duration.ofMinutes(61)), Clock.systemUTC().getZone()); assertTrue(exceptionProbeManager.shouldCaptureException(fingerprint, clock)); } @Test void maxFrames() { RuntimeException deepException = level1(); - ClassNameFiltering classNameFiltering = - new ClassNameFiltering( - Stream.of( - "java.", - "jdk.", - "sun.", - "com.sun.", - "org.gradle.", - "worker.org.gradle.", - "org.junit.") - .collect(Collectors.toSet())); + ClassNameFiltering classNameFiltering = new ClassNameFiltering(Stream.of( + "java.", "jdk.", "sun.", "com.sun.", "org.gradle.", "worker.org.gradle.", "org.junit.") + .collect(Collectors.toSet())); ExceptionProbeManager exceptionProbeManager = new ExceptionProbeManager(classNameFiltering, Duration.ofHours(1), Clock.systemUTC(), 3); exceptionProbeManager.createProbesForException(deepException.getStackTrace(), 0); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FailedTestReplayExceptionDebuggerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FailedTestReplayExceptionDebuggerTest.java index fde122cb47c..5ec60627b09 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FailedTestReplayExceptionDebuggerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FailedTestReplayExceptionDebuggerTest.java @@ -28,9 +28,8 @@ public class FailedTestReplayExceptionDebuggerTest { @BeforeEach public void setUp() { configurationUpdater = mock(ConfigurationUpdater.class); - classNameFiltering = - new ClassNameFiltering( - new HashSet<>(singletonList("com.datadog.debugger.exception.ThirdPartyCode"))); + classNameFiltering = new ClassNameFiltering( + new HashSet<>(singletonList("com.datadog.debugger.exception.ThirdPartyCode"))); Config config = createConfig(); exceptionDebugger = new FailedTestReplayExceptionDebugger(configurationUpdater, classNameFiltering, config); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java index 105c9cc80a0..38552269681 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/FingerprinterTest.java @@ -12,29 +12,28 @@ class FingerprinterTest { final Throwable TEST_THROWABLE = new RuntimeException("test"); { - TEST_THROWABLE.setStackTrace( - new StackTraceElement[] { - new StackTraceElement( - "com.datadog.debugger.exception.FingerprinterTest", - "", - "FingerprinterTest.java", - 10), - new StackTraceElement( - "org.junit.platform.commons.util.ReflectionUtils", - "newInstance", - "ReflectionUtils.java", - 552), - new StackTraceElement( - "org.junit.jupiter.engine.execution.ConstructorInvocation", - "proceed", - "ConstructorInvocation.java", - 56), - new StackTraceElement( - "org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation", - "proceed", - "InvocationInterceptorChain.java", - 131), - }); + TEST_THROWABLE.setStackTrace(new StackTraceElement[] { + new StackTraceElement( + "com.datadog.debugger.exception.FingerprinterTest", + "", + "FingerprinterTest.java", + 10), + new StackTraceElement( + "org.junit.platform.commons.util.ReflectionUtils", + "newInstance", + "ReflectionUtils.java", + 552), + new StackTraceElement( + "org.junit.jupiter.engine.execution.ConstructorInvocation", + "proceed", + "ConstructorInvocation.java", + 56), + new StackTraceElement( + "org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation", + "proceed", + "InvocationInterceptorChain.java", + 131), + }); } final String TEST_FINGERPRINT = "2ec0db28f254ffa383cbb26a32269bf739ba937b9dd8f111d22294e6a494855"; diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/instrumentation/ASMHelperTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/instrumentation/ASMHelperTest.java index 85c96aa6559..0108fc4ece6 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/instrumentation/ASMHelperTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/instrumentation/ASMHelperTest.java @@ -36,18 +36,15 @@ public void ensureSafeLoadClass() { assertEquals( "Cannot ensure loading class: safely as current class being transformed is not provided (null)", illegalArgumentException.getMessage()); - illegalArgumentException = - assertThrows( - IllegalArgumentException.class, - () -> - ensureSafeClassLoad( - "com.datadog.debugger.MyClass", "com.datadog.debugger.MyClass", null)); + illegalArgumentException = assertThrows( + IllegalArgumentException.class, + () -> ensureSafeClassLoad( + "com.datadog.debugger.MyClass", "com.datadog.debugger.MyClass", null)); assertEquals( "Cannot load class com.datadog.debugger.MyClass as this is the class being currently transformed", illegalArgumentException.getMessage()); - Class clazz = - ensureSafeClassLoad( - ASMHelperTest.class.getTypeName(), "", ASMHelperTest.class.getClassLoader()); + Class clazz = ensureSafeClassLoad( + ASMHelperTest.class.getTypeName(), "", ASMHelperTest.class.getClassLoader()); assertEquals(ASMHelperTest.class, clazz); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java index 65bbd72ae9d..5bc20ff6221 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java @@ -76,19 +76,16 @@ public class CodeOriginTest extends CapturingTestBase { private TestTraceInterceptor traceInterceptor; - public static ClassNameFilter classNameFilter = - new ClassNameFiltering( - new HashSet<>( - asList( - "sun", - "org.junit", - "java.", - "org.gradle", - "com.sun", - "worker.org.gradle", - "datadog", - "com.datadog.debugger.probe", - "com.datadog.debugger.codeorigin"))); + public static ClassNameFilter classNameFilter = new ClassNameFiltering(new HashSet<>(asList( + "sun", + "org.junit", + "java.", + "org.gradle", + "com.sun", + "worker.org.gradle", + "datadog", + "com.datadog.debugger.probe", + "com.datadog.debugger.codeorigin"))); @Override @BeforeEach @@ -110,11 +107,9 @@ public void before() { .with(InitializationStrategy.NoOp.INSTANCE) .with(TypeStrategy.Default.REDEFINE) .type(nameStartsWith("com.datadog.debugger.")) - .transform( - (builder, typeDescription, classLoader, module, protectionDomain) -> - builder.visit( - Advice.to(CodeOriginTestAdvice.class) - .on(new Conjunction<>(isMethod(), isAnnotatedWith(CodeOrigin.class))))) + .transform((builder, typeDescription, classLoader, module, protectionDomain) -> + builder.visit(Advice.to(CodeOriginTestAdvice.class) + .on(new Conjunction<>(isMethod(), isAnnotatedWith(CodeOrigin.class))))) // .installOn(instr) ; } @@ -142,8 +137,9 @@ public void withDebug1() throws Exception { @Test public void withLogProbe() throws Exception { final String CLASS_NAME = "com.datadog.debugger.CodeOrigin03"; - installProbes( - createProbeBuilder(PROBE_ID, CLASS_NAME, "entry", "()").captureSnapshot(true).build()); + installProbes(createProbeBuilder(PROBE_ID, CLASS_NAME, "entry", "()") + .captureSnapshot(true) + .build()); final Class testClass = compileAndLoadClass(CLASS_NAME); codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "entry", "()", true); codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "exit", "()", false); @@ -195,12 +191,11 @@ public void stackDepth() throws IOException, URISyntaxException { private void countFrames(Class testClass, int loops) { int result = Reflect.onClass(testClass).call("main", loops).get(); assertEquals(loops, result); - long count = - traceInterceptor.getTrace().stream() - .filter(s -> s.getOperationName().equals("exit")) - .flatMap(s -> s.getTags().keySet().stream()) - .filter(key -> key.contains("frames") && key.endsWith("method")) - .count(); + long count = traceInterceptor.getTrace().stream() + .filter(s -> s.getOperationName().equals("exit")) + .flatMap(s -> s.getTags().keySet().stream()) + .filter(key -> key.contains("frames") && key.endsWith("method")) + .count(); assertTrue(count <= MAX_FRAMES); } @@ -228,9 +223,8 @@ public void testCaptureCodeOriginWithExplicitInfo() final String CLASS_NAME = "com.datadog.debugger.CodeOrigin04"; final Class testClass = compileAndLoadClass(CLASS_NAME); installProbes(); - CodeOriginProbe probe = - codeOriginRecorder.getProbe( - codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true)); + CodeOriginProbe probe = codeOriginRecorder.getProbe( + codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true)); assertNotNull(probe, "The probe should have been created."); assertTrue(probe.entrySpanProbe(), "Should be an entry probe."); } @@ -264,10 +258,9 @@ private void checkResults(Class testClass, String parameter, int snapshotsExp assertEquals(3, spans.size()); assertEquals("main", spans.get(2).getLocalRootSpan().getOperationName()); - List list = - spans.stream() - .filter(span -> !span.getOperationName().equals("exit")) - .collect(Collectors.toList()); + List list = spans.stream() + .filter(span -> !span.getOperationName().equals("exit")) + .collect(Collectors.toList()); for (DDSpan span : list) { checkCodeOriginTags(span, snapshotsExpected != 0); @@ -291,16 +284,13 @@ protected TestSnapshotListener installProbes(ProbeDefinition... probes) { listener = super.installProbes(probes); DebuggerContext.initClassNameFilter(classNameFilter); - codeOriginRecorder = - new DefaultCodeOriginRecorder( - config, - configurationUpdater, - new AgentTaskScheduler(TASK_SCHEDULER) { - @Override - public void execute(Runnable target) { - target.run(); - } - }); + codeOriginRecorder = new DefaultCodeOriginRecorder( + config, configurationUpdater, new AgentTaskScheduler(TASK_SCHEDULER) { + @Override + public void execute(Runnable target) { + target.run(); + } + }); DebuggerContext.initCodeOrigin(codeOriginRecorder); return listener; diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java index 1928cc52829..c648ae09655 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java @@ -100,10 +100,9 @@ public void noDebugSession() { public void budgets() { try { ProbeRateLimiter.setGlobalSnapshotRate(-1); - TracerAPI tracer = - CoreTracer.builder() - .idGenerationStrategy(IdGenerationStrategy.fromName("random")) - .build(); + TracerAPI tracer = CoreTracer.builder() + .idGenerationStrategy(IdGenerationStrategy.fromName("random")) + .build(); AgentTracer.registerIfAbsent(tracer); String sessionId = "12345"; @@ -165,10 +164,9 @@ private int runTrace(TracerAPI tracer, boolean captureSnapshot, Integer line, St logProbe.evaluate(entryContext, new LogStatus(logProbe), MethodLocation.ENTRY, false); logProbe.evaluate(exitContext, new LogStatus(logProbe), MethodLocation.EXIT, false); - int budget = - logProbe.isCaptureSnapshot() - ? LogProbe.CAPTURING_PROBE_BUDGET - : LogProbe.NON_CAPTURING_PROBE_BUDGET; + int budget = logProbe.isCaptureSnapshot() + ? LogProbe.CAPTURING_PROBE_BUDGET + : LogProbe.NON_CAPTURING_PROBE_BUDGET; int runs = budget + 20; for (int i = 0; i < runs; i++) { @@ -188,8 +186,9 @@ private int runTrace(TracerAPI tracer, boolean captureSnapshot, Integer line, St private boolean fillSnapshot(DebugSessionStatus status) { DebuggerAgentHelper.injectSink(new DebuggerSink(getConfig(), mock(ProbeStatusSink.class))); - TracerAPI tracer = - CoreTracer.builder().idGenerationStrategy(IdGenerationStrategy.fromName("random")).build(); + TracerAPI tracer = CoreTracer.builder() + .idGenerationStrategy(IdGenerationStrategy.fromName("random")) + .build(); AgentTracer.registerIfAbsent(tracer); AgentSpan span = tracer.startSpan("log probe debug session testing", "test span"); try (ContextScope scope = tracer.activateManualSpan(span)) { @@ -257,7 +256,8 @@ public void log() { @ParameterizedTest @ValueSource(strings = {"ENTRY", "EXIT"}) public void fillSnapshot_shouldSend(String methodLocation) { - LogProbe logProbe = createLog(null).evaluateAt(MethodLocation.valueOf(methodLocation)).build(); + LogProbe logProbe = + createLog(null).evaluateAt(MethodLocation.valueOf(methodLocation)).build(); CapturedContext entryContext = new CapturedContext(); CapturedContext exitContext = new CapturedContext(); LogStatus logEntryStatus = prepareContext(entryContext, logProbe, MethodLocation.ENTRY); @@ -360,25 +360,23 @@ public void fillSnapshot_shouldSend_evalErrors() { @Test public void captureExpressionsInActiveDebugSession() { DebuggerAgentHelper.injectSink(new DebuggerSink(getConfig(), mock(ProbeStatusSink.class))); - TracerAPI tracer = - CoreTracer.builder().idGenerationStrategy(IdGenerationStrategy.fromName("random")).build(); + TracerAPI tracer = CoreTracer.builder() + .idGenerationStrategy(IdGenerationStrategy.fromName("random")) + .build(); AgentTracer.registerIfAbsent(tracer); AgentSpan span = tracer.startSpan("log probe capture expression testing", "test span"); try (ContextScope scope = tracer.activateManualSpan(span)) { span.setTag(Tags.PROPAGATED_DEBUG, DEBUG_SESSION_ID + ":1"); // the probe sampler always rejects: the active session decision must still win ProbeRateLimiter.setSamplerSupplier(rate -> new ConstantSampler(false)); - LogProbe logProbe = - createLog("log line") - .probeId(ProbeId.newId()) - .evaluateAt(MethodLocation.EXIT) - .tags(format("session_id:%s", DEBUG_SESSION_ID)) - .when(new ProbeCondition(DSL.when(DSL.eq(DSL.value(1), DSL.value(1))), "1 == 1")) - .captureExpressions( - singletonList( - new LogProbe.CaptureExpression( - "greeting", new ValueScript(DSL.value("hello"), "'hello'"), null))) - .build(); + LogProbe logProbe = createLog("log line") + .probeId(ProbeId.newId()) + .evaluateAt(MethodLocation.EXIT) + .tags(format("session_id:%s", DEBUG_SESSION_ID)) + .when(new ProbeCondition(DSL.when(DSL.eq(DSL.value(1), DSL.value(1))), "1 == 1")) + .captureExpressions(singletonList(new LogProbe.CaptureExpression( + "greeting", new ValueScript(DSL.value("hello"), "'hello'"), null))) + .build(); logProbe.initSamplers(); CapturedContext entryContext = capturedContext(span, logProbe); CapturedContext exitContext = capturedContext(span, logProbe); @@ -444,11 +442,10 @@ public void evaluateConditionTimeoutRecordsSkipAndConditionErrors() { public void evaluateConditionFalseDoesNotSkipSnapshot() { DebuggerSink sink = spy(new DebuggerSink(getConfig(), mock(ProbeStatusSink.class))); DebuggerAgentHelper.injectSink(sink); - LogProbe logProbe = - createLog(null) - .evaluateAt(MethodLocation.EXIT) - .when(new ProbeCondition(DSL.when(DSL.eq(DSL.value(1), DSL.value(2))), "1 == 2")) - .build(); + LogProbe logProbe = createLog(null) + .evaluateAt(MethodLocation.EXIT) + .when(new ProbeCondition(DSL.when(DSL.eq(DSL.value(1), DSL.value(2))), "1 == 2")) + .build(); CapturedContext context = new CapturedContext(); LogStatus status = new LogStatus(logProbe); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/MetricProbeTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/MetricProbeTest.java index 088f45e6c8f..cdd4a7aba6f 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/MetricProbeTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/MetricProbeTest.java @@ -13,12 +13,11 @@ public class MetricProbeTest { @Test public void metric() { MetricProbe.Builder metricBuilder = createMetric(); - MetricProbe metric = - metricBuilder - .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) - .kind(MetricProbe.MetricKind.COUNT) - .metricName("datadog.debugger.calls") - .build(); + MetricProbe metric = metricBuilder + .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) + .kind(MetricProbe.MetricKind.COUNT) + .metricName("datadog.debugger.calls") + .build(); Assertions.assertEquals("toString()", metric.getWhere().getMethodName()); Assertions.assertEquals("5-7", metric.getWhere().getLines()[0]); Assertions.assertEquals(MetricProbe.MetricKind.COUNT, metric.getKind()); @@ -28,13 +27,12 @@ public void metric() { @Test public void metricWithTags() { MetricProbe.Builder metricBuilder = createMetric(); - MetricProbe metric = - metricBuilder - .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) - .kind(MetricProbe.MetricKind.COUNT) - .metricName("datadog.debugger.calls") - .tags("tag1:foo1", "tag2:foo2") - .build(); + MetricProbe metric = metricBuilder + .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) + .kind(MetricProbe.MetricKind.COUNT) + .metricName("datadog.debugger.calls") + .tags("tag1:foo1", "tag2:foo2") + .build(); Assertions.assertEquals(2, metric.getTags().length); Assertions.assertEquals("foo1", metric.getTagMap().get("tag1")); Assertions.assertEquals("foo2", metric.getTagMap().get("tag2")); @@ -43,40 +41,36 @@ public void metricWithTags() { @Test public void metricConstantValueScript() { MetricProbe.Builder metricBuilder = createMetric(); - MetricProbe metric1 = - metricBuilder - .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) - .kind(MetricProbe.MetricKind.COUNT) - .metricName("datadog.debugger.calls") - .valueScript(new ValueScript(DSL.value(42), "42")) - .build(); - MetricProbe metric2 = - metricBuilder - .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) - .kind(MetricProbe.MetricKind.COUNT) - .metricName("datadog.debugger.calls") - .valueScript(new ValueScript(DSL.value(42), "42")) - .build(); + MetricProbe metric1 = metricBuilder + .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) + .kind(MetricProbe.MetricKind.COUNT) + .metricName("datadog.debugger.calls") + .valueScript(new ValueScript(DSL.value(42), "42")) + .build(); + MetricProbe metric2 = metricBuilder + .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) + .kind(MetricProbe.MetricKind.COUNT) + .metricName("datadog.debugger.calls") + .valueScript(new ValueScript(DSL.value(42), "42")) + .build(); Assertions.assertEquals(metric1, metric2); } @Test public void metricRefValueScript() { MetricProbe.Builder metricBuilder = createMetric(); - MetricProbe metric1 = - metricBuilder - .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) - .kind(MetricProbe.MetricKind.COUNT) - .metricName("datadog.debugger.calls") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .build(); - MetricProbe metric2 = - metricBuilder - .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) - .kind(MetricProbe.MetricKind.COUNT) - .metricName("datadog.debugger.calls") - .valueScript(new ValueScript(DSL.ref("arg"), "arg")) - .build(); + MetricProbe metric1 = metricBuilder + .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) + .kind(MetricProbe.MetricKind.COUNT) + .metricName("datadog.debugger.calls") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .build(); + MetricProbe metric2 = metricBuilder + .where("java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}) + .kind(MetricProbe.MetricKind.COUNT) + .metricName("datadog.debugger.calls") + .valueScript(new ValueScript(DSL.ref("arg"), "arg")) + .build(); Assertions.assertEquals(metric1, metric2); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/ProbeDefinitionTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/ProbeDefinitionTest.java index 79a37dd9987..fc77a9c6163 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/ProbeDefinitionTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/ProbeDefinitionTest.java @@ -10,7 +10,8 @@ public class ProbeDefinitionTest { @Test public void tags() { String[] tags = new String[] {"tag1:foo1", "tag2:foo2", "tag3"}; - ProbeDefinition snapshotProbe = LogProbe.builder().probeId(PROBE_ID).tags(tags).build(); + ProbeDefinition snapshotProbe = + LogProbe.builder().probeId(PROBE_ID).tags(tags).build(); Assertions.assertEquals("foo1", snapshotProbe.getTagMap().get("tag1")); Assertions.assertEquals("foo2", snapshotProbe.getTagMap().get("tag2")); Assertions.assertNull(snapshotProbe.getTagMap().get("tag3")); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/WhereTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/WhereTest.java index 3723e794ef4..962a4a967c5 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/WhereTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/WhereTest.java @@ -19,9 +19,8 @@ public class WhereTest { @Test public void simpleLineRange() { - Where where = - new Where( - "java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}, null); + Where where = new Where( + "java.lang.Object", "toString()", "java.lang.String ()", new String[] {"5-7"}, null); assertTrue(where.isSignatureMatching("java.lang.String ()")); String[] lines = where.getLines(); Assertions.assertNotNull(lines); @@ -31,13 +30,12 @@ public void simpleLineRange() { @Test public void multiLines() { - Where where = - new Where( - "java.lang.Object", - "toString()", - "java.lang.String ()", - new String[] {"12-25", "42-45"}, - null); + Where where = new Where( + "java.lang.Object", + "toString()", + "java.lang.String ()", + new String[] {"12-25", "42-45"}, + null); assertTrue(where.isSignatureMatching("java.lang.String ()")); String[] lines = where.getLines(); Assertions.assertNotNull(lines); @@ -48,9 +46,8 @@ public void multiLines() { @Test public void singleLine() { - Where where = - new Where( - "java.lang.Object", "toString()", "java.lang.String ()", new String[] {"12"}, null); + Where where = new Where( + "java.lang.Object", "toString()", "java.lang.String ()", new String[] {"12"}, null); assertTrue(where.isSignatureMatching("java.lang.String ()")); String[] lines = where.getLines(); Assertions.assertNotNull(lines); @@ -60,13 +57,8 @@ public void singleLine() { @Test public void noLines() { - Where where = - new Where( - "java.lang.Object", - "toString()", - "java.lang.String ()", - (Where.SourceLine[]) null, - null); + Where where = new Where( + "java.lang.Object", "toString()", "java.lang.String ()", (Where.SourceLine[]) null, null); assertTrue(where.isSignatureMatching("java.lang.String ()")); String[] lines = where.getLines(); Assertions.assertNull(lines); @@ -128,13 +120,8 @@ public void methodMatching() { assertEquals( Where.MethodMatching.MATCH, where.isMethodMatching(createMethodNode("concat", "String (String)"), null)); - where = - new Where( - "Inner", - "innerMethod", - "(com.datadog.debugger.probe.Outer$Inner)", - new String[0], - null); + where = new Where( + "Inner", "innerMethod", "(com.datadog.debugger.probe.Outer$Inner)", new String[0], null); assertEquals( Where.MethodMatching.MATCH, where.isMethodMatching( diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/DebuggerSinkTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/DebuggerSinkTest.java index 56d251330bd..fc7fc354e52 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/DebuggerSinkTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/DebuggerSinkTest.java @@ -64,10 +64,17 @@ public class DebuggerSinkTest { new ProbeLocation("java.lang.String", "indexOf", null, null); public static final int MAX_PAYLOAD = 5 * 1024 * 1024; - @Mock private Config config; - @Mock private BatchUploader snapshotUploader; - @Mock private BatchUploader logUploader; - @Captor private ArgumentCaptor payloadCaptor; + @Mock + private Config config; + + @Mock + private BatchUploader snapshotUploader; + + @Mock + private BatchUploader logUploader; + + @Captor + private ArgumentCaptor payloadCaptor; private String EXPECTED_SNAPSHOT_TAGS; private ProbeStatusSink probeStatusSink; @@ -111,14 +118,14 @@ public void addSnapshot(boolean processTagsEnabled) throws IOException { assertEquals("service-name", intakeRequest.getService()); assertEquals("java.lang.String", intakeRequest.getLoggerName()); assertEquals("indexOf", intakeRequest.getLoggerMethod()); - assertEquals(PROBE_ID.getId(), intakeRequest.getDebugger().getSnapshot().getProbe().getId()); + assertEquals( + PROBE_ID.getId(), intakeRequest.getDebugger().getSnapshot().getProbe().getId()); assertEquals( PROBE_LOCATION, intakeRequest.getDebugger().getSnapshot().getProbe().getLocation()); - assertTrue( - intakeRequest - .getDebugger() - .getRuntimeId() - .matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); + assertTrue(intakeRequest + .getDebugger() + .getRuntimeId() + .matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); if (processTagsEnabled) { assertNotNull(ProcessTags.getTagsForSerialization()); assertEquals( @@ -208,22 +215,20 @@ public void pruneTooLargeSnapshot() { String strPayLoad = new String(chars); List children = createChildren(3, strPayLoad); Node root = new Node("ROOT", children); - CapturedValue rootLocal = - CapturedValue.of( - "root", - Node.class.getTypeName(), - root, - 5, - Limits.DEFAULT_COLLECTION_SIZE, - Limits.DEFAULT_LENGTH, - Limits.DEFAULT_FIELD_COUNT); + CapturedValue rootLocal = CapturedValue.of( + "root", + Node.class.getTypeName(), + root, + 5, + Limits.DEFAULT_COLLECTION_SIZE, + Limits.DEFAULT_LENGTH, + Limits.DEFAULT_FIELD_COUNT); CapturedContext context = new CapturedContext(); context.addLocals(new CapturedValue[] {rootLocal}); - Snapshot largeSnapshot = - new Snapshot( - Thread.currentThread(), - new ProbeImplementation.NoopProbeImplementation(PROBE_ID, PROBE_LOCATION), - 5); + Snapshot largeSnapshot = new Snapshot( + Thread.currentThread(), + new ProbeImplementation.NoopProbeImplementation(PROBE_ID, PROBE_LOCATION), + 5); largeSnapshot.setEntry(context); sink.addSnapshot(largeSnapshot); sink.lowRateFlush(sink); @@ -260,7 +265,8 @@ public void addDiagnostics() throws IOException { String strPayload = new String(payloadCaptor.getValue(), StandardCharsets.UTF_8); System.out.println(strPayload); ParameterizedType type = Types.newParameterizedType(List.class, ProbeStatus.class); - JsonAdapter> adapter = MoshiHelper.createMoshiProbeStatus().adapter(type); + JsonAdapter> adapter = + MoshiHelper.createMoshiProbeStatus().adapter(type); List statuses = adapter.fromJson(strPayload); assertEquals(1, statuses.size()); ProbeStatus status = statuses.get(0); @@ -284,7 +290,8 @@ public void addDiagnosticsDebuggerTrack() throws IOException { new String(partCaptor.getAllValues().get(0).getContent(), StandardCharsets.UTF_8); System.out.println(strPayload); ParameterizedType type = Types.newParameterizedType(List.class, ProbeStatus.class); - JsonAdapter> adapter = MoshiHelper.createMoshiProbeStatus().adapter(type); + JsonAdapter> adapter = + MoshiHelper.createMoshiProbeStatus().adapter(type); List statuses = adapter.fromJson(strPayload); assertEquals(1, statuses.size()); ProbeStatus status = statuses.get(0); @@ -308,7 +315,8 @@ public void addMultipleDiagnostics() throws IOException { String strPayload = new String(payloadCaptor.getValue(), StandardCharsets.UTF_8); System.out.println(strPayload); ParameterizedType type = Types.newParameterizedType(List.class, ProbeStatus.class); - JsonAdapter> adapter = MoshiHelper.createMoshiProbeStatus().adapter(type); + JsonAdapter> adapter = + MoshiHelper.createMoshiProbeStatus().adapter(type); List statuses = adapter.fromJson(strPayload); assertEquals(2, statuses.size()); } @@ -329,7 +337,8 @@ public void addMultipleDiagnosticsDebuggerTrack() throws IOException { new String(partCaptor.getAllValues().get(0).getContent(), StandardCharsets.UTF_8); System.out.println(strPayload); ParameterizedType type = Types.newParameterizedType(List.class, ProbeStatus.class); - JsonAdapter> adapter = MoshiHelper.createMoshiProbeStatus().adapter(type); + JsonAdapter> adapter = + MoshiHelper.createMoshiProbeStatus().adapter(type); List statuses = adapter.fromJson(strPayload); assertEquals(2, statuses.size()); } @@ -500,17 +509,13 @@ public void addDiagnostic() { @Test public void skipSnapshot() { DebuggerMetricCollector metricCollector = spy(DebuggerMetricCollector.get()); - SnapshotSink snapshotSink = - new SnapshotSink( - config, - "", - new BatchUploader( - "Snapshots", - config, - config.getFinalDebuggerSnapshotUrl(), - SnapshotSink.RETRY_POLICY), - new BatchUploader( - "Logs", config, config.getFinalDebuggerSnapshotUrl(), SnapshotSink.RETRY_POLICY)); + SnapshotSink snapshotSink = new SnapshotSink( + config, + "", + new BatchUploader( + "Snapshots", config, config.getFinalDebuggerSnapshotUrl(), SnapshotSink.RETRY_POLICY), + new BatchUploader( + "Logs", config, config.getFinalDebuggerSnapshotUrl(), SnapshotSink.RETRY_POLICY)); SymbolSink symbolSink = new SymbolSink(config); DebuggerSink sink = new DebuggerSink(config, "", metricCollector, probeStatusSink, snapshotSink, symbolSink); @@ -522,14 +527,13 @@ public void skipSnapshot() { @Test public void skipSnapshotEvaluationTimeOut() { DebuggerMetricCollector metricCollector = spy(DebuggerMetricCollector.get()); - DebuggerSink sink = - new DebuggerSink( - config, - "", - metricCollector, - probeStatusSink, - new SnapshotSink(config, "", snapshotUploader, logUploader), - new SymbolSink(config)); + DebuggerSink sink = new DebuggerSink( + config, + "", + metricCollector, + probeStatusSink, + new SnapshotSink(config, "", snapshotUploader, logUploader), + new SymbolSink(config)); Snapshot snapshot = createSnapshot(); sink.skipSnapshot(snapshot.getProbe().getId(), EVALUATION_TIME_OUT); verify(metricCollector).recordEventSkipped(eq(EVALUATION_TIME_OUT)); @@ -539,9 +543,8 @@ public void skipSnapshotEvaluationTimeOut() { public void addSnapshotQueueFullRecordsDropped() { DebuggerMetricCollector metricCollector = spy(DebuggerMetricCollector.get()); SnapshotSink snapshotSink = new SnapshotSink(config, "", snapshotUploader, logUploader); - DebuggerSink sink = - new DebuggerSink( - config, "", metricCollector, probeStatusSink, snapshotSink, new SymbolSink(config)); + DebuggerSink sink = new DebuggerSink( + config, "", metricCollector, probeStatusSink, snapshotSink, new SymbolSink(config)); Snapshot snapshot = createSnapshot(); for (int i = 0; i < SnapshotSink.LOW_RATE_CAPACITY; i++) { sink.addSnapshot(snapshot); @@ -555,9 +558,8 @@ public void addSnapshotQueueFullRecordsDropped() { public void addHighRateSnapshotRecordsEveryDrop() { DebuggerMetricCollector metricCollector = spy(DebuggerMetricCollector.get()); SnapshotSink snapshotSink = new SnapshotSink(config, "", snapshotUploader, logUploader); - DebuggerSink sink = - new DebuggerSink( - config, "", metricCollector, probeStatusSink, snapshotSink, new SymbolSink(config)); + DebuggerSink sink = new DebuggerSink( + config, "", metricCollector, probeStatusSink, snapshotSink, new SymbolSink(config)); Snapshot snapshot = createSnapshot(); // fill the high rate queue to capacity for (int i = 0; i < SnapshotSink.HIGH_RATE_CAPACITY; i++) { diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/ProbeStatusSinkTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/ProbeStatusSinkTest.java index 6a80fc6418b..3640060f696 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/ProbeStatusSinkTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/ProbeStatusSinkTest.java @@ -39,7 +39,8 @@ class ProbeStatusSinkTest { private static final Instant BEFORE_INTERVAL_HAS_PASSED = Instant.now().plus(Duration.ofSeconds(DIAGNOSTICS_INTERVAL - 5)); - @Mock private Config config; + @Mock + private Config config; private Builder builder; private ProbeStatusSink probeStatusSink; diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SnapshotSinkTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SnapshotSinkTest.java index d9e1f72c8a0..d133b6d1abd 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SnapshotSinkTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SnapshotSinkTest.java @@ -44,10 +44,18 @@ public class SnapshotSinkTest { private static final ProbeLocation PROBE_LOCATION = new ProbeLocation("java.lang.String", "indexOf", null, null); - @Mock private Config config; - @Mock private BatchUploader snapshotUploader; - @Mock private BatchUploader logUploader; - @Captor private ArgumentCaptor payloadCaptor; + @Mock + private Config config; + + @Mock + private BatchUploader snapshotUploader; + + @Mock + private BatchUploader logUploader; + + @Captor + private ArgumentCaptor payloadCaptor; + private ProbeStatusSink probeStatusSink; private String EXPECTED_SNAPSHOT_TAGS; @@ -92,14 +100,14 @@ public void addHighRateSnapshot(boolean processTagsEnabled) throws IOException { assertEquals("service-name", intakeRequest.getService()); assertEquals("java.lang.String", intakeRequest.getLoggerName()); assertEquals("indexOf", intakeRequest.getLoggerMethod()); - assertEquals(PROBE_ID.getId(), intakeRequest.getDebugger().getSnapshot().getProbe().getId()); + assertEquals( + PROBE_ID.getId(), intakeRequest.getDebugger().getSnapshot().getProbe().getId()); assertEquals( PROBE_LOCATION, intakeRequest.getDebugger().getSnapshot().getProbe().getLocation()); - assertTrue( - intakeRequest - .getDebugger() - .getRuntimeId() - .matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); + assertTrue(intakeRequest + .getDebugger() + .getRuntimeId() + .matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}")); if (processTagsEnabled) { assertNotNull(ProcessTags.getTagsForSerialization()); assertEquals( diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SymbolSinkTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SymbolSinkTest.java index d8ff3164bf2..3214957fd8c 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SymbolSinkTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SymbolSinkTest.java @@ -90,14 +90,12 @@ public void testQueueFull() { // implicit flush because Q is full symbolSink.addScope(Scope.builder(ScopeType.JAR, "jar2.jar", 0, 0).build()); assertEquals(2, symbolUploaderMock.multiPartContents.size()); - assertTrue( - new String(symbolUploaderMock.multiPartContents.get(1).getContent()) - .contains("\"source_file\":\"jar1.jar\"")); + assertTrue(new String(symbolUploaderMock.multiPartContents.get(1).getContent()) + .contains("\"source_file\":\"jar1.jar\"")); symbolSink.flush(); assertEquals(4, symbolUploaderMock.multiPartContents.size()); - assertTrue( - new String(symbolUploaderMock.multiPartContents.get(3).getContent()) - .contains("\"source_file\":\"jar2.jar\"")); + assertTrue(new String(symbolUploaderMock.multiPartContents.get(3).getContent()) + .contains("\"source_file\":\"jar2.jar\"")); } @Test @@ -109,10 +107,10 @@ public void splitByJarScopes() { SymbolSink symbolSink = new SymbolSink(config, symbolUploaderMock, 1024); final int NUM_JAR_SCOPES = 10; for (int i = 0; i < NUM_JAR_SCOPES; i++) { - symbolSink.addScope( - Scope.builder(ScopeType.JAR, "jar" + i + ".jar", 0, 0) - .scopes(singletonList(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0).build())) - .build()); + symbolSink.addScope(Scope.builder(ScopeType.JAR, "jar" + i + ".jar", 0, 0) + .scopes( + singletonList(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0).build())) + .build()); } symbolSink.flush(); // split upload request per jar scope @@ -132,10 +130,10 @@ public void splitTooManyJarScopes() { SymbolSink symbolSink = new SymbolSink(config, symbolUploaderMock, 4096); final int NUM_JAR_SCOPES = 21; for (int i = 0; i < NUM_JAR_SCOPES; i++) { - symbolSink.addScope( - Scope.builder(ScopeType.JAR, "jar" + i + ".jar", 0, 0) - .scopes(singletonList(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0).build())) - .build()); + symbolSink.addScope(Scope.builder(ScopeType.JAR, "jar" + i + ".jar", 0, 0) + .scopes( + singletonList(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0).build())) + .build()); } symbolSink.flush(); // split upload request per half jar scopes @@ -158,30 +156,25 @@ public void splitByClassScopes() { final int NUM_CLASS_SCOPES = 10; List classScopes = new ArrayList<>(); for (int i = 0; i < NUM_CLASS_SCOPES; i++) { - classScopes.add( - Scope.builder(ScopeType.CLASS, "class" + i, 0, 0) - .scopes( - Collections.singletonList( - Scope.builder(ScopeType.METHOD, "class" + i, 0, 0) - .name("method" + i) - .build())) - .build()); + classScopes.add(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0) + .scopes(Collections.singletonList(Scope.builder(ScopeType.METHOD, "class" + i, 0, 0) + .name("method" + i) + .build())) + .build()); } - symbolSink.addScope( - Scope.builder(ScopeType.JAR, "jar1.jar", 0, 0) - .name("jar1.jar") - .scopes(classScopes) - .build()); + symbolSink.addScope(Scope.builder(ScopeType.JAR, "jar1.jar", 0, 0) + .name("jar1.jar") + .scopes(classScopes) + .build()); symbolSink.flush(); // split upload request per jar scope final int EXPECTED_REQUESTS = 4; assertEquals(EXPECTED_REQUESTS * 2, symbolUploaderMock.multiPartContents.size()); - List> expectedSourceFiles = - Arrays.asList( - Arrays.asList("class0", "class1"), - Arrays.asList("class2", "class3", "class4"), - Arrays.asList("class5", "class6"), - Arrays.asList("class7", "class8", "class9")); + List> expectedSourceFiles = Arrays.asList( + Arrays.asList("class0", "class1"), + Arrays.asList("class2", "class3", "class4"), + Arrays.asList("class5", "class6"), + Arrays.asList("class7", "class8", "class9")); for (int i = 0; i < EXPECTED_REQUESTS * 2; i += 2) { String strContent = assertMultipartContent(symbolUploaderMock, i); for (String sourceFile : expectedSourceFiles.get(i / 2)) { @@ -200,20 +193,16 @@ public void splitByClassScopesImpossible() { final int NUM_CLASS_SCOPES = 10; List classScopes = new ArrayList<>(); for (int i = 0; i < NUM_CLASS_SCOPES; i++) { - classScopes.add( - Scope.builder(ScopeType.CLASS, "class" + i, 0, 0) - .scopes( - Collections.singletonList( - Scope.builder(ScopeType.METHOD, "class" + i, 0, 0) - .name("method" + i) - .build())) - .build()); + classScopes.add(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0) + .scopes(Collections.singletonList(Scope.builder(ScopeType.METHOD, "class" + i, 0, 0) + .name("method" + i) + .build())) + .build()); } - symbolSink.addScope( - Scope.builder(ScopeType.JAR, "jar1.jar", 0, 0) - .name("jar1.jar") - .scopes(classScopes) - .build()); + symbolSink.addScope(Scope.builder(ScopeType.JAR, "jar1.jar", 0, 0) + .name("jar1.jar") + .scopes(classScopes) + .build()); symbolSink.flush(); // no request to upload because we cannot split the jar scope assertTrue(symbolUploaderMock.multiPartContents.isEmpty()); @@ -228,10 +217,10 @@ public void maxCompressedAndSplit() { SymbolSink symbolSink = new SymbolSink(config, symbolUploaderMock, 512); final int NUM_JAR_SCOPES = 100; for (int i = 0; i < NUM_JAR_SCOPES; i++) { - symbolSink.addScope( - Scope.builder(ScopeType.JAR, "jar" + i + ".jar", 0, 0) - .scopes(singletonList(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0).build())) - .build()); + symbolSink.addScope(Scope.builder(ScopeType.JAR, "jar" + i + ".jar", 0, 0) + .scopes( + singletonList(Scope.builder(ScopeType.CLASS, "class" + i, 0, 0).build())) + .build()); } symbolSink.flush(); int total = symbolUploaderMock.multiPartContents.size(); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/AvroFilterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/AvroFilterTest.java index 2f43abd6c17..19fa9bf323a 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/AvroFilterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/AvroFilterTest.java @@ -13,23 +13,19 @@ void filterOut() { assertFalse(avroFilter.filterOut(null)); Scope scope = Scope.builder(ScopeType.CLASS, "", 0, 0).build(); assertFalse(avroFilter.filterOut(scope)); - scope = Scope.builder(ScopeType.CLASS, "", 0, 0).name("org.apache.avro.MyClass").build(); - assertFalse(avroFilter.filterOut(scope)); scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .languageSpecifics( - new LanguageSpecifics.Builder() - .superClass("org.apache.avro.specific.SpecificRecordBase") - .build()) - .build(); + Scope.builder(ScopeType.CLASS, "", 0, 0).name("org.apache.avro.MyClass").build(); assertFalse(avroFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .symbols( - asList( - new Symbol( - SymbolType.STATIC_FIELD, "SCHEMA$", 0, "org.apache.avro.Schema", null))) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .languageSpecifics(new LanguageSpecifics.Builder() + .superClass("org.apache.avro.specific.SpecificRecordBase") + .build()) + .build(); + assertFalse(avroFilter.filterOut(scope)); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .symbols(asList( + new Symbol(SymbolType.STATIC_FIELD, "SCHEMA$", 0, "org.apache.avro.Schema", null))) + .build(); assertTrue(avroFilter.filterOut(scope)); } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/JarScannerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/JarScannerTest.java index 0dcda347746..f5d301a726f 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/JarScannerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/JarScannerTest.java @@ -28,7 +28,8 @@ public void extractJarPathFromJar() URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {jarUrl}, null); Class testClass = urlClassLoader.loadClass(CLASS_NAME); assertEquals( - jarFileUrl.getFile(), JarScanner.extractJarPath(testClass, SymDBReport.NO_OP).toString()); + jarFileUrl.getFile(), + JarScanner.extractJarPath(testClass, SymDBReport.NO_OP).toString()); assertEquals( jarFileUrl.getFile(), JarScanner.extractJarPath(testClass.getProtectionDomain(), null).toString()); @@ -41,7 +42,8 @@ public void extractJarPathFromFile() throws ClassNotFoundException, URISyntaxExc URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {jarFileUrl}, null); Class testClass = urlClassLoader.loadClass(CLASS_NAME); assertEquals( - jarFileUrl.getFile(), JarScanner.extractJarPath(testClass, SymDBReport.NO_OP).toString()); + jarFileUrl.getFile(), + JarScanner.extractJarPath(testClass, SymDBReport.NO_OP).toString()); } @Test diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/ProtoFilterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/ProtoFilterTest.java index 2cacb4028b0..3e15eff85fc 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/ProtoFilterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/ProtoFilterTest.java @@ -13,43 +13,32 @@ void filterOut() { assertFalse(protoFilter.filterOut(null)); Scope scope = Scope.builder(ScopeType.CLASS, "", 0, 0).build(); assertFalse(protoFilter.filterOut(scope)); - scope = Scope.builder(ScopeType.CLASS, "", 0, 0).name("com.google.protobuf.MyClass").build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .name("com.google.protobuf.MyClass") + .build(); assertFalse(protoFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .languageSpecifics( - new LanguageSpecifics.Builder() - .addInterfaces(asList("com.google.protobuf.MessageOrBuilder")) - .build()) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .languageSpecifics(new LanguageSpecifics.Builder() + .addInterfaces(asList("com.google.protobuf.MessageOrBuilder")) + .build()) + .build(); assertTrue(protoFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .languageSpecifics( - new LanguageSpecifics.Builder() - .superClass("com.google.protobuf.AbstractParser") - .build()) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .languageSpecifics(new LanguageSpecifics.Builder() + .superClass("com.google.protobuf.AbstractParser") + .build()) + .build(); assertTrue(protoFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .languageSpecifics( - new LanguageSpecifics.Builder() - .superClass("com.google.protobuf.GeneratedMessageV3$Builder") - .build()) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .languageSpecifics(new LanguageSpecifics.Builder() + .superClass("com.google.protobuf.GeneratedMessageV3$Builder") + .build()) + .build(); assertTrue(protoFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .symbols( - asList( - new Symbol( - SymbolType.STATIC_FIELD, - "SCHEMA$", - 0, - "com.google.protobuf.Descriptors", - null))) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .symbols(asList(new Symbol( + SymbolType.STATIC_FIELD, "SCHEMA$", 0, "com.google.protobuf.Descriptors", null))) + .build(); assertTrue(protoFilter.filterOut(scope)); } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymDBEnablementTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymDBEnablementTest.java index 9c3916067d3..9be06321bfa 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymDBEnablementTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymDBEnablementTest.java @@ -62,12 +62,11 @@ public void before() { @Test public void enableDisableSymDBThroughRC() throws Exception { ClassNameFiltering classNameFiltering = ClassNameFiltering.allowAll(); - SymDBEnablement symDBEnablement = - new SymDBEnablement( - instr, - config, - new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1), - classNameFiltering); + SymDBEnablement symDBEnablement = new SymDBEnablement( + instr, + config, + new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1), + classNameFiltering); symDBEnablement.accept(ParsedConfigKey.parse(CONFIG_KEY), UPlOAD_SYMBOL_TRUE, null); waitForUpload(symDBEnablement); verify(instr).addTransformer(any(SymbolExtractionTransformer.class)); @@ -78,12 +77,11 @@ public void enableDisableSymDBThroughRC() throws Exception { @Test public void removeSymDBConfig() throws Exception { ClassNameFiltering classNameFiltering = ClassNameFiltering.allowAll(); - SymDBEnablement symDBEnablement = - new SymDBEnablement( - instr, - config, - new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1), - classNameFiltering); + SymDBEnablement symDBEnablement = new SymDBEnablement( + instr, + config, + new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1), + classNameFiltering); symDBEnablement.accept(ParsedConfigKey.parse(CONFIG_KEY), UPlOAD_SYMBOL_TRUE, null); waitForUpload(symDBEnablement); symDBEnablement.remove(ParsedConfigKey.parse(CONFIG_KEY), null); @@ -95,12 +93,11 @@ public void noIncludesFilterOutDatadogClass() { when(config.getThirdPartyExcludes()).thenReturn(Collections.emptySet()); when(config.getThirdPartyIncludes()).thenReturn(Collections.singleton("com.datadog.debugger.")); ClassNameFiltering classNameFiltering = new ClassNameFiltering(config); - SymDBEnablement symDBEnablement = - new SymDBEnablement( - instr, - config, - new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1), - classNameFiltering); + SymDBEnablement symDBEnablement = new SymDBEnablement( + instr, + config, + new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1), + classNameFiltering); symDBEnablement.startSymbolExtraction(); ArgumentCaptor captor = ArgumentCaptor.forClass(SymbolExtractionTransformer.class); @@ -116,9 +113,8 @@ public void parseLoadedClass() throws ClassNotFoundException, IOException { Class testClass = loadSymbolClassFromJar(); when(instr.getAllLoadedClasses()).thenReturn(new Class[] {testClass, null}); when(config.getThirdPartyIncludes()) - .thenReturn( - Stream.of("com.datadog.debugger.", "org.springframework.samples.") - .collect(Collectors.toSet())); + .thenReturn(Stream.of("com.datadog.debugger.", "org.springframework.samples.") + .collect(Collectors.toSet())); ClassNameFiltering classNameFiltering = ClassNameFiltering.allowAll(); SymbolAggregator symbolAggregator = spy(new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1)); @@ -134,7 +130,8 @@ public void parseLoadedClass() throws ClassNotFoundException, IOException { any(), eq(getClass().getResource("/debugger-symbol.jar").getFile())); assertEquals( - "com/datadog/debugger/symbol/SymbolExtraction01.class", captor.getAllValues().get(0)); + "com/datadog/debugger/symbol/SymbolExtraction01.class", + captor.getAllValues().get(0)); assertEquals( "BOOT-INF/classes/org/springframework/samples/petclinic/vet/VetController.class", captor.getAllValues().get(1)); @@ -147,14 +144,13 @@ public void processCorruptedJar() throws ClassNotFoundException, MalformedURLExc .thenReturn(new Class[] {SymDBEnablementTest.class, testClass}); ClassNameFiltering classNameFiltering = ClassNameFiltering.allowAll(); SymbolAggregator symbolAggregatorMock = mock(SymbolAggregator.class); - doAnswer( - invocation -> { - Path arg = invocation.getArgument(1, Path.class); - if (arg.toString().endsWith("/debugger-symbol.jar")) { - return null; - } - throw new IOException("Corrupted jar"); - }) + doAnswer(invocation -> { + Path arg = invocation.getArgument(1, Path.class); + if (arg.toString().endsWith("/debugger-symbol.jar")) { + return null; + } + throw new IOException("Corrupted jar"); + }) .when(symbolAggregatorMock) .scanJar(any(), any(), any(), any()); SymDBEnablement symDBEnablement = @@ -180,9 +176,8 @@ public void parseLoadedClassFromDirectory() Class testClass = urlClassLoader.loadClass(getClass().getTypeName()); when(instr.getAllLoadedClasses()).thenReturn(new Class[] {testClass}); when(config.getThirdPartyIncludes()) - .thenReturn( - Stream.of("com.datadog.debugger.", "org.springframework.samples.") - .collect(Collectors.toSet())); + .thenReturn(Stream.of("com.datadog.debugger.", "org.springframework.samples.") + .collect(Collectors.toSet())); ClassNameFiltering classNameFiltering = ClassNameFiltering.allowAll(); SymbolAggregator symbolAggregator = spy(new SymbolAggregator(classNameFiltering, emptyList(), symbolSink, 1)); @@ -203,44 +198,40 @@ public void parseLoadedClassFromDirectory() public void noDuplicateSymbolExtraction() { final String CLASS_NAME_PATH = "com/datadog/debugger/symbol/SymbolExtraction01"; SymbolSink mockSymbolSink = mock(SymbolSink.class); - ClassNameFiltering classNameFiltering = - new ClassNameFiltering( - Collections.singleton("org.springframework."), - Collections.singleton("com.datadog.debugger."), - Collections.emptySet()); + ClassNameFiltering classNameFiltering = new ClassNameFiltering( + Collections.singleton("org.springframework."), + Collections.singleton("com.datadog.debugger."), + Collections.emptySet()); SymbolAggregator symbolAggregator = new SymbolAggregator(classNameFiltering, emptyList(), mockSymbolSink, 1); SymDBEnablement symDBEnablement = new SymDBEnablement(instr, config, symbolAggregator, classNameFiltering); - doAnswer( - invocation -> { - SymbolExtractionTransformer transformer = invocation.getArgument(0); - JarFile jarFile = - new JarFile(getClass().getResource("/debugger-symbol.jar").getFile()); - JarEntry jarEntry = jarFile.getJarEntry(CLASS_NAME_PATH + ".class"); - InputStream inputStream = jarFile.getInputStream(jarEntry); - byte[] buffer = new byte[4096]; - ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); - int readBytes; - baos.reset(); - while ((readBytes = inputStream.read(buffer)) != -1) { - baos.write(buffer, 0, readBytes); - } - transformer.transform( - getClass().getClassLoader(), CLASS_NAME_PATH, null, null, baos.toByteArray()); - return null; - }) + doAnswer(invocation -> { + SymbolExtractionTransformer transformer = invocation.getArgument(0); + JarFile jarFile = + new JarFile(getClass().getResource("/debugger-symbol.jar").getFile()); + JarEntry jarEntry = jarFile.getJarEntry(CLASS_NAME_PATH + ".class"); + InputStream inputStream = jarFile.getInputStream(jarEntry); + byte[] buffer = new byte[4096]; + ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); + int readBytes; + baos.reset(); + while ((readBytes = inputStream.read(buffer)) != -1) { + baos.write(buffer, 0, readBytes); + } + transformer.transform( + getClass().getClassLoader(), CLASS_NAME_PATH, null, null, baos.toByteArray()); + return null; + }) .when(instr) .addTransformer(any(SymbolExtractionTransformer.class), eq(true)); - when(instr.getAllLoadedClasses()) - .thenAnswer( - invocation -> { - URL jarFileUrl = getClass().getResource("/debugger-symbol.jar"); - URL jarUrl = new URL("jar:file:" + jarFileUrl.getFile() + "!/"); - URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {jarUrl}, null); - Class testClass = urlClassLoader.loadClass(Strings.getClassName(CLASS_NAME_PATH)); - return new Class[] {testClass}; - }); + when(instr.getAllLoadedClasses()).thenAnswer(invocation -> { + URL jarFileUrl = getClass().getResource("/debugger-symbol.jar"); + URL jarUrl = new URL("jar:file:" + jarFileUrl.getFile() + "!/"); + URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {jarUrl}, null); + Class testClass = urlClassLoader.loadClass(Strings.getClassName(CLASS_NAME_PATH)); + return new Class[] {testClass}; + }); symDBEnablement.startSymbolExtraction(); verify(mockSymbolSink, times(1)).addScope(any()); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java index c4f57c0ff8d..78ee0b14d75 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolAggregatorTest.java @@ -52,7 +52,8 @@ void testScanQueuedJars() { // captor.getAllValues().get(0) is the first argument of the first invocation of parseClass with // null assertEquals( - "com/datadog/debugger/symbol/SymbolExtraction01.class", captor.getAllValues().get(1)); + "com/datadog/debugger/symbol/SymbolExtraction01.class", + captor.getAllValues().get(1)); assertEquals( "BOOT-INF/classes/org/springframework/samples/petclinic/vet/VetController.class", captor.getAllValues().get(2)); @@ -82,7 +83,8 @@ void testScanQueuedCorruptedJars() { // captor.getAllValues().get(0) is the first argument of the first invocation of parseClass with // null assertEquals( - "com/datadog/debugger/symbol/SymbolExtraction01.class", captor.getAllValues().get(1)); + "com/datadog/debugger/symbol/SymbolExtraction01.class", + captor.getAllValues().get(1)); assertEquals( "BOOT-INF/classes/org/springframework/samples/petclinic/vet/VetController.class", captor.getAllValues().get(2)); @@ -135,15 +137,14 @@ void testScopeFilter() { ScopeFilter mockFilter = mock(ScopeFilter.class); when(mockFilter.filterOut(any())).thenReturn(true); SymbolSink symbolSink = mock(SymbolSink.class); - doAnswer( - invocation -> { - Object[] args = invocation.getArguments(); - assertEquals(1, args.length); - assertInstanceOf(Scope.class, args[0]); - Scope scope = (Scope) args[0]; - assertTrue(scope.getScopes().isEmpty()); - return null; - }) + doAnswer(invocation -> { + Object[] args = invocation.getArguments(); + assertEquals(1, args.length); + assertInstanceOf(Scope.class, args[0]); + Scope scope = (Scope) args[0]; + assertTrue(scope.getScopes().isEmpty()); + return null; + }) .when(symbolSink) .addScope(any()); SymbolAggregator symbolAggregator = diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolExtractionTransformerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolExtractionTransformerTest.java index cef56569746..fee37d080de 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolExtractionTransformerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/SymbolExtractionTransformerTest.java @@ -43,19 +43,18 @@ class SymbolExtractionTransformerTest { private static final String SYMBOL_PACKAGE = "com.datadog.debugger.symboltest."; private static final String EXCLUDED_PACKAGE = "akka.actor."; private static final String SYMBOL_PACKAGE_DIR = SYMBOL_PACKAGE.replace('.', '/'); - private static final Set TRANSFORMER_EXCLUDES = - Stream.of( - "java.", - "jdk.", - "sun.", - "com.sun.", - "utils.", - "javax.", - "javaslang.", - "org.omg.", - "org.joor.", - "com.datadog.debugger.") - .collect(toSet()); + private static final Set TRANSFORMER_EXCLUDES = Stream.of( + "java.", + "jdk.", + "sun.", + "com.sun.", + "utils.", + "javax.", + "javaslang.", + "org.omg.", + "org.joor.", + "com.datadog.debugger.") + .collect(toSet()); private Instrumentation instr = ByteBuddyAgent.install(); private ClassFileTransformer currentTransformer; @@ -975,16 +974,15 @@ public void symbolExtraction16() throws IOException, URISyntaxException { final String CLASS_NAME = SYMBOL_PACKAGE + "SymbolExtraction16"; final String SOURCE_FILE = SYMBOL_PACKAGE_DIR + "SymbolExtraction16.kt"; SymbolSinkMock symbolSinkMock = new SymbolSinkMock(config); - Set additionalExcludedPackages = - Stream.of( - "org.jetbrains.", - "kotlin.", - "kotlinx.", - "org.junit.", - "io.vavr.", - "com.intellij.", - "gnu.trove.") - .collect(toSet()); + Set additionalExcludedPackages = Stream.of( + "org.jetbrains.", + "kotlin.", + "kotlinx.", + "org.junit.", + "io.vavr.", + "com.intellij.", + "gnu.trove.") + .collect(toSet()); currentTransformer = createTransformer(symbolSinkMock, additionalExcludedPackages); instr.addTransformer(currentTransformer); URL resource = CapturedSnapshotTest.class.getResource("/" + SOURCE_FILE); @@ -1064,17 +1062,15 @@ public void filterOutClassesFromExcludedPackages() throws IOException, URISyntax SymbolSinkMock symbolSinkMock = new SymbolSinkMock(config); ClassNameFiltering classNameFiltering = new ClassNameFiltering(Collections.singleton(EXCLUDED_PACKAGE)); - currentTransformer = - new SymbolExtractionTransformer( - new SymbolAggregator(classNameFiltering, emptyList(), symbolSinkMock, 1), - classNameFiltering); + currentTransformer = new SymbolExtractionTransformer( + new SymbolAggregator(classNameFiltering, emptyList(), symbolSinkMock, 1), + classNameFiltering); instr.addTransformer(currentTransformer); Class testClass = compileAndLoadClass(CLASS_NAME); Reflect.on(testClass).call("main", "1").get(); - assertFalse( - symbolSinkMock.jarScopes.stream() - .flatMap(scope -> scope.getScopes().stream()) - .anyMatch(scope -> scope.getName().equals(CLASS_NAME))); + assertFalse(symbolSinkMock.jarScopes.stream() + .flatMap(scope -> scope.getScopes().stream()) + .anyMatch(scope -> scope.getName().equals(CLASS_NAME))); } @Test diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/WireFilterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/WireFilterTest.java index 2d51bc91b00..5e224f76bb4 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/WireFilterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/symbol/WireFilterTest.java @@ -13,31 +13,27 @@ void filterOut() { assertFalse(wireFilter.filterOut(null)); Scope scope = Scope.builder(ScopeType.CLASS, "", 0, 0).build(); assertFalse(wireFilter.filterOut(scope)); - scope = Scope.builder(ScopeType.CLASS, "", 0, 0).name("com.squareup.wire.MyClass").build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .name("com.squareup.wire.MyClass") + .build(); assertFalse(wireFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .languageSpecifics( - new LanguageSpecifics.Builder() - .addInterfaces(asList("com.squareup.wire.Message")) - .build()) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .languageSpecifics(new LanguageSpecifics.Builder() + .addInterfaces(asList("com.squareup.wire.Message")) + .build()) + .build(); assertFalse(wireFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .languageSpecifics( - new LanguageSpecifics.Builder() - .superClass("com.squareup.wire.ProtoAdapter") - .build()) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .languageSpecifics(new LanguageSpecifics.Builder() + .superClass("com.squareup.wire.ProtoAdapter") + .build()) + .build(); assertTrue(wireFilter.filterOut(scope)); - scope = - Scope.builder(ScopeType.CLASS, "", 0, 0) - .languageSpecifics( - new LanguageSpecifics.Builder() - .addInterfaces(asList("com.squareup.wire.ProtoAdapter")) - .build()) - .build(); + scope = Scope.builder(ScopeType.CLASS, "", 0, 0) + .languageSpecifics(new LanguageSpecifics.Builder() + .addInterfaces(asList("com.squareup.wire.ProtoAdapter")) + .build()) + .build(); assertTrue(wireFilter.filterOut(scope)); } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java index bb0c413c612..0fd8c993477 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java @@ -61,31 +61,28 @@ public void before() { @Test public void conditions() throws IOException, URISyntaxException { final String className = "com.datadog.debugger.TriggerProbe02"; - TriggerProbe probe1 = - createTriggerProbe( - TRIGGER_PROBE_ID1, - TRIGGER_PROBE_SESSION_ID, - className, - "entry", - "(int)", - new ProbeCondition(when(lt(ref("value"), value(25))), "value < 25"), - new Sampling(10.0)); + TriggerProbe probe1 = createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "(int)", + new ProbeCondition(when(lt(ref("value"), value(25))), "value < 25"), + new Sampling(10.0)); installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); Class testClass = compileAndLoadClass(className); for (int i = 0; i < 100; i++) { Reflect.onClass(testClass).call("main", i).get(); } List> allTraces = traceInterceptor.getAllTraces(); - long count = - allTraces.stream() - .map(span -> span.get(0)) - .filter( - span -> { - DDSpan ddSpan = (DDSpan) span; - PropagationTags tags = ddSpan.spanContext().getPropagationTags(); - return (TRIGGER_PROBE_SESSION_ID + ":1").equals(tags.getDebugPropagation()); - }) - .count(); + long count = allTraces.stream() + .map(span -> span.get(0)) + .filter(span -> { + DDSpan ddSpan = (DDSpan) span; + PropagationTags tags = ddSpan.spanContext().getPropagationTags(); + return (TRIGGER_PROBE_SESSION_ID + ":1").equals(tags.getDebugPropagation()); + }) + .count(); assertEquals(100, allTraces.size(), "actual traces: " + allTraces.size()); assertTrue(count <= 25, "Should have at most 25 debug sessions. found: " + count); } @@ -114,15 +111,14 @@ public void cooldown() throws IOException, URISyntaxException { ProbeRateLimiter.setSamplerSupplier(value -> sampler); final String className = "com.datadog.debugger.TriggerProbe01"; - TriggerProbe probe1 = - createTriggerProbe( - TRIGGER_PROBE_ID1, - TRIGGER_PROBE_SESSION_ID, - className, - "entry", - "()", - null, - new Sampling(10, 10.0)); + TriggerProbe probe1 = createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "()", + null, + new Sampling(10, 10.0)); installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); Class testClass = compileAndLoadClass(className); int runs = 10000; @@ -134,25 +130,21 @@ public void cooldown() throws IOException, URISyntaxException { List> allTraces = traceInterceptor.getAllTraces(); assertEquals(runs, allTraces.size(), "actual traces: " + allTraces.size()); - long debugSessions = - allTraces.stream() - .map(span -> span.get(0)) - .filter( - span -> { - DDSpan ddSpan = (DDSpan) span; - PropagationTags tags = ddSpan.spanContext().getPropagationTags(); - return (TRIGGER_PROBE_SESSION_ID + ":1").equals(tags.getDebugPropagation()); - }) - .count(); + long debugSessions = allTraces.stream() + .map(span -> span.get(0)) + .filter(span -> { + DDSpan ddSpan = (DDSpan) span; + PropagationTags tags = ddSpan.spanContext().getPropagationTags(); + return (TRIGGER_PROBE_SESSION_ID + ":1").equals(tags.getDebugPropagation()); + }) + .count(); assertEquals(1, debugSessions, "Should only have 1 debug session. found: " + debugSessions); - long tagged = - allTraces.stream() - .flatMap(Collection::stream) - .filter( - span -> - span.getTag(format("_dd.ld.probe_id.%s", TRIGGER_PROBE_ID1.getId())) != null) - .count(); + long tagged = allTraces.stream() + .flatMap(Collection::stream) + .filter( + span -> span.getTag(format("_dd.ld.probe_id.%s", TRIGGER_PROBE_ID1.getId())) != null) + .count(); assertEquals(1, tagged, "Should only have 1 tagged span. found: " + tagged); } finally { ProbeRateLimiter.setSamplerSupplier(null); @@ -162,15 +154,14 @@ public void cooldown() throws IOException, URISyntaxException { @Test public void badCondition() throws IOException, URISyntaxException { String className = "com.datadog.debugger.TriggerProbe02"; - TriggerProbe probe1 = - createTriggerProbe( - TRIGGER_PROBE_ID1, - TRIGGER_PROBE_SESSION_ID, - className, - "entry", - "(int)", - new ProbeCondition(when(lt(ref("limit"), value(25))), "limit < 25"), - new Sampling(10.0)); + TriggerProbe probe1 = createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "(int)", + new ProbeCondition(when(lt(ref("limit"), value(25))), "limit < 25"), + new Sampling(10.0)); installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); Class testClass = compileAndLoadClass(className); @@ -191,15 +182,14 @@ public void debuggerDisabled() throws IOException, URISyntaxException { ProbeRateLimiter.setSamplerSupplier(value -> sampler); final String className = "com.datadog.debugger.TriggerProbe02"; - TriggerProbe probe1 = - createTriggerProbe( - TRIGGER_PROBE_ID1, - TRIGGER_PROBE_SESSION_ID, - className, - "entry", - "(int)", - new ProbeCondition(when(lt(ref("value"), value(25))), "value < 25"), - new Sampling(10.0)); + TriggerProbe probe1 = createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "(int)", + new ProbeCondition(when(lt(ref("value"), value(25))), "value < 25"), + new Sampling(10.0)); installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); Class testClass = compileAndLoadClass(className); Reflect.onClass(testClass).call("main", 0).get(); @@ -218,16 +208,16 @@ public void sampling() throws IOException, URISyntaxException { ProbeRateLimiter.setSamplerSupplier(value -> sampler); final String className = "com.datadog.debugger.TriggerProbe01"; - TriggerProbe probe1 = - createTriggerProbe( - TRIGGER_PROBE_ID1, - TRIGGER_PROBE_SESSION_ID, - className, - "entry", - "()", - null, - new Sampling(10.0)); - Configuration config = Configuration.builder().setService(SERVICE_NAME).add(probe1).build(); + TriggerProbe probe1 = createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "()", + null, + new Sampling(10.0)); + Configuration config = + Configuration.builder().setService(SERVICE_NAME).add(probe1).build(); installProbes(config); Class testClass = compileAndLoadClass(className); for (int i = 0; i < 100; i++) { @@ -247,10 +237,10 @@ public void noSampling() throws IOException, URISyntaxException { ProbeRateLimiter.setSamplerSupplier(value -> sampler); final String className = "com.datadog.debugger.TriggerProbe01"; - TriggerProbe probe1 = - createTriggerProbe( - TRIGGER_PROBE_ID1, TRIGGER_PROBE_SESSION_ID, className, "entry", "()", null, null); - Configuration config = Configuration.builder().setService(SERVICE_NAME).add(probe1).build(); + TriggerProbe probe1 = createTriggerProbe( + TRIGGER_PROBE_ID1, TRIGGER_PROBE_SESSION_ID, className, "entry", "()", null, null); + Configuration config = + Configuration.builder().setService(SERVICE_NAME).add(probe1).build(); installProbes(config); Class testClass = compileAndLoadClass(className); for (int i = 0; i < 100; i++) { diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/uploader/BatchUploaderTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/uploader/BatchUploaderTest.java index 1eb7cf59ddf..26bcf975abf 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/uploader/BatchUploaderTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/uploader/BatchUploaderTest.java @@ -47,8 +47,11 @@ public class BatchUploaderTest { private final Duration FOREVER_REQUEST_TIMEOUT = Duration.ofSeconds(1000); private static final String API_KEY_VALUE = "testkey"; - @Mock private Config config; - @Mock private RatelimitedLogger ratelimitedLogger; + @Mock + private Config config; + + @Mock + private RatelimitedLogger ratelimitedLogger; private final MockWebServer server = new MockWebServer(); private HttpUrl url; @@ -131,11 +134,10 @@ public void testConnectionRefused() throws IOException, InterruptedException { @Test public void testTimeout() throws IOException, InterruptedException { - server.enqueue( - new MockResponse() - .setHeadersDelay( - REQUEST_IO_OPERATION_TIMEOUT.plus(Duration.ofMillis(1000)).toMillis(), - TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse() + .setHeadersDelay( + REQUEST_IO_OPERATION_TIMEOUT.plus(Duration.ofMillis(1000)).toMillis(), + TimeUnit.MILLISECONDS)); uploader.upload(SNAPSHOT_BUFFER); @@ -146,12 +148,11 @@ public void testTimeout() throws IOException, InterruptedException { public void testEnqueuedRequestsExecuted() throws IOException, InterruptedException { // We have to block all parallel requests to make sure queue is kept full for (int i = 0; i < BatchUploader.MAX_RUNNING_REQUESTS; i++) { - server.enqueue( - new MockResponse() - .setHeadersDelay( - // 1 second should be enough to schedule all requests and not hit timeout - Duration.ofMillis(1000).toMillis(), TimeUnit.MILLISECONDS) - .setResponseCode(200)); + server.enqueue(new MockResponse() + .setHeadersDelay( + // 1 second should be enough to schedule all requests and not hit timeout + Duration.ofMillis(1000).toMillis(), TimeUnit.MILLISECONDS) + .setResponseCode(200)); } server.enqueue(RESPONSE_200); @@ -179,10 +180,9 @@ public void testTooManyRequests() throws IOException, InterruptedException { // We have to block all parallel requests to make sure queue is kept full for (int i = 0; i < BatchUploader.MAX_RUNNING_REQUESTS; i++) { - server.enqueue( - new MockResponse() - .setHeadersDelay(FOREVER_REQUEST_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS) - .setResponseCode(200)); + server.enqueue(new MockResponse() + .setHeadersDelay(FOREVER_REQUEST_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS) + .setResponseCode(200)); } server.enqueue(new MockResponse().setResponseCode(200)); @@ -223,9 +223,8 @@ public void testEmptyUrl() { public void testNoContainerId() throws InterruptedException { // we don't explicitly specify a container ID server.enqueue(RESPONSE_200); - BatchUploader uploaderWithNoContainerId = - new BatchUploader( - "test", config, url.toString(), ratelimitedLogger, retryPolicy, null, null); + BatchUploader uploaderWithNoContainerId = new BatchUploader( + "test", config, url.toString(), ratelimitedLogger, retryPolicy, null, null); uploaderWithNoContainerId.upload(SNAPSHOT_BUFFER); uploaderWithNoContainerId.shutdown(); @@ -238,15 +237,14 @@ public void testNoContainerId() throws InterruptedException { public void testContainerIdHeader() throws InterruptedException { server.enqueue(RESPONSE_200); - BatchUploader uploaderWithContainerId = - new BatchUploader( - "test", - config, - url.toString(), - ratelimitedLogger, - retryPolicy, - "testContainerId", - "testEntityId"); + BatchUploader uploaderWithContainerId = new BatchUploader( + "test", + config, + url.toString(), + ratelimitedLogger, + retryPolicy, + "testContainerId", + "testEntityId"); uploaderWithContainerId.upload(SNAPSHOT_BUFFER); uploaderWithContainerId.shutdown(); @@ -296,20 +294,18 @@ public void testRetryOnFailure() throws IOException, InterruptedException { int port = server.getPort(); server.shutdown(); ServerSocket serverSocket = new ServerSocket(port); - Thread t = - new Thread( - () -> { - try { - System.out.println("Accepting connection on port " + port); - Socket socket = serverSocket.accept(); - System.out.println("Accepted connection, closing"); - socket.setSoLinger(true, 0); - socket.close(); - serverSocket.close(); - } catch (Exception e) { - e.printStackTrace(); - } - }); + Thread t = new Thread(() -> { + try { + System.out.println("Accepting connection on port " + port); + Socket socket = serverSocket.accept(); + System.out.println("Accepted connection, closing"); + socket.setSoLinger(true, 0); + socket.close(); + serverSocket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + }); t.start(); // only upload once. will fail on first attempt, will succeed on retry uploader.upload(SNAPSHOT_BUFFER); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/CapturedValueAdapterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/CapturedValueAdapterTest.java index ea16400ce84..c68d96ad39d 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/CapturedValueAdapterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/CapturedValueAdapterTest.java @@ -73,8 +73,7 @@ void collection() throws IOException { } value = getCollectionValue(String[].class.getTypeName(), sb.toString()); assertArrayEquals( - new String[] { - "foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9" + new String[] {"foo0", "foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8", "foo9" }, (String[]) value.getValue()); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassFileHelperTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassFileHelperTest.java index 456ad4c6146..d80b9e7ba51 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassFileHelperTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassFileHelperTest.java @@ -29,7 +29,8 @@ public void extractSourceFile() { private static byte[] readClassFileBytes(String fileName) { try { - return Files.readAllBytes(Paths.get(ClassFileHelperTest.class.getResource(fileName).toURI())); + return Files.readAllBytes( + Paths.get(ClassFileHelperTest.class.getResource(fileName).toURI())); } catch (IOException | URISyntaxException e) { throw new RuntimeException(e); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassNameFilteringTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassNameFilteringTest.java index 6fdf52764a7..fc43c04c464 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassNameFilteringTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ClassNameFilteringTest.java @@ -49,31 +49,28 @@ public void testExcludeSome() { @Test public void testIncludeOverridesExclude() { - ClassNameFiltering classNameFiltering = - new ClassNameFiltering( - Collections.singleton("com.datadog.debugger"), - Collections.singleton("com.datadog.debugger"), - Collections.emptySet()); + ClassNameFiltering classNameFiltering = new ClassNameFiltering( + Collections.singleton("com.datadog.debugger"), + Collections.singleton("com.datadog.debugger"), + Collections.emptySet()); assertFalse(classNameFiltering.isExcluded("com.datadog.debugger.FooBar")); } @Test public void testIncludePrefixOverridesExclude() { - ClassNameFiltering classNameFiltering = - new ClassNameFiltering( - Collections.singleton("com.datadog.debugger"), - Collections.singleton("com.datadog"), - Collections.emptySet()); + ClassNameFiltering classNameFiltering = new ClassNameFiltering( + Collections.singleton("com.datadog.debugger"), + Collections.singleton("com.datadog"), + Collections.emptySet()); assertFalse(classNameFiltering.isExcluded("com.datadog.debugger.FooBar")); } @Test public void testIncludeSomeExcludeSome() { - ClassNameFiltering classNameFiltering = - new ClassNameFiltering( - Stream.of("com.datadog.debugger", "org.junit").collect(Collectors.toSet()), - Collections.singleton("com.datadog.debugger"), - Collections.emptySet()); + ClassNameFiltering classNameFiltering = new ClassNameFiltering( + Stream.of("com.datadog.debugger", "org.junit").collect(Collectors.toSet()), + Collections.singleton("com.datadog.debugger"), + Collections.emptySet()); assertFalse(classNameFiltering.isExcluded("com.datadog.debugger.FooBar")); assertTrue(classNameFiltering.isExcluded("org.junit.FooBar")); } @@ -121,14 +118,11 @@ void lambdaProxyClasses() { // datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda$303/0x00000008013dd1f8.apply(Unknown Source) // jdk21: at // datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda/0x000000b801392c58.apply(Unknown Source) - assertTrue( - ClassNameFiltering.isLambdaProxyClass( - "datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda$231/1770027171")); - assertTrue( - ClassNameFiltering.isLambdaProxyClass( - "datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda$262/0x0000000800467040")); - assertTrue( - ClassNameFiltering.isLambdaProxyClass( - "at datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda/0x000000b801392c58")); + assertTrue(ClassNameFiltering.isLambdaProxyClass( + "datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda$231/1770027171")); + assertTrue(ClassNameFiltering.isLambdaProxyClass( + "datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda$262/0x0000000800467040")); + assertTrue(ClassNameFiltering.isLambdaProxyClass( + "at datadog.smoketest.debugger.ServerDebuggerTestApplication$$Lambda/0x000000b801392c58")); } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ExceptionHelperTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ExceptionHelperTest.java index d5e25e8bd0d..4316c627467 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ExceptionHelperTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/ExceptionHelperTest.java @@ -22,9 +22,11 @@ @ExtendWith(MockitoExtension.class) public class ExceptionHelperTest { - @Mock Logger logger; + @Mock + Logger logger; - @Mock RatelimitedLogger ratelimitedLogger; + @Mock + RatelimitedLogger ratelimitedLogger; @Test public void testWarn() { @@ -105,19 +107,13 @@ public void innerMostException() { @Test public void flattenStackTrace() { - Throwable simpleException = - new MockException( - "oops!", - new StackTraceElement[] { - new StackTraceElement("MyClass1", "myMethod1", "file1.java", 1) - }); - Throwable nestedException = - new MockException( - "oops!", - new StackTraceElement[] { - new StackTraceElement("MyClass2", "myMethod2", "file2.java", 2) - }, - simpleException); + Throwable simpleException = new MockException( + "oops!", + new StackTraceElement[] {new StackTraceElement("MyClass1", "myMethod1", "file1.java", 1)}); + Throwable nestedException = new MockException( + "oops!", + new StackTraceElement[] {new StackTraceElement("MyClass2", "myMethod2", "file2.java", 2)}, + simpleException); StackTraceElement[] stack = ExceptionHelper.flattenStackTrace(simpleException); assertEquals(1, stack.length); stack = ExceptionHelper.flattenStackTrace(nestedException); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/RemoteConfigHelper.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/RemoteConfigHelper.java index 54154b02080..ec4345e66e3 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/RemoteConfigHelper.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/RemoteConfigHelper.java @@ -7,7 +7,8 @@ public class RemoteConfigHelper { public static String encode(String s, String serviceName) { String encodedConfig = new String(Base64.getEncoder().encode(s.getBytes())); - String path = UUID.nameUUIDFromBytes(serviceName.getBytes(StandardCharsets.UTF_8)).toString(); + String path = + UUID.nameUUIDFromBytes(serviceName.getBytes(StandardCharsets.UTF_8)).toString(); return String.format( "{\n" + "\"targets\": \"\",\n" diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SnapshotPrunerTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SnapshotPrunerTest.java index 75c9d07578a..6b37141ad44 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SnapshotPrunerTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SnapshotPrunerTest.java @@ -40,30 +40,29 @@ public void basic() { @Test public void priorityPruning() { - final String INPUT = - "{\n" - + " \"elements\":[\n" - + " {\n" - + " \"type\": \"list\",\n" - + " \"notCapturedReason\": \"collectionSize\"\n" - + " },\n" - + " {\n" - + " \"type\": \"complex\",\n" - + " \"notCapturedReason\": \"depth\"\n" - + " },\n" - + " {\n" - + " \"type\": \"deep\",\n" - + " \"subobject\": {\n" - + " \"type\": \"complex\",\n" - + " \"value\": \"subobject\"\n" - + " }\n" - + " }\n" - + " {\n" - + " \"type\": \"complex\",\n" - + " \"value\": \"sfsfsdfklsdfslkfjsdfkjsdklfjsdflksdjfsdlfjsdklfsjdfklsjfksfjslkdfjskdlf\"\n" - + " }\n" - + " ]\n" - + "}"; + final String INPUT = "{\n" + + " \"elements\":[\n" + + " {\n" + + " \"type\": \"list\",\n" + + " \"notCapturedReason\": \"collectionSize\"\n" + + " },\n" + + " {\n" + + " \"type\": \"complex\",\n" + + " \"notCapturedReason\": \"depth\"\n" + + " },\n" + + " {\n" + + " \"type\": \"deep\",\n" + + " \"subobject\": {\n" + + " \"type\": \"complex\",\n" + + " \"value\": \"subobject\"\n" + + " }\n" + + " }\n" + + " {\n" + + " \"type\": \"complex\",\n" + + " \"value\": \"sfsfsdfklsdfslkfjsdfkjsdklfjsdflksdjfsdlfjsdklfsjdfklsjfksfjslkdfjskdlf\"\n" + + " }\n" + + " ]\n" + + "}"; assertEquals( "{\n" + " \"elements\":[\n" @@ -129,17 +128,16 @@ public void priorityPruning() { @Test public void sizeReduction() { - final String INPUT = - "{\n" - + " \"keep\": {\"type\": \"list\", \"size\":2, \"elements\": [\n" - + " {\"type\": \"str\", \"value\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaa\"},\n" - + " {\"type\": \"str\", \"value\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaa\"}\n" - + " ]},\n" - + " \"prune\": {\"type\": \"list\", \"size\":2, \"elements\": [\n" - + " {\"type\": \"Custom\", \"notCapturedReason\": \"depth\"},\n" - + " {\"type\": \"Custom\", \"notCapturedReason\": \"depth\"}\n" - + " ]}\n" - + " }"; + final String INPUT = "{\n" + + " \"keep\": {\"type\": \"list\", \"size\":2, \"elements\": [\n" + + " {\"type\": \"str\", \"value\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaa\"},\n" + + " {\"type\": \"str\", \"value\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaa\"}\n" + + " ]},\n" + + " \"prune\": {\"type\": \"list\", \"size\":2, \"elements\": [\n" + + " {\"type\": \"Custom\", \"notCapturedReason\": \"depth\"},\n" + + " {\"type\": \"Custom\", \"notCapturedReason\": \"depth\"}\n" + + " ]}\n" + + " }"; assertEquals( "{\n" + " \"keep\": {\"type\": \"list\", \"size\":2, \"elements\": [\n" @@ -203,30 +201,31 @@ public void sizeReduction() { @Test public void sliceSmallSnapshot() throws Exception { final int MIN_LEVEL = 6; - String inputSmallSnapshot = - utils.TestHelper.getFixtureContent("/com/datadog/debugger/util/smallSnapshot.json").trim(); + String inputSmallSnapshot = utils.TestHelper.getFixtureContent( + "/com/datadog/debugger/util/smallSnapshot.json") + .trim(); assertEquals( inputSmallSnapshot, SnapshotPruner.prune(inputSmallSnapshot, inputSmallSnapshot.length(), MIN_LEVEL)); - String smallSnapshot = - utils.TestHelper.getFixtureContent("/com/datadog/debugger/util/smallSnapshot_pruned0.json") - .trim(); + String smallSnapshot = utils.TestHelper.getFixtureContent( + "/com/datadog/debugger/util/smallSnapshot_pruned0.json") + .trim(); assertEquals(smallSnapshot, SnapshotPruner.prune(inputSmallSnapshot, 1500, MIN_LEVEL)); - smallSnapshot = - utils.TestHelper.getFixtureContent("/com/datadog/debugger/util/smallSnapshot_pruned1.json") - .trim(); + smallSnapshot = utils.TestHelper.getFixtureContent( + "/com/datadog/debugger/util/smallSnapshot_pruned1.json") + .trim(); assertEquals(smallSnapshot, SnapshotPruner.prune(inputSmallSnapshot, 1250, MIN_LEVEL)); - smallSnapshot = - utils.TestHelper.getFixtureContent("/com/datadog/debugger/util/smallSnapshot_pruned2.json") - .trim(); + smallSnapshot = utils.TestHelper.getFixtureContent( + "/com/datadog/debugger/util/smallSnapshot_pruned2.json") + .trim(); assertEquals(smallSnapshot, SnapshotPruner.prune(inputSmallSnapshot, 1100, MIN_LEVEL)); - smallSnapshot = - utils.TestHelper.getFixtureContent("/com/datadog/debugger/util/smallSnapshot_pruned3.json") - .trim(); + smallSnapshot = utils.TestHelper.getFixtureContent( + "/com/datadog/debugger/util/smallSnapshot_pruned3.json") + .trim(); assertEquals(smallSnapshot, SnapshotPruner.prune(inputSmallSnapshot, 1000, MIN_LEVEL)); - smallSnapshot = - utils.TestHelper.getFixtureContent("/com/datadog/debugger/util/smallSnapshot_pruned4.json") - .trim(); + smallSnapshot = utils.TestHelper.getFixtureContent( + "/com/datadog/debugger/util/smallSnapshot_pruned4.json") + .trim(); assertEquals(smallSnapshot, SnapshotPruner.prune(inputSmallSnapshot, 500, MIN_LEVEL)); } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SpringHelperTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SpringHelperTest.java index a15d9e84883..f36c04b6f4a 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SpringHelperTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/SpringHelperTest.java @@ -41,9 +41,8 @@ void isSpringUsingOnlyMethodParametersFalseFallback() throws Exception { @Test void invalidSpringVersion() { - IllegalArgumentException illegalArgumentException = - assertThrows( - IllegalArgumentException.class, () -> new SpringHelper.ParsedSpringVersion("foo")); + IllegalArgumentException illegalArgumentException = assertThrows( + IllegalArgumentException.class, () -> new SpringHelper.ParsedSpringVersion("foo")); assertEquals("Cannot parse SpringVersion: foo", illegalArgumentException.getMessage()); } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/StringTokenWriterTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/StringTokenWriterTest.java index 3009ff735d6..7749f394144 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/StringTokenWriterTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/StringTokenWriterTest.java @@ -172,10 +172,9 @@ static class LeafClass extends Parent3 { private String serializeValue(Object value, Limits limits) throws Exception { StringBuilder sb = new StringBuilder(); - SerializerWithLimits serializer = - new SerializerWithLimits( - new StringTokenWriter(sb, new ArrayList<>()), - TimeoutChecker.create(Config.get(), Duration.ofSeconds(300))); + SerializerWithLimits serializer = new SerializerWithLimits( + new StringTokenWriter(sb, new ArrayList<>()), + TimeoutChecker.create(Config.get(), Duration.ofSeconds(300))); serializer.serialize( value, value != null ? value.getClass().getTypeName() : Object.class.getTypeName(), limits); return sb.toString(); diff --git a/dd-java-agent/agent-debugger/src/test/java/utils/SourceCompiler.java b/dd-java-agent/agent-debugger/src/test/java/utils/SourceCompiler.java index e2ed7f9b6cb..5eab8682be7 100644 --- a/dd-java-agent/agent-debugger/src/test/java/utils/SourceCompiler.java +++ b/dd-java-agent/agent-debugger/src/test/java/utils/SourceCompiler.java @@ -32,26 +32,22 @@ public static Map compile( List options = new ArrayList<>(additionalOptions); switch (debug) { - case ALL: - { - options.add("-g"); - break; - } - case VARIABLES: - { - options.add("-g:vars"); - break; - } - case LINES: - { - options.add("-g:lines"); - break; - } - case NONE: - { - options.add("-g:none"); - break; - } + case ALL: { + options.add("-g"); + break; + } + case VARIABLES: { + options.add("-g:vars"); + break; + } + case LINES: { + options.add("-g:lines"); + break; + } + case NONE: { + options.add("-g:none"); + break; + } } options.add("-target"); options.add(version); diff --git a/dd-java-agent/agent-debugger/src/test/java/utils/TestHelper.java b/dd-java-agent/agent-debugger/src/test/java/utils/TestHelper.java index ea96d90398e..ab9bb3e39e7 100644 --- a/dd-java-agent/agent-debugger/src/test/java/utils/TestHelper.java +++ b/dd-java-agent/agent-debugger/src/test/java/utils/TestHelper.java @@ -13,7 +13,8 @@ public class TestHelper { public static String getFixtureContent(String fixture) throws IOException, URISyntaxException { - return new String(Files.readAllBytes(Paths.get(TestHelper.class.getResource(fixture).toURI()))); + return new String( + Files.readAllBytes(Paths.get(TestHelper.class.getResource(fixture).toURI()))); } public static List getFixtureLines(String fixture) { diff --git a/dd-java-agent/agent-debugger/src/testFixtures/java/com/datadog/debugger/util/MoshiSnapshotTestHelper.java b/dd-java-agent/agent-debugger/src/testFixtures/java/com/datadog/debugger/util/MoshiSnapshotTestHelper.java index 80c0931d236..88e97506883 100644 --- a/dd-java-agent/agent-debugger/src/testFixtures/java/com/datadog/debugger/util/MoshiSnapshotTestHelper.java +++ b/dd-java-agent/agent-debugger/src/testFixtures/java/com/datadog/debugger/util/MoshiSnapshotTestHelper.java @@ -263,16 +263,14 @@ private void fromJsonFields(JsonReader jsonReader, CapturedContext capturedConte while (jsonReader.hasNext()) { String name = jsonReader.nextName(); switch (name) { - case TYPE: - { - jsonReader.nextString(); - break; - } - case NOT_CAPTURED_REASON: - { - jsonReader.nextString(); - break; - } + case TYPE: { + jsonReader.nextString(); + break; + } + case NOT_CAPTURED_REASON: { + jsonReader.nextString(); + break; + } default: throw new IllegalArgumentException("Unknown field name for 'this' object: " + name); } @@ -333,65 +331,64 @@ public CapturedContext.CapturedValue fromJson(JsonReader jsonReader) throws IOEx jsonReader.endObject(); value = fields; break; - case ELEMENTS: - { - if (type == null) { - throw new RuntimeException("type is null"); - } - jsonReader.beginArray(); - List values = new ArrayList<>(); - while (jsonReader.hasNext()) { - CapturedContext.CapturedValue elementValue = fromJson(jsonReader); - values.add(elementValue); + case ELEMENTS: { + if (type == null) { + throw new RuntimeException("type is null"); + } + jsonReader.beginArray(); + List values = new ArrayList<>(); + while (jsonReader.hasNext()) { + CapturedContext.CapturedValue elementValue = fromJson(jsonReader); + values.add(elementValue); + } + jsonReader.endArray(); + if (type.equals(List.class.getTypeName()) + || type.equals(ArrayList.class.getTypeName()) + || type.equals("java.util.Collections$UnmodifiableRandomAccessList")) { + List list = new ArrayList<>(); + for (CapturedContext.CapturedValue cValue : values) { + list.add(cValue.getValue()); } - jsonReader.endArray(); - if (type.equals(List.class.getTypeName()) - || type.equals(ArrayList.class.getTypeName()) - || type.equals("java.util.Collections$UnmodifiableRandomAccessList")) { - List list = new ArrayList<>(); - for (CapturedContext.CapturedValue cValue : values) { - list.add(cValue.getValue()); - } - value = list; - } else if (type.endsWith("[]")) { - String componentType = type.substring(0, type.indexOf('[')); - if (SerializerWithLimits.isPrimitive(componentType)) { - value = createPrimitiveArray(componentType, values); - } else { - value = values.stream().map(CapturedContext.CapturedValue::getValue).toArray(); - } - } else if (type.equals("java.util.Collections$EmptyList")) { - value = Collections.emptyList(); + value = list; + } else if (type.endsWith("[]")) { + String componentType = type.substring(0, type.indexOf('[')); + if (SerializerWithLimits.isPrimitive(componentType)) { + value = createPrimitiveArray(componentType, values); } else { - throw new RuntimeException("Cannot deserialize type: " + type); + value = + values.stream().map(CapturedContext.CapturedValue::getValue).toArray(); } - break; + } else if (type.equals("java.util.Collections$EmptyList")) { + value = Collections.emptyList(); + } else { + throw new RuntimeException("Cannot deserialize type: " + type); } - case ENTRIES: - { + break; + } + case ENTRIES: { + jsonReader.beginArray(); + List values = new ArrayList<>(); + while (jsonReader.hasNext()) { jsonReader.beginArray(); - List values = new ArrayList<>(); - while (jsonReader.hasNext()) { - jsonReader.beginArray(); - CapturedContext.CapturedValue elementValue = fromJson(jsonReader); - values.add(elementValue); - elementValue = fromJson(jsonReader); - values.add(elementValue); - jsonReader.endArray(); - } + CapturedContext.CapturedValue elementValue = fromJson(jsonReader); + values.add(elementValue); + elementValue = fromJson(jsonReader); + values.add(elementValue); jsonReader.endArray(); - Map entries = new HashMap<>(); - for (int i = 0; i < values.size(); i += 2) { - Object entryKey = values.get(i).getValue(); - if (i + 1 >= values.size()) { - break; - } - Object entryValue = values.get(i + 1).getValue(); - entries.put(entryKey, entryValue); + } + jsonReader.endArray(); + Map entries = new HashMap<>(); + for (int i = 0; i < values.size(); i += 2) { + Object entryKey = values.get(i).getValue(); + if (i + 1 >= values.size()) { + break; } - value = entries; - break; + Object entryValue = values.get(i + 1).getValue(); + entries.put(entryKey, entryValue); } + value = entries; + break; + } case IS_NULL: jsonReader.nextBoolean(); value = null; @@ -419,87 +416,78 @@ public CapturedContext.CapturedValue fromJson(JsonReader jsonReader) throws IOEx private Object createPrimitiveArray( String componentType, List values) { switch (componentType) { - case "byte": - { - byte[] bytes = new byte[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - bytes[i++] = (Byte) capturedValue.getValue(); - } - return bytes; + case "byte": { + byte[] bytes = new byte[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + bytes[i++] = (Byte) capturedValue.getValue(); } - case "boolean": - { - boolean[] booleans = new boolean[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - booleans[i++] = (Boolean) capturedValue.getValue(); - } - return booleans; + return bytes; + } + case "boolean": { + boolean[] booleans = new boolean[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + booleans[i++] = (Boolean) capturedValue.getValue(); } - case "short": - { - short[] shorts = new short[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - shorts[i++] = (Short) capturedValue.getValue(); - } - return shorts; + return booleans; + } + case "short": { + short[] shorts = new short[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + shorts[i++] = (Short) capturedValue.getValue(); } - case "char": - { - char[] chars = new char[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - chars[i++] = (Character) capturedValue.getValue(); - } - return chars; + return shorts; + } + case "char": { + char[] chars = new char[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + chars[i++] = (Character) capturedValue.getValue(); } - case "int": - { - int[] ints = new int[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - ints[i++] = (Integer) capturedValue.getValue(); - } - return ints; + return chars; + } + case "int": { + int[] ints = new int[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + ints[i++] = (Integer) capturedValue.getValue(); } - case "long": - { - long[] longs = new long[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - longs[i++] = (Long) capturedValue.getValue(); - } - return longs; + return ints; + } + case "long": { + long[] longs = new long[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + longs[i++] = (Long) capturedValue.getValue(); } - case "float": - { - float[] floats = new float[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - floats[i++] = (Float) capturedValue.getValue(); - } - return floats; + return longs; + } + case "float": { + float[] floats = new float[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + floats[i++] = (Float) capturedValue.getValue(); } - case "double": - { - double[] doubles = new double[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - doubles[i++] = (Double) capturedValue.getValue(); - } - return doubles; + return floats; + } + case "double": { + double[] doubles = new double[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + doubles[i++] = (Double) capturedValue.getValue(); } - case "java.lang.String": - { - String[] strings = new String[values.size()]; - int i = 0; - for (CapturedContext.CapturedValue capturedValue : values) { - strings[i++] = (String) capturedValue.getValue(); - } - return strings; + return doubles; + } + case "java.lang.String": { + String[] strings = new String[values.size()]; + int i = 0; + for (CapturedContext.CapturedValue capturedValue : values) { + strings[i++] = (String) capturedValue.getValue(); } + return strings; + } default: throw new RuntimeException("unsupported primitive type: " + componentType); } diff --git a/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/AbstractBenchmark.java b/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/AbstractBenchmark.java index d6f0a7e7b90..3853bb867ff 100644 --- a/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/AbstractBenchmark.java +++ b/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/AbstractBenchmark.java @@ -51,8 +51,10 @@ public abstract class AbstractBenchmark buildConcatImplementation(final int... arity) { try { - final String packageName = StringConcatFactoryBatchBenchmark.class.getPackage().getName(); - DynamicType.Builder builder = - new ByteBuddy() - .subclass(Object.class) - .name(packageName + ".StringConcatFactoryImplementor"); + final String packageName = + StringConcatFactoryBatchBenchmark.class.getPackage().getName(); + DynamicType.Builder builder = new ByteBuddy() + .subclass(Object.class) + .name(packageName + ".StringConcatFactoryImplementor"); for (final int paramCount : arity) { - builder = - builder - .defineMethod("concat", String.class, Visibility.PUBLIC, Ownership.STATIC) - .withParameters( - IntStream.range(0, paramCount) - .mapToObj(i -> String.class) - .collect(Collectors.toList())) - .intercept( - InvokeDynamic.bootstrap( - makeConcatWithConstantsDescriptor(), buildRecipe(paramCount)) - .invoke("makeConcatWithConstants") - .withImplicitAndMethodArguments()); + builder = builder + .defineMethod("concat", String.class, Visibility.PUBLIC, Ownership.STATIC) + .withParameters(IntStream.range(0, paramCount) + .mapToObj(i -> String.class) + .collect(Collectors.toList())) + .intercept(InvokeDynamic.bootstrap( + makeConcatWithConstantsDescriptor(), buildRecipe(paramCount)) + .invoke("makeConcatWithConstants") + .withImplicitAndMethodArguments()); } return builder .make() @@ -170,7 +167,9 @@ private static MethodDescription.Latent makeConcatWithConstantsDescriptor() { new ParameterDescription.Token(JavaType.METHOD_TYPE.getTypeStub().asGenericType()), new ParameterDescription.Token(STRING.asGenericType()), new ParameterDescription.Token( - TypeDescription.Generic.Builder.of(OBJECT.asGenericType()).asArray().build())), + TypeDescription.Generic.Builder.of(OBJECT.asGenericType()) + .asArray() + .build())), Collections.emptyList(), Collections.emptyList(), AnnotationValue.UNDEFINED, @@ -181,16 +180,15 @@ private static Map resolveConcatMethods(final int... arit try { final Map result = new HashMap<>(); for (final int paramCount : arity) { - final MethodHandle method = - MethodHandles.publicLookup() - .findStatic( - StringConcatFactoryBatchBenchmark.CONCAT_IMPL, - "concat", - MethodType.methodType( - String.class, - IntStream.range(0, paramCount) - .mapToObj(i -> String.class) - .collect(Collectors.toList()))); + final MethodHandle method = MethodHandles.publicLookup() + .findStatic( + StringConcatFactoryBatchBenchmark.CONCAT_IMPL, + "concat", + MethodType.methodType( + String.class, + IntStream.range(0, paramCount) + .mapToObj(i -> String.class) + .collect(Collectors.toList()))); result.put(paramCount, method); } return result; diff --git a/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringJoinBenchmark.java b/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringJoinBenchmark.java index 010815d7dcc..af67de6dfa6 100644 --- a/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringJoinBenchmark.java +++ b/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringJoinBenchmark.java @@ -18,23 +18,14 @@ protected StringJoinBenchmark.Context initializeContext() { final IastRequestContext iastRequestContext = new IastRequestContext(); final String tainted = new String("I am a tainted string"); - iastRequestContext - .getTaintedObjects() - .taint( - tainted, - new Range[] { - new Range(0, tainted.length(), new Source((byte) 0, "key", "value"), NOT_MARKED) - }); + iastRequestContext.getTaintedObjects().taint(tainted, new Range[] { + new Range(0, tainted.length(), new Source((byte) 0, "key", "value"), NOT_MARKED) + }); final String taintedDelimiter = new String("-"); - iastRequestContext - .getTaintedObjects() - .taint( - taintedDelimiter, - new Range[] { - new Range( - 0, taintedDelimiter.length(), new Source((byte) 1, "key", "value"), NOT_MARKED) - }); + iastRequestContext.getTaintedObjects().taint(taintedDelimiter, new Range[] { + new Range(0, taintedDelimiter.length(), new Source((byte) 1, "key", "value"), NOT_MARKED) + }); return new StringJoinBenchmark.Context( iastRequestContext, notTainted, tainted, notTaintedDelimiter, taintedDelimiter); diff --git a/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringSubsequenceBenchmark.java b/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringSubsequenceBenchmark.java index d6e7b7cbb4e..c185021d71a 100644 --- a/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringSubsequenceBenchmark.java +++ b/dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringSubsequenceBenchmark.java @@ -24,22 +24,14 @@ protected StringSubsequenceBenchmark.Context initializeContext() { final String notTainted = new String(DEFAULT_STRING); final String taintedLoseRange = new String(DEFAULT_STRING); - iastRequestContext - .getTaintedObjects() - .taint( - taintedLoseRange, - new Range[] { - new Range(0, RANGE_SIZE, new Source((byte) 0, "key", "value"), NOT_MARKED) - }); + iastRequestContext.getTaintedObjects().taint(taintedLoseRange, new Range[] { + new Range(0, RANGE_SIZE, new Source((byte) 0, "key", "value"), NOT_MARKED) + }); final String taintedModifyRange = new String(DEFAULT_STRING); - iastRequestContext - .getTaintedObjects() - .taint( - taintedModifyRange, - new Range[] { - new Range(1, RANGE_SIZE, new Source((byte) 1, "key", "value"), NOT_MARKED) - }); + iastRequestContext.getTaintedObjects().taint(taintedModifyRange, new Range[] { + new Range(1, RANGE_SIZE, new Source((byte) 1, "key", "value"), NOT_MARKED) + }); return new StringSubsequenceBenchmark.Context( iastRequestContext, notTainted, taintedLoseRange, taintedModifyRange); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/GrpcRequestMessageHandler.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/GrpcRequestMessageHandler.java index 9ab09d3dbcc..ee4dc9d9999 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/GrpcRequestMessageHandler.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/GrpcRequestMessageHandler.java @@ -35,9 +35,8 @@ public Flow apply(final RequestContext ctx, final Object o) { if (module != null && o != null) { final IastContext iastCtx = ctx.getData(RequestContextSlot.IAST); final byte source = SourceTypes.GRPC_BODY; - final int tainted = - module.taintObjectDeeply( - iastCtx, o, source, GrpcRequestMessageHandler::visitProtobufArtifact); + final int tainted = module.taintObjectDeeply( + iastCtx, o, source, GrpcRequestMessageHandler::visitProtobufArtifact); if (tainted > 0) { IastMetricCollector.add(IastMetric.EXECUTED_SOURCE, source, tainted, iastCtx); } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastGlobalContext.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastGlobalContext.java index 44be00c59be..95c69d077dc 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastGlobalContext.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastGlobalContext.java @@ -34,9 +34,8 @@ public static class Provider extends IastContext.Provider { static final TimeUnit MAX_AGE_UNIT = TaintedMap.DEFAULT_MAX_AGE_UNIT; // Map that with purge option - final IastContext globalContext = - new IastGlobalContext( - TaintedObjects.build(TaintedMap.buildWithPurge(MAP_SIZE, MAX_AGE, MAX_AGE_UNIT))); + final IastContext globalContext = new IastGlobalContext( + TaintedObjects.build(TaintedMap.buildWithPurge(MAP_SIZE, MAX_AGE, MAX_AGE_UNIT))); @Nullable @Override diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastRequestContext.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastRequestContext.java index ebfd78c7d3e..dd474792a3a 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastRequestContext.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastRequestContext.java @@ -29,14 +29,30 @@ public class IastRequestContext implements IastContext, HasMetricCollector { private final VulnerabilityBatch vulnerabilityBatch; private final OverheadContext overheadContext; private TaintedObjects taintedObjects; - @Nullable private Consumer release; - @Nullable private IastMetricCollector collector; - @Nullable private volatile String strictTransportSecurity; - @Nullable private volatile String xContentTypeOptions; - @Nullable private volatile String xForwardedProto; - @Nullable private volatile String contentType; - @Nullable private volatile String authorization; - @Nullable private volatile String route; + + @Nullable + private Consumer release; + + @Nullable + private IastMetricCollector collector; + + @Nullable + private volatile String strictTransportSecurity; + + @Nullable + private volatile String xContentTypeOptions; + + @Nullable + private volatile String xForwardedProto; + + @Nullable + private volatile String contentType; + + @Nullable + private volatile String authorization; + + @Nullable + private volatile String route; /** * Use {@link IastRequestContext#IastRequestContext(TaintedObjects)} instead as we require more @@ -169,10 +185,8 @@ public static class Provider extends IastContext.Provider { // 16384 buckets: approx 64K static final int MAP_SIZE = TaintedMap.DEFAULT_CAPACITY; - private final Queue pool = - new ArrayBlockingQueue<>( - Math.max( - Config.get().getIastMaxConcurrentRequests(), DEFAULT_IAST_MAX_CONCURRENT_REQUESTS)); + private final Queue pool = new ArrayBlockingQueue<>(Math.max( + Config.get().getIastMaxConcurrentRequests(), DEFAULT_IAST_MAX_CONCURRENT_REQUESTS)); @Nullable @Override @@ -209,10 +223,9 @@ public void releaseRequestContext(@Nonnull final IastContext context) { taintedObjects.clear(); // return to pool and update internal ref - final TaintedObjects unwrapped = - taintedObjects instanceof Wrapper - ? ((Wrapper) taintedObjects).unwrap() - : taintedObjects; + final TaintedObjects unwrapped = taintedObjects instanceof Wrapper + ? ((Wrapper) taintedObjects).unwrap() + : taintedObjects; if (unwrapped != TaintedObjects.NoOp.INSTANCE) { pool.offer(unwrapped); iastCtx.setTaintedObjects(TaintedObjects.NoOp.INSTANCE); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java index e1992897a7d..eec2a23e3f5 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java @@ -112,17 +112,15 @@ public static void start( final boolean globalContext = config.getIastContextMode() == GLOBAL; final IastContext.Provider contextProvider = contextProvider(iast, globalContext); if (overheadController == null) { - overheadController = - OverheadController.build( - globalContext ? UNLIMITED : config.getIastRequestSampling(), - config.getIastMaxConcurrentRequests(), - globalContext, - AgentTaskScheduler.get()); + overheadController = OverheadController.build( + globalContext ? UNLIMITED : config.getIastRequestSampling(), + config.getIastMaxConcurrentRequests(), + globalContext, + AgentTaskScheduler.get()); } IastContext.Provider.register(contextProvider); - final Dependencies dependencies = - new Dependencies( - config, reporter, overheadController, StackWalkerFactory.INSTANCE, contextProvider); + final Dependencies dependencies = new Dependencies( + config, reporter, overheadController, StackWalkerFactory.INSTANCE, contextProvider); final boolean addTelemetry = config.getIastTelemetryVerbosity() != Verbosity.OFF; iastModules(iast, dependencies).forEach(InstrumentationBridge::registerIastModule); registerRequestStartedCallback(ss, addTelemetry, dependencies); @@ -158,38 +156,37 @@ private static IastContext.Provider contextProvider( private static Stream iastModules( final ProductActivation iast, final Dependencies dependencies) { - Stream> modules = - Stream.of( - StringModuleImpl.class, - CodecModuleImpl.class, - SqlInjectionModuleImpl.class, - PathTraversalModuleImpl.class, - CommandInjectionModuleImpl.class, - WeakCipherModuleImpl.class, - WeakHashModuleImpl.class, - LdapInjectionModuleImpl.class, - PropagationModuleImpl.class, - HttpResponseHeaderModuleImpl.class, - HstsMissingHeaderModuleImpl.class, - InsecureCookieModuleImpl.class, - NoHttpOnlyCookieModuleImpl.class, - XContentTypeModuleImpl.class, - NoSameSiteCookieModuleImpl.class, - SsrfModuleImpl.class, - UnvalidatedRedirectModuleImpl.class, - WeakRandomnessModuleImpl.class, - XPathInjectionModuleImpl.class, - TrustBoundaryViolationModuleImpl.class, - XssModuleImpl.class, - StacktraceLeakModuleImpl.class, - HeaderInjectionModuleImpl.class, - ApplicationModuleImpl.class, - HardcodedSecretModuleImpl.class, - InsecureAuthProtocolModuleImpl.class, - ReflectionInjectionModuleImpl.class, - UntrustedDeserializationModuleImpl.class, - EmailInjectionModuleImpl.class, - CodeInjectionModuleImpl.class); + Stream> modules = Stream.of( + StringModuleImpl.class, + CodecModuleImpl.class, + SqlInjectionModuleImpl.class, + PathTraversalModuleImpl.class, + CommandInjectionModuleImpl.class, + WeakCipherModuleImpl.class, + WeakHashModuleImpl.class, + LdapInjectionModuleImpl.class, + PropagationModuleImpl.class, + HttpResponseHeaderModuleImpl.class, + HstsMissingHeaderModuleImpl.class, + InsecureCookieModuleImpl.class, + NoHttpOnlyCookieModuleImpl.class, + XContentTypeModuleImpl.class, + NoSameSiteCookieModuleImpl.class, + SsrfModuleImpl.class, + UnvalidatedRedirectModuleImpl.class, + WeakRandomnessModuleImpl.class, + XPathInjectionModuleImpl.class, + TrustBoundaryViolationModuleImpl.class, + XssModuleImpl.class, + StacktraceLeakModuleImpl.class, + HeaderInjectionModuleImpl.class, + ApplicationModuleImpl.class, + HardcodedSecretModuleImpl.class, + InsecureAuthProtocolModuleImpl.class, + ReflectionInjectionModuleImpl.class, + UntrustedDeserializationModuleImpl.class, + EmailInjectionModuleImpl.class, + CodeInjectionModuleImpl.class); if (iast != FULLY_ENABLED) { modules = modules.filter(IastSystem::isOptOut); } @@ -232,10 +229,9 @@ private static M newIastModule( private static void registerRequestStartedCallback( final SubscriptionService ss, final boolean addTelemetry, final Dependencies dependencies) { final EventType>> event = Events.get().requestStarted(); - final Supplier> handler = - addTelemetry - ? new TelemetryRequestStartedHandler(dependencies) - : new RequestStartedHandler(dependencies); + final Supplier> handler = addTelemetry + ? new TelemetryRequestStartedHandler(dependencies) + : new RequestStartedHandler(dependencies); ss.registerCallback(event, handler); } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/Reporter.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/Reporter.java index f71035127ef..07d0eb445de 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/Reporter.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/Reporter.java @@ -86,8 +86,8 @@ private void reportVulnerability( if (Config.get().isIastStackTraceEnabled() && batch.getVulnerabilities() != null && vulnerability.getLocation().getStackId() == null) { - String stackId = - addVulnerabilityStackTrace(span, String.valueOf(batch.getVulnerabilities().size())); + String stackId = addVulnerabilityStackTrace( + span, String.valueOf(batch.getVulnerabilities().size())); if (stackId != null) { vulnerability.getLocation().setStackId(stackId); } @@ -144,13 +144,11 @@ private VulnerabilityBatch getOrCreateVulnerabilityBatch(final AgentSpan span) { } private AgentSpan startNewSpan() { - final AgentSpanContext tagContext = - new TagContext() - .withRequestContextDataIast(new IastRequestContext(TaintedObjects.NoOp.INSTANCE, true)); - final AgentSpan span = - tracer() - .startSpan("iast", VULNERABILITY_SPAN_NAME, tagContext) - .setSpanType(InternalSpanTypes.VULNERABILITY); + final AgentSpanContext tagContext = new TagContext() + .withRequestContextDataIast(new IastRequestContext(TaintedObjects.NoOp.INSTANCE, true)); + final AgentSpan span = tracer() + .startSpan("iast", VULNERABILITY_SPAN_NAME, tagContext) + .setSpanType(InternalSpanTypes.VULNERABILITY); ANALYZED.setTag(span); return span; } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Location.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Location.java index 4f31240d7fd..829f91365e3 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Location.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Location.java @@ -5,15 +5,19 @@ public final class Location { - @Nullable private final String path; + @Nullable + private final String path; private final int line; - @Nullable private final String method; + @Nullable + private final String method; - @Nullable private Long spanId; + @Nullable + private Long spanId; - @Nullable private transient String serviceName; + @Nullable + private transient String serviceName; private @Nullable String stackId; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Source.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Source.java index 854c38b9234..9999e6861cd 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Source.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Source.java @@ -25,8 +25,13 @@ public final class Source implements Taintable.Source { "[unknown: original value was garbage collected]"; private final @SourceTypeString byte origin; - @Nullable private final Object name; - @Nullable private final Object value; + + @Nullable + private final Object name; + + @Nullable + private final Object value; + private boolean gcReported; public Source(final byte origin, @Nullable final Object name, @Nullable final Object value) { diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityBatch.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityBatch.java index fa5193b0a00..1c864b0678c 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityBatch.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityBatch.java @@ -8,8 +8,11 @@ /** Collects vulnerabilities and serializes to JSON lazily on {@link #toString()}. */ public final class VulnerabilityBatch { - @Nullable private List vulnerabilities; - @Nullable private volatile String json; + @Nullable + private List vulnerabilities; + + @Nullable + private volatile String json; public void add(final Vulnerability v) { synchronized (this) { diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityType.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityType.java index 2c5f3e81684..6d6b364dda5 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityType.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/VulnerabilityType.java @@ -31,146 +31,137 @@ public interface VulnerabilityType { type(VulnerabilityTypes.WEAK_CIPHER).excludedSources(Builder.DB_EXCLUDED).build(); VulnerabilityType WEAK_HASH = type(VulnerabilityTypes.WEAK_HASH).excludedSources(Builder.DB_EXCLUDED).build(); - VulnerabilityType INSECURE_COOKIE = - type(VulnerabilityTypes.INSECURE_COOKIE) - .hash(VulnerabilityType::fileAndLineHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - VulnerabilityType NO_HTTPONLY_COOKIE = - type(VulnerabilityTypes.NO_HTTPONLY_COOKIE) - .hash(VulnerabilityType::fileAndLineHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - VulnerabilityType HSTS_HEADER_MISSING = - type(VulnerabilityTypes.HSTS_HEADER_MISSING) - .hash(VulnerabilityType::serviceHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); + VulnerabilityType INSECURE_COOKIE = type(VulnerabilityTypes.INSECURE_COOKIE) + .hash(VulnerabilityType::fileAndLineHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType NO_HTTPONLY_COOKIE = type(VulnerabilityTypes.NO_HTTPONLY_COOKIE) + .hash(VulnerabilityType::fileAndLineHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType HSTS_HEADER_MISSING = type(VulnerabilityTypes.HSTS_HEADER_MISSING) + .hash(VulnerabilityType::serviceHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); VulnerabilityType XCONTENTTYPE_HEADER_MISSING = type(VulnerabilityTypes.XCONTENTTYPE_HEADER_MISSING) .hash(VulnerabilityType::serviceHash) .excludedSources(Builder.DB_EXCLUDED) .build(); - VulnerabilityType NO_SAMESITE_COOKIE = - type(VulnerabilityTypes.NO_SAMESITE_COOKIE) - .hash(VulnerabilityType::fileAndLineHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); + VulnerabilityType NO_SAMESITE_COOKIE = type(VulnerabilityTypes.NO_SAMESITE_COOKIE) + .hash(VulnerabilityType::fileAndLineHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); VulnerabilityType SQL_INJECTION = type(VulnerabilityTypes.SQL_INJECTION).mark(SQL_INJECTION_MARK).build(); - VulnerabilityType COMMAND_INJECTION = - type(VulnerabilityTypes.COMMAND_INJECTION) - .mark(COMMAND_INJECTION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - VulnerabilityType PATH_TRAVERSAL = - type(VulnerabilityTypes.PATH_TRAVERSAL) - .separator(File.separatorChar) - .mark(PATH_TRAVERSAL_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - VulnerabilityType LDAP_INJECTION = - type(VulnerabilityTypes.LDAP_INJECTION) - .mark(LDAP_INJECTION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - VulnerabilityType SSRF = - type(VulnerabilityTypes.SSRF).mark(SSRF_MARK).excludedSources(Builder.DB_EXCLUDED).build(); - VulnerabilityType UNVALIDATED_REDIRECT = - type(VulnerabilityTypes.UNVALIDATED_REDIRECT) - .mark(UNVALIDATED_REDIRECT_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - VulnerabilityType WEAK_RANDOMNESS = - type(VulnerabilityTypes.WEAK_RANDOMNESS).excludedSources(Builder.DB_EXCLUDED).build(); - - VulnerabilityType XPATH_INJECTION = - type(VulnerabilityTypes.XPATH_INJECTION) - .mark(XPATH_INJECTION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - - VulnerabilityType TRUST_BOUNDARY_VIOLATION = - type(VulnerabilityTypes.TRUST_BOUNDARY_VIOLATION) - .mark(TRUST_BOUNDARY_VIOLATION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); + VulnerabilityType COMMAND_INJECTION = type(VulnerabilityTypes.COMMAND_INJECTION) + .mark(COMMAND_INJECTION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType PATH_TRAVERSAL = type(VulnerabilityTypes.PATH_TRAVERSAL) + .separator(File.separatorChar) + .mark(PATH_TRAVERSAL_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType LDAP_INJECTION = type(VulnerabilityTypes.LDAP_INJECTION) + .mark(LDAP_INJECTION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType SSRF = type(VulnerabilityTypes.SSRF) + .mark(SSRF_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType UNVALIDATED_REDIRECT = type(VulnerabilityTypes.UNVALIDATED_REDIRECT) + .mark(UNVALIDATED_REDIRECT_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType WEAK_RANDOMNESS = type(VulnerabilityTypes.WEAK_RANDOMNESS) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType XPATH_INJECTION = type(VulnerabilityTypes.XPATH_INJECTION) + .mark(XPATH_INJECTION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType TRUST_BOUNDARY_VIOLATION = type(VulnerabilityTypes.TRUST_BOUNDARY_VIOLATION) + .mark(TRUST_BOUNDARY_VIOLATION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); VulnerabilityType XSS = type(VulnerabilityTypes.XSS).mark(XSS_MARK).build(); - VulnerabilityType HEADER_INJECTION = - type(VulnerabilityTypes.HEADER_INJECTION) - .mark(HEADER_INJECTION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); + VulnerabilityType HEADER_INJECTION = type(VulnerabilityTypes.HEADER_INJECTION) + .mark(HEADER_INJECTION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); - VulnerabilityType STACKTRACE_LEAK = - type(VulnerabilityTypes.STACKTRACE_LEAK).excludedSources(Builder.DB_EXCLUDED).build(); + VulnerabilityType STACKTRACE_LEAK = type(VulnerabilityTypes.STACKTRACE_LEAK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); - VulnerabilityType VERB_TAMPERING = - type(VulnerabilityTypes.VERB_TAMPERING).excludedSources(Builder.DB_EXCLUDED).build(); + VulnerabilityType VERB_TAMPERING = type(VulnerabilityTypes.VERB_TAMPERING) + .excludedSources(Builder.DB_EXCLUDED) + .build(); - VulnerabilityType ADMIN_CONSOLE_ACTIVE = - type(VulnerabilityTypes.ADMIN_CONSOLE_ACTIVE) - .deduplicable(false) - .hash(VulnerabilityType::serviceHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); + VulnerabilityType ADMIN_CONSOLE_ACTIVE = type(VulnerabilityTypes.ADMIN_CONSOLE_ACTIVE) + .deduplicable(false) + .hash(VulnerabilityType::serviceHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); VulnerabilityType DEFAULT_HTML_ESCAPE_INVALID = type(VulnerabilityTypes.DEFAULT_HTML_ESCAPE_INVALID) .excludedSources(Builder.DB_EXCLUDED) .build(); - VulnerabilityType SESSION_TIMEOUT = - type(VulnerabilityTypes.SESSION_TIMEOUT).excludedSources(Builder.DB_EXCLUDED).build(); - - VulnerabilityType DIRECTORY_LISTING_LEAK = - type(VulnerabilityTypes.DIRECTORY_LISTING_LEAK).excludedSources(Builder.DB_EXCLUDED).build(); - VulnerabilityType INSECURE_JSP_LAYOUT = - type(VulnerabilityTypes.INSECURE_JSP_LAYOUT).excludedSources(Builder.DB_EXCLUDED).build(); - - VulnerabilityType HARDCODED_SECRET = - type(VulnerabilityTypes.HARDCODED_SECRET).excludedSources(Builder.DB_EXCLUDED).build(); - - VulnerabilityType INSECURE_AUTH_PROTOCOL = - type(VulnerabilityTypes.INSECURE_AUTH_PROTOCOL) - .hash(VulnerabilityType::evidenceHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - - VulnerabilityType REFLECTION_INJECTION = - type(VulnerabilityTypes.REFLECTION_INJECTION) - .mark(REFLECTION_INJECTION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - - VulnerabilityType SESSION_REWRITING = - type(VulnerabilityTypes.SESSION_REWRITING) - .deduplicable(false) - .hash(VulnerabilityType::serviceHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - - VulnerabilityType DEFAULT_APP_DEPLOYED = - type(VulnerabilityTypes.DEFAULT_APP_DEPLOYED) - .deduplicable(false) - .hash(VulnerabilityType::serviceHash) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - - VulnerabilityType UNTRUSTED_DESERIALIZATION = - type(VulnerabilityTypes.UNTRUSTED_DESERIALIZATION) - .mark(UNTRUSTED_DESERIALIZATION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); - - VulnerabilityType EMAIL_HTML_INJECTION = - type(VulnerabilityTypes.EMAIL_HTML_INJECTION) - .mark(EMAIL_HTML_INJECTION_MARK) - .excludedSources(Builder.DB_EXCLUDED) - .build(); + VulnerabilityType SESSION_TIMEOUT = type(VulnerabilityTypes.SESSION_TIMEOUT) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType DIRECTORY_LISTING_LEAK = type(VulnerabilityTypes.DIRECTORY_LISTING_LEAK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + VulnerabilityType INSECURE_JSP_LAYOUT = type(VulnerabilityTypes.INSECURE_JSP_LAYOUT) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType HARDCODED_SECRET = type(VulnerabilityTypes.HARDCODED_SECRET) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType INSECURE_AUTH_PROTOCOL = type(VulnerabilityTypes.INSECURE_AUTH_PROTOCOL) + .hash(VulnerabilityType::evidenceHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType REFLECTION_INJECTION = type(VulnerabilityTypes.REFLECTION_INJECTION) + .mark(REFLECTION_INJECTION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType SESSION_REWRITING = type(VulnerabilityTypes.SESSION_REWRITING) + .deduplicable(false) + .hash(VulnerabilityType::serviceHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType DEFAULT_APP_DEPLOYED = type(VulnerabilityTypes.DEFAULT_APP_DEPLOYED) + .deduplicable(false) + .hash(VulnerabilityType::serviceHash) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType UNTRUSTED_DESERIALIZATION = type(VulnerabilityTypes.UNTRUSTED_DESERIALIZATION) + .mark(UNTRUSTED_DESERIALIZATION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); + + VulnerabilityType EMAIL_HTML_INJECTION = type(VulnerabilityTypes.EMAIL_HTML_INJECTION) + .mark(EMAIL_HTML_INJECTION_MARK) + .excludedSources(Builder.DB_EXCLUDED) + .build(); VulnerabilityType CODE_INJECTION = type(VulnerabilityTypes.CODE_INJECTION).mark(CODE_INJECTION_MARK).build(); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/AdapterFactory.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/AdapterFactory.java index 30bfca64bc5..cc36a73eba3 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/AdapterFactory.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/AdapterFactory.java @@ -37,7 +37,9 @@ static class Context { final List sources; final Map sourceIndexMap; final Map sourceContext; - @Nullable Vulnerability vulnerability; + + @Nullable + Vulnerability vulnerability; public Context() { sources = new ArrayList<>(); @@ -183,8 +185,12 @@ public static class RedactionContext { private final Source source; private final boolean sensitive; private boolean sensitiveRanges; - @Nullable private String redactedValue; - @Nullable private Set markedTypes; + + @Nullable + private String redactedValue; + + @Nullable + private Set markedTypes; public RedactionContext(final Source source) { this.source = source; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/EvidenceAdapter.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/EvidenceAdapter.java index 666d5c7c0c8..4795f7e0e2f 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/EvidenceAdapter.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/EvidenceAdapter.java @@ -357,7 +357,8 @@ interface ValuePart { static class StringValuePart implements ValuePart { - @Nullable private final String value; + @Nullable + private final String value; private StringValuePart(@Nullable final String value) { this.value = value; @@ -405,7 +406,8 @@ static class RedactableTaintedValuePart implements ValuePart { private final List sensitiveRanges; - @Nullable private final Set markedTypes; + @Nullable + private final Set markedTypes; private RedactableTaintedValuePart( final JsonAdapter adapter, @@ -416,11 +418,10 @@ private RedactableTaintedValuePart( this.source = range.getSource(); this.value = value; // shift ranges to the start of the tainted range and sort them - this.sensitiveRanges = - sensitive.stream() - .map(it -> shift(it, -range.getStart())) - .sorted(Comparator.comparing(Ranged::getStart)) - .collect(Collectors.toList()); + this.sensitiveRanges = sensitive.stream() + .map(it -> shift(it, -range.getStart())) + .sorted(Comparator.comparing(Ranged::getStart)) + .collect(Collectors.toList()); this.markedTypes = range.getMarkedVulnerabilities(); } @@ -488,9 +489,8 @@ private void addValuePart( final int length = chunk.length(); final String sourceValue = source.getValue(); final String redactedValue = ctx.getRedactedValue(); - final int matching = - matchingOffsets.computeIfAbsent( - chunk, c -> sourceValue == null ? -1 : sourceValue.indexOf(c)); + final int matching = matchingOffsets.computeIfAbsent( + chunk, c -> sourceValue == null ? -1 : sourceValue.indexOf(c)); final String pattern; if (matching >= 0 && redactedValue != null) { // if matches append the matching part from the redacted value @@ -518,7 +518,8 @@ static class TaintedValuePart implements ValuePart { private final boolean redacted; - @Nullable private final Set markedTypes; + @Nullable + private final Set markedTypes; private TaintedValuePart( final JsonAdapter adapter, diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TaintedObjectEncoding.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TaintedObjectEncoding.java index 27a92bf7dd7..44c7b365390 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TaintedObjectEncoding.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TaintedObjectEncoding.java @@ -8,11 +8,10 @@ public class TaintedObjectEncoding { - private static final JsonAdapter> LIST_ADAPTER = - new Moshi.Builder() - .add(new TaintedObjectAdapter()) - .build() - .adapter(Types.newParameterizedType(List.class, TaintedObject.class)); + private static final JsonAdapter> LIST_ADAPTER = new Moshi.Builder() + .add(new TaintedObjectAdapter()) + .build() + .adapter(Types.newParameterizedType(List.class, TaintedObject.class)); private static final JsonAdapter ADAPTER = new Moshi.Builder().add(new TaintedObjectAdapter()).build().adapter(TaintedObject.class); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TruncatedVulnerabilities.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TruncatedVulnerabilities.java index fe767384ef2..08198d2511e 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TruncatedVulnerabilities.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/json/TruncatedVulnerabilities.java @@ -6,7 +6,8 @@ public class TruncatedVulnerabilities { - @Nullable private final List vulnerabilities; + @Nullable + private final List vulnerabilities; public TruncatedVulnerabilities(@Nullable final List vulnerabilities) { this.vulnerabilities = vulnerabilities; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/Operations.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/Operations.java index e7bb35f1550..fe223fa723e 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/Operations.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/Operations.java @@ -6,27 +6,26 @@ public class Operations { private Operations() {} - public static final Operation REPORT_VULNERABILITY = - new Operation() { - @Override - public boolean hasQuota(@Nullable final OverheadContext context) { - if (context == null) { - return false; - } - return context.getAvailableQuota() > 0; - } + public static final Operation REPORT_VULNERABILITY = new Operation() { + @Override + public boolean hasQuota(@Nullable final OverheadContext context) { + if (context == null) { + return false; + } + return context.getAvailableQuota() > 0; + } - @Override - public boolean consumeQuota(@Nullable final OverheadContext context) { - if (context == null) { - return false; - } - return context.consumeQuota(1); - } + @Override + public boolean consumeQuota(@Nullable final OverheadContext context) { + if (context == null) { + return false; + } + return context.consumeQuota(1); + } - @Override - public String toString() { - return "Operation#REPORT_VULNERABILITY"; - } - }; + @Override + public String toString() { + return "Operation#REPORT_VULNERABILITY"; + } + }; } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java index 89dc03c1a59..5ae5c86e320 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java @@ -50,10 +50,9 @@ public OverheadContext(final int vulnerabilitiesPerRequest) { } public OverheadContext(final int vulnerabilitiesPerRequest, final boolean isGlobal) { - availableVulnerabilities = - vulnerabilitiesPerRequest == UNLIMITED - ? NonBlockingSemaphore.unlimited() - : NonBlockingSemaphore.withPermitCount(vulnerabilitiesPerRequest); + availableVulnerabilities = vulnerabilitiesPerRequest == UNLIMITED + ? NonBlockingSemaphore.unlimited() + : NonBlockingSemaphore.withPermitCount(vulnerabilitiesPerRequest); this.isGlobal = isGlobal; this.requestMap = isGlobal ? null : new ConcurrentHashMap<>(); this.copyMap = isGlobal ? null : new ConcurrentHashMap<>(); @@ -84,27 +83,25 @@ public void resetMaps() { return; } // If the budget is consumed, we need to merge the requestMap into the globalMap - endpoints.forEach( - endpoint -> { - AtomicIntegerArray countMap = requestMap.get(endpoint); - // should not happen, but just in case - if (countMap == null) { - globalMap.remove(endpoint); - return; - } - // Iterate over the vulnerabilities and update the globalMap - int numberOfVulnerabilities = VulnerabilityTypes.STRINGS.length; - for (int i = 0; i < numberOfVulnerabilities; i++) { - int counter = countMap.get(i); - if (counter > 0) { - AtomicIntegerArray globalCountMap = - globalMap.computeIfAbsent( - endpoint, value -> new AtomicIntegerArray(numberOfVulnerabilities)); - - globalCountMap.accumulateAndGet(i, counter, Math::max); - } - } - }); + endpoints.forEach(endpoint -> { + AtomicIntegerArray countMap = requestMap.get(endpoint); + // should not happen, but just in case + if (countMap == null) { + globalMap.remove(endpoint); + return; + } + // Iterate over the vulnerabilities and update the globalMap + int numberOfVulnerabilities = VulnerabilityTypes.STRINGS.length; + for (int i = 0; i < numberOfVulnerabilities; i++) { + int counter = countMap.get(i); + if (counter > 0) { + AtomicIntegerArray globalCountMap = globalMap.computeIfAbsent( + endpoint, value -> new AtomicIntegerArray(numberOfVulnerabilities)); + + globalCountMap.accumulateAndGet(i, counter, Math::max); + } + } + }); } public boolean isGlobal() { diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadController.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadController.java index 344ae25226f..62b14ab22fe 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadController.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadController.java @@ -52,9 +52,8 @@ static OverheadController build( final int maxConcurrentRequests, final boolean globalFallback, final AgentTaskScheduler scheduler) { - final OverheadControllerImpl result = - new OverheadControllerImpl( - requestSampling, maxConcurrentRequests, globalFallback, scheduler); + final OverheadControllerImpl result = new OverheadControllerImpl( + requestSampling, maxConcurrentRequests, globalFallback, scheduler); return IastSystem.DEBUG ? new OverheadControllerDebugAdapter(result) : result; } @@ -270,15 +269,12 @@ private boolean maybeSkipVulnerability( int[] copyArray; if (requestArray == null) { - AtomicIntegerArray globalArray = - globalMap.computeIfAbsent( - currentEndpoint, k -> new AtomicIntegerArray(numberOfVulnerabilities)); + AtomicIntegerArray globalArray = globalMap.computeIfAbsent( + currentEndpoint, k -> new AtomicIntegerArray(numberOfVulnerabilities)); copyArray = toIntArray(globalArray); ctx.getCopyMap().put(currentEndpoint, copyArray); - requestArray = - ctx.getRequestMap() - .computeIfAbsent( - currentEndpoint, k -> new AtomicIntegerArray(numberOfVulnerabilities)); + requestArray = ctx.getRequestMap() + .computeIfAbsent(currentEndpoint, k -> new AtomicIntegerArray(numberOfVulnerabilities)); } else { copyArray = ctx.getCopyMap().get(currentEndpoint); } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java index 3fbb52cb0de..d01b9f99824 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java @@ -395,9 +395,8 @@ private void stringCaseChangedWithReducedSize( if (currentRange.getStart() >= result.length()) { skippedRanges++; } else if (currentRange.getStart() + currentRange.getLength() >= result.length()) { - adjustedRange = - Ranges.copyWithPosition( - currentRange, currentRange.getStart(), result.length() - currentRange.getStart()); + adjustedRange = Ranges.copyWithPosition( + currentRange, currentRange.getStart(), result.length() - currentRange.getStart()); } } Range[] newRanges = new Range[rangesSelf.length - skippedRanges]; @@ -842,9 +841,8 @@ public void onStringValueOf(Object param, @Nonnull String result) { return; } final Source source = (Source) taintable.$$DD$getSource(); - final Range[] ranges = - Ranges.forCharSequence( - result, new Source(source.getOrigin(), source.getName(), source.getValue())); + final Range[] ranges = Ranges.forCharSequence( + result, new Source(source.getOrigin(), source.getName(), source.getValue())); taintedObjects.taint(result, ranges); } else { @@ -861,9 +859,8 @@ public void onStringValueOf(Object param, @Nonnull String result) { // Special objects like InputStream... if (rangesParam[0].getLength() == Integer.MAX_VALUE) { final Source source = rangesParam[0].getSource(); - final Range[] ranges = - Ranges.forCharSequence( - result, new Source(source.getOrigin(), source.getName(), source.getValue())); + final Range[] ranges = Ranges.forCharSequence( + result, new Source(source.getOrigin(), source.getName(), source.getValue())); taintedObjects.taint(result, ranges); } else { diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/AbstractRegexTokenizer.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/AbstractRegexTokenizer.java index f43f00df26f..1010bc378cc 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/AbstractRegexTokenizer.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/AbstractRegexTokenizer.java @@ -9,7 +9,9 @@ public abstract class AbstractRegexTokenizer implements SensitiveHandler.Tokenizer { protected final Matcher matcher; - @Nullable private Ranged current; + + @Nullable + private Ranged current; protected AbstractRegexTokenizer(final Pattern pattern, final String evidence) { matcher = pattern.matcher(evidence); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/CommandRegexpTokenizer.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/CommandRegexpTokenizer.java index b9108d103e8..520375e1353 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/CommandRegexpTokenizer.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/CommandRegexpTokenizer.java @@ -6,9 +6,8 @@ public class CommandRegexpTokenizer extends AbstractRegexTokenizer { - private static final Pattern COMMAND_PATTERN = - Pattern.compile( - "^(?:\\s*(?:sudo|doas)\\s+)?\\b\\S+\\b\\s*(.*)", Pattern.MULTILINE | Pattern.DOTALL); + private static final Pattern COMMAND_PATTERN = Pattern.compile( + "^(?:\\s*(?:sudo|doas)\\s+)?\\b\\S+\\b\\s*(.*)", Pattern.MULTILINE | Pattern.DOTALL); public CommandRegexpTokenizer(final Evidence evidence) { super(COMMAND_PATTERN, evidence.getValue()); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/HeaderRegexpTokenizer.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/HeaderRegexpTokenizer.java index ae3645879b3..e96d88928da 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/HeaderRegexpTokenizer.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/HeaderRegexpTokenizer.java @@ -8,7 +8,8 @@ public class HeaderRegexpTokenizer implements SensitiveHandler.Tokenizer { - @Nullable private Ranged current; + @Nullable + private Ranged current; private boolean checked = false; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/LdapRegexTokenizer.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/LdapRegexTokenizer.java index 5e3f84adafa..526db302d1c 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/LdapRegexTokenizer.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/LdapRegexTokenizer.java @@ -12,9 +12,8 @@ public class LdapRegexTokenizer extends AbstractRegexTokenizer { private static final String LITERAL_GROUP = "LITERAL"; - private static final Pattern LDAP_PATTERN = - Pattern.compile( - String.format("\\(.*?(?:~=|=|<=|>=)(?P<%s>[^)]+)\\)", LITERAL_GROUP), Pattern.MULTILINE); + private static final Pattern LDAP_PATTERN = Pattern.compile( + String.format("\\(.*?(?:~=|=|<=|>=)(?P<%s>[^)]+)\\)", LITERAL_GROUP), Pattern.MULTILINE); public LdapRegexTokenizer(final Evidence evidence) { super(LDAP_PATTERN, evidence.getValue()); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandler.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandler.java index b44415852e3..05435bcaf8a 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandler.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandler.java @@ -35,18 +35,17 @@ interface Tokenizer { Ranged current(); - Tokenizer EMPTY = - new Tokenizer() { - - @Override - public boolean next() { - return false; - } - - @Override - public Ranged current() { - throw new NoSuchElementException("Tokenizer is empty"); - } - }; + Tokenizer EMPTY = new Tokenizer() { + + @Override + public boolean next() { + return false; + } + + @Override + public Ranged current() { + throw new NoSuchElementException("Tokenizer is empty"); + } + }; } } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandlerImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandlerImpl.java index 3aaaa67a775..c15c39f1c1c 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandlerImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SensitiveHandlerImpl.java @@ -48,11 +48,8 @@ public SensitiveHandlerImpl() { SensitiveHandlerImpl(final String configuredNamePattern, final String configuredValuePattern) { namePattern = safeCompile(configuredNamePattern, DEFAULT_IAST_REDACTION_NAME_PATTERN, CASE_INSENSITIVE); - valuePattern = - safeCompile( - configuredValuePattern, - DEFAULT_IAST_REDACTION_VALUE_PATTERN, - CASE_INSENSITIVE | MULTILINE); + valuePattern = safeCompile( + configuredValuePattern, DEFAULT_IAST_REDACTION_VALUE_PATTERN, CASE_INSENSITIVE | MULTILINE); tokenizers = new HashMap<>(); tokenizers.put(VulnerabilityType.SQL_INJECTION, SqlRegexpTokenizer::new); tokenizers.put(VulnerabilityType.LDAP_INJECTION, LdapRegexTokenizer::new); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SqlRegexpTokenizer.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SqlRegexpTokenizer.java index 51587036686..3aebeac7ed6 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SqlRegexpTokenizer.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/SqlRegexpTokenizer.java @@ -30,28 +30,29 @@ public class SqlRegexpTokenizer implements SensitiveHandler.Tokenizer { private static final String DECIMAL_NUMBER = "\\d*\\.\\d+"; private static final String HEX_NUMBER = "x'[0-9a-f]+'|0x[0-9a-f]+"; private static final String BIN_NUMBER = "b'[0-9a-f]+'|0b[0-9a-f]+"; - private static final String NUMERIC_LITERAL = - String.format( - "[-+]?(?:%s)", - String.join( - "|", HEX_NUMBER, BIN_NUMBER, DECIMAL_NUMBER + EXPONENT, INTEGER_NUMBER + EXPONENT)); + private static final String NUMERIC_LITERAL = String.format( + "[-+]?(?:%s)", + String.join( + "|", HEX_NUMBER, BIN_NUMBER, DECIMAL_NUMBER + EXPONENT, INTEGER_NUMBER + EXPONENT)); private static final Map PATTERNS = new ConcurrentHashMap<>(); private final String sql; private final Matcher matcher; private int searchFrom; - @Nullable private Ranged current; + + @Nullable + private Ranged current; // Lazily built (Postgres only): every "$tag$" occurrence indexed by tag, so the matching close // can be located with a binary search instead of an O(n) scan per opener. - @Nullable private Map dollarTagPositions; + @Nullable + private Map dollarTagPositions; public SqlRegexpTokenizer(final Evidence evidence) { this.sql = evidence.getValue(); - this.matcher = - PATTERNS - .computeIfAbsent(Dialect.fromEvidence(evidence), Dialect::buildPattern) - .matcher(sql); + this.matcher = PATTERNS + .computeIfAbsent(Dialect.fromEvidence(evidence), Dialect::buildPattern) + .matcher(sql); } @Override @@ -218,22 +219,16 @@ private static String escapeDelimiter(final char delim) { private enum Dialect { ORACLE( "oracle"::equalsIgnoreCase, - () -> - buildPattern( - NUMERIC_LITERAL, - ORACLE_ESCAPED_LITERAL, - STRING_LITERAL, - LINE_COMMENT, - BLOCK_COMMENT)), + () -> buildPattern( + NUMERIC_LITERAL, ORACLE_ESCAPED_LITERAL, STRING_LITERAL, LINE_COMMENT, BLOCK_COMMENT)), POSTGRESQL( "postgresql"::equalsIgnoreCase, - () -> - buildPattern( - NUMERIC_LITERAL, - POSTGRESQL_ESCAPED_LITERAL, - STRING_LITERAL, - LINE_COMMENT, - BLOCK_COMMENT)), + () -> buildPattern( + NUMERIC_LITERAL, + POSTGRESQL_ESCAPED_LITERAL, + STRING_LITERAL, + LINE_COMMENT, + BLOCK_COMMENT)), MYSQL( "mysql"::equalsIgnoreCase, diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/TaintedRangeBasedTokenizer.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/TaintedRangeBasedTokenizer.java index b2cff3356b4..aef1b4b0e50 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/TaintedRangeBasedTokenizer.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sensitive/TaintedRangeBasedTokenizer.java @@ -12,7 +12,8 @@ public class TaintedRangeBasedTokenizer implements SensitiveHandler.Tokenizer { private final String value; private final Range[] ranges; - @Nullable private Ranged current; + @Nullable + private Ranged current; private int rangesIndex; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ApplicationModuleImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ApplicationModuleImpl.java index e2a9ea77e73..deb607f8250 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ApplicationModuleImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ApplicationModuleImpl.java @@ -73,16 +73,14 @@ public class ApplicationModuleImpl extends SinkModuleBase implements Application static final String JETTY_TEST_APP = "Test WebApp"; public static final Set ADMIN_CONSOLE_LIST = new HashSet<>(Arrays.asList(TOMCAT_MANAGER_APP, TOMCAT_HOST_MANAGER_APP)); - public static final Set DEFAULT_APP_LIST = - new HashSet<>( - Arrays.asList( - TOMCAT_SAMPLES_APP, - JETTY_ASYNC_REST_APP, - JETTY_JAVADOC_APP, - JETTY_JAAS_APP, - JETTY_JNDI_APP, - JETTY_SPEC_APP, - JETTY_TEST_APP)); + public static final Set DEFAULT_APP_LIST = new HashSet<>(Arrays.asList( + TOMCAT_SAMPLES_APP, + JETTY_ASYNC_REST_APP, + JETTY_JAVADOC_APP, + JETTY_JAAS_APP, + JETTY_JNDI_APP, + JETTY_SPEC_APP, + JETTY_TEST_APP)); public static final String WEB_INF = "WEB-INF"; public static final String WEB_XML = "web.xml"; public static final String WEBLOGIC_XML = "weblogic.xml"; @@ -90,18 +88,16 @@ public class ApplicationModuleImpl extends SinkModuleBase implements Application public static final String IBM_WEB_EXT_XML = "ibm-web-ext.xml"; static final String SESSION_REWRITING_EVIDENCE_VALUE = "Servlet URL Session Tracking Mode"; - private static final Pattern PATTERN = - Pattern.compile( - Stream.of( - CONTEXT_LOADER_LISTENER, - DISPATCHER_SERVLET, - DEFAULT_HTML_ESCAPE, - LISTINGS_PATTERN, - JETTY_LISTINGS_PATTERN, - SESSION_TIMEOUT_START_TAG, - SECURITY_CONSTRAINT_START_TAG, - DISPLAY_NAME_PATTERN) - .collect(Collectors.joining("|"))); + private static final Pattern PATTERN = Pattern.compile(Stream.of( + CONTEXT_LOADER_LISTENER, + DISPATCHER_SERVLET, + DEFAULT_HTML_ESCAPE, + LISTINGS_PATTERN, + JETTY_LISTINGS_PATTERN, + SESSION_TIMEOUT_START_TAG, + SECURITY_CONSTRAINT_START_TAG, + DISPLAY_NAME_PATTERN) + .collect(Collectors.joining("|"))); private static final Pattern WEBLOGIC_PATTERN = Pattern.compile(WEBLOGIC_LISTING_PATTERN, Pattern.CASE_INSENSITIVE); @@ -248,9 +244,8 @@ private void checkWebXmlVulnerabilities(@Nonnull final Path path, final AgentSpa private void checkDefaultHtmlEscapeInvalid( @Nonnull String webXmlContent, int defaultHtmlEscapeIndex, AgentSpan span) { if (defaultHtmlEscapeIndex != -1) { - int start = - webXmlContent.indexOf(PARAM_VALUE_START_TAG, defaultHtmlEscapeIndex) - + PARAM_VALUE_START_TAG.length(); + int start = webXmlContent.indexOf(PARAM_VALUE_START_TAG, defaultHtmlEscapeIndex) + + PARAM_VALUE_START_TAG.length(); String value = substringTrim(webXmlContent, start, webXmlContent.indexOf(PARAM_VALUE_END_TAG, start)); if (!value.equalsIgnoreCase("true")) { @@ -310,11 +305,10 @@ private void reportDirectoryListingLeak( private void checkSessionTimeOut(final String webXmlContent, int index, final AgentSpan span) { try { - String innerText = - substringTrim( - webXmlContent, - index + SESSION_TIMEOUT_START_TAG.length(), - webXmlContent.indexOf(SESSION_TIMEOUT_END_TAG, index)); + String innerText = substringTrim( + webXmlContent, + index + SESSION_TIMEOUT_START_TAG.length(), + webXmlContent.indexOf(SESSION_TIMEOUT_END_TAG, index)); int timeoutValue = Integer.parseInt(innerText); if (timeoutValue > 30 || timeoutValue == -1) { report( @@ -329,11 +323,10 @@ private void checkSessionTimeOut(final String webXmlContent, int index, final Ag } private void checkVerbTampering(final String webXmlContent, int index, final AgentSpan span) { - String innerText = - substringTrim( - webXmlContent, - index + SECURITY_CONSTRAINT_START_TAG.length(), - webXmlContent.indexOf(SECURITY_CONSTRAINT_END_TAG, index)); + String innerText = substringTrim( + webXmlContent, + index + SECURITY_CONSTRAINT_START_TAG.length(), + webXmlContent.indexOf(SECURITY_CONSTRAINT_END_TAG, index)); if (!innerText.contains("")) { report( span, @@ -355,10 +348,9 @@ private void checkInsecureJSPLayout(@Nonnull Path path, AgentSpan span) { if (jspPaths.isEmpty()) { return; } - String result = - jspPaths.stream() - .map(jspFolder -> relativize(path, jspFolder)) - .collect(Collectors.joining(System.lineSeparator())); + String result = jspPaths.stream() + .map(jspFolder -> relativize(path, jspFolder)) + .collect(Collectors.joining(System.lineSeparator())); reporter.report( span, new Vulnerability( diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/HeaderInjectionModuleImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/HeaderInjectionModuleImpl.java index 69637bf6c25..869b2aa15af 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/HeaderInjectionModuleImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/HeaderInjectionModuleImpl.java @@ -56,7 +56,9 @@ public void onHeader(@Nonnull final String name, @Nullable final String value) { private static class HeaderInjectionEvidenceBuilder implements EvidenceBuilder { private final String name; - @Nullable private final HttpHeader header; + + @Nullable + private final HttpHeader header; private HeaderInjectionEvidenceBuilder(final String name, @Nullable final HttpHeader header) { this.name = name; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ReflectionInjectionModuleImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ReflectionInjectionModuleImpl.java index a216fcc6cd7..cbdd4b79d10 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ReflectionInjectionModuleImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/ReflectionInjectionModuleImpl.java @@ -49,7 +49,9 @@ public void onFieldName(@Nonnull Class clazz, @Nonnull String fieldName) { private static class MethodEvidenceBuilder implements EvidenceBuilder { private final Class clazz; - @Nullable private final Class[] parameterTypes; + + @Nullable + private final Class[] parameterTypes; private MethodEvidenceBuilder(final Class clazz, @Nullable final Class[] parameterTypes) { this.clazz = clazz; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/SinkModuleBase.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/SinkModuleBase.java index 38c66cb4c53..3750da4f24d 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/SinkModuleBase.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/SinkModuleBase.java @@ -372,9 +372,8 @@ protected final StackTraceElement getCurrentStackTrace() { // If the source mapper is enabled, we should try to map the stack trace element to the original // source file if (SourceMapperImpl.INSTANCE != null) { - Pair pair = - SourceMapperImpl.INSTANCE.getFileAndLine( - stackTraceElement.getClassName(), stackTraceElement.getLineNumber()); + Pair pair = SourceMapperImpl.INSTANCE.getFileAndLine( + stackTraceElement.getClassName(), stackTraceElement.getLineNumber()); if (pair != null && pair.getLeft() != null && pair.getRight() != null) { return new StackTraceElement( pair.getLeft(), stackTraceElement.getMethodName(), pair.getLeft(), pair.getRight()); @@ -387,13 +386,12 @@ static StackTraceElement findValidPackageForVulnerability( @Nonnull final Stream stream) { final StackTraceElement[] first = new StackTraceElement[1]; return stream - .filter( - stack -> { - if (first[0] == null) { - first[0] = stack; - } - return IastExclusionTrie.apply(stack.getClassName()) < 1; - }) + .filter(stack -> { + if (first[0] == null) { + first[0] = stack; + } + return IastExclusionTrie.apply(stack.getClassName()) < 1; + }) .findFirst() .orElse(first[0]); } @@ -425,9 +423,15 @@ private class InjectionVisitor implements ObjectVisitor.Visitor { private final IastContext ctx; private final VulnerabilityType type; - @Nullable private final EvidenceBuilder evidenceBuilder; - @Nullable private final LocationSupplier locationSupplier; - @Nullable private Evidence evidence; + + @Nullable + private final EvidenceBuilder evidenceBuilder; + + @Nullable + private final LocationSupplier locationSupplier; + + @Nullable + private Evidence evidence; private InjectionVisitor( final IastContext ctx, diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/StacktraceLeakModuleImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/StacktraceLeakModuleImpl.java index ef0fc13b7e7..fca0ee919a4 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/StacktraceLeakModuleImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/StacktraceLeakModuleImpl.java @@ -21,12 +21,10 @@ public void onStacktraceLeak( Throwable throwable, String moduleName, String className, String methodName) { if (throwable != null) { final AgentSpan span = AgentTracer.activeSpan(); - Evidence evidence = - new Evidence( - "ExceptionHandler in " - + moduleName - + " \r\nthrown " - + throwable.getClass().getName()); + Evidence evidence = new Evidence("ExceptionHandler in " + + moduleName + + " \r\nthrown " + + throwable.getClass().getName()); Location location = Location.forSpanAndClassAndMethod(span, className, methodName); report(span, new Vulnerability(VulnerabilityType.STACKTRACE_LEAK, location, evidence)); } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/UnvalidatedRedirectModuleImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/UnvalidatedRedirectModuleImpl.java index 550fca68b85..4f03cfb33c5 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/UnvalidatedRedirectModuleImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/sink/UnvalidatedRedirectModuleImpl.java @@ -84,8 +84,11 @@ public void tainted( } private class UnvalidatedRedirectLocationSupplier implements LocationSupplier { - @Nullable private final String clazz; - @Nullable private final String method; + @Nullable + private final String clazz; + + @Nullable + private final String method; private UnvalidatedRedirectLocationSupplier( @Nullable final String clazz, @Nullable final String method) { diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/Ranges.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/Ranges.java index f3e8dec789b..d84bdfa0e99 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/Ranges.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/Ranges.java @@ -52,12 +52,11 @@ public static Range[] intersection( } final Ranged intersection = targetRange.intersection(range); if (intersection != null) { - targetRanges.add( - new Range( - intersection.getStart() + offset, - intersection.getLength(), - range.getSource(), - range.getMarks())); + targetRanges.add(new Range( + intersection.getStart() + offset, + intersection.getLength(), + range.getSource(), + range.getMarks())); } } return targetRanges.isEmpty() ? null : targetRanges.toArray(); @@ -297,16 +296,15 @@ public static Range[] forIndentation( currentIndentation = indentation * ++delimitersCount; } currentIndentation -= offset; - rangeStart = - updateRangesWithIndentation( - currentIndex, - delimiterIndex[0] - 1, - indentation, - rangeStart, - ranges, - newRanges, - currentIndentation, - lineOffset); + rangeStart = updateRangesWithIndentation( + currentIndex, + delimiterIndex[0] - 1, + indentation, + rangeStart, + ranges, + newRanges, + currentIndentation, + lineOffset); offset += lineOffset; currentIndex = delimiterIndex[0]; } diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java index 6e2de584b2a..76f38a32789 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java @@ -75,9 +75,8 @@ static TaintedMap build(final int capacity) { * case there is a purge logic that will clear stale entries according to the scheduled interval. */ static TaintedMap buildWithPurge(final int capacity, int maxAge, TimeUnit maxAgeUnit) { - final TaintedMapImpl map = - new TaintedMapImpl( - capacity, DEFAULT_MAX_BUCKET_SIZE, maxAge, maxAgeUnit, AgentTaskScheduler.get()); + final TaintedMapImpl map = new TaintedMapImpl( + capacity, DEFAULT_MAX_BUCKET_SIZE, maxAge, maxAgeUnit, AgentTaskScheduler.get()); return IastSystem.DEBUG ? new Debug(map) : map; } @@ -242,7 +241,9 @@ public int count() { private Iterator iterator(final int start, final int stop) { return new Iterator() { int currentIndex = start; - @Nullable TaintedObject currentSubPos; + + @Nullable + TaintedObject currentSubPos; @Override public boolean hasNext() { diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedObject.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedObject.java index 95df171b5ab..2cba12623f2 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedObject.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedObject.java @@ -18,7 +18,10 @@ public class TaintedObject extends WeakReference { public static final int MAX_RANGE_COUNT = Config.get().getIastMaxRangeCount(); final int positiveHashCode; - @Nullable TaintedObject next; + + @Nullable + TaintedObject next; + private Range[] ranges; /** generation of the tainted for max age purging purposes */ diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/CookieSecurityParser.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/CookieSecurityParser.java index 4163f573f83..6636d761eb6 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/CookieSecurityParser.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/CookieSecurityParser.java @@ -138,9 +138,8 @@ public static List parse(final HttpHeader headerName, String headerValue } if (addCookie || eof) { if (cookieName != null && !cookieName.isEmpty()) { - result.add( - new Cookie( - cookieName, cookieValue, secure, httpOnly, sameSite, expiresYear, maxAge)); + result.add(new Cookie( + cookieName, cookieValue, secure, httpOnly, sameSite, expiresYear, maxAge)); } cookieName = null; cookieValue = null; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/HttpHeaderMap.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/HttpHeaderMap.java index d023f870ecc..e888b5a737d 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/HttpHeaderMap.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/HttpHeaderMap.java @@ -16,9 +16,11 @@ private static final class Entry { private final String key; - @Nullable private T value; + @Nullable + private T value; - @Nullable private Entry next; + @Nullable + private Entry next; private Entry(final String key, @Nullable final T value) { this.key = key; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/Iterators.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/Iterators.java index 779fb607ac0..dd6cd65b2e8 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/Iterators.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/Iterators.java @@ -7,18 +7,17 @@ public abstract class Iterators { - private static final Iterator EMPTY = - new Iterator() { - @Override - public boolean hasNext() { - return false; - } - - @Override - public Object next() { - throw new NoSuchElementException(); - } - }; + private static final Iterator EMPTY = new Iterator() { + @Override + public boolean hasNext() { + return false; + } + + @Override + public Object next() { + throw new NoSuchElementException(); + } + }; private Iterators() {} @@ -98,7 +97,9 @@ public E next() { private static class JoinIterator implements Iterator { private final Iterator[] iterators; private int index; - @Nullable private Iterator current; + + @Nullable + private Iterator current; private JoinIterator(@Nonnull final Iterator[] iterators) { this.iterators = iterators; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/ObjectVisitor.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/ObjectVisitor.java index 66cc4073ef3..982aaad1d22 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/ObjectVisitor.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/ObjectVisitor.java @@ -23,7 +23,9 @@ public class ObjectVisitor { private static final Logger LOGGER = LoggerFactory.getLogger(ObjectVisitor.class); private static final int MAX_VISITED_OBJECTS = 1000; private static final int MAX_DEPTH = 10; - @Nullable private static final Method TRY_SET_ACCESSIBLE; + + @Nullable + private static final Method TRY_SET_ACCESSIBLE; static { TRY_SET_ACCESSIBLE = fetchTrySetAccessibleMethod(); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangeBuilder.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangeBuilder.java index 52fdcae97db..ecac5d45a14 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangeBuilder.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangeBuilder.java @@ -25,8 +25,12 @@ public class RangeBuilder { private final int maxSize; private final int arrayChunkSize; private int size; - @Nullable protected Entry head; - @Nullable protected Entry tail; + + @Nullable + protected Entry head; + + @Nullable + protected Entry tail; public RangeBuilder() { this(TaintedObject.MAX_RANGE_COUNT); @@ -141,7 +145,8 @@ protected void addNewEntry(final Entry entry) { } protected abstract static class Entry { - @Nullable protected Entry next; + @Nullable + protected Entry next; protected abstract int size(); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangedDeque.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangedDeque.java index 4e66a2bf5a1..1afffd9c2d9 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangedDeque.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/util/RangedDeque.java @@ -33,7 +33,8 @@ abstract class BaseRangedDequeue implements RangedDeque { private final Deque head = new LinkedList<>(); - @Nullable protected E next; + @Nullable + protected E next; @Nullable @Override diff --git a/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/model/json/EvidenceAdapterTest.java b/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/model/json/EvidenceAdapterTest.java index a3189181c7f..5cb5e4b0afa 100644 --- a/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/model/json/EvidenceAdapterTest.java +++ b/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/model/json/EvidenceAdapterTest.java @@ -30,32 +30,30 @@ void repeatedSensitiveLiteralsRedactToTheSamePattern() throws Exception { final Source source = new Source(SourceTypes.REQUEST_PARAMETER_VALUE, "query", sql); final Range range = new Range(0, sql.length(), source, VulnerabilityMarks.NOT_MARKED); final Evidence evidence = new Evidence(sql, new Range[] {range}); - final Vulnerability vulnerability = - new Vulnerability( - VulnerabilityType.SQL_INJECTION, - Location.forClassAndMethodAndLine("Test", "test", 1), - evidence); + final Vulnerability vulnerability = new Vulnerability( + VulnerabilityType.SQL_INJECTION, + Location.forClassAndMethodAndLine("Test", "test", 1), + evidence); final VulnerabilityBatch batch = new VulnerabilityBatch(); batch.add(vulnerability); final String json = VulnerabilityEncoding.toJson(batch); - final String expected = - "{" - + " \"sources\": [" - + " { \"origin\": \"http.request.parameter\", \"name\": \"query\"," - + " \"redacted\": true, \"pattern\": \"abcdefghijklmnopqrstu\" }" - + " ]," - + " \"vulnerabilities\": [" - + " { \"type\": \"SQL_INJECTION\", \"evidence\": { \"valueParts\": [" - + " { \"source\": 0, \"value\": \"select '\" }," - + " { \"source\": 0, \"redacted\": true, \"pattern\": \"ijk\" }," - + " { \"source\": 0, \"value\": \"' or '\" }," - + " { \"source\": 0, \"redacted\": true, \"pattern\": \"ijk\" }," - + " { \"source\": 0, \"value\": \"'\" }" - + " ] } }" - + " ]" - + "}"; + final String expected = "{" + + " \"sources\": [" + + " { \"origin\": \"http.request.parameter\", \"name\": \"query\"," + + " \"redacted\": true, \"pattern\": \"abcdefghijklmnopqrstu\" }" + + " ]," + + " \"vulnerabilities\": [" + + " { \"type\": \"SQL_INJECTION\", \"evidence\": { \"valueParts\": [" + + " { \"source\": 0, \"value\": \"select '\" }," + + " { \"source\": 0, \"redacted\": true, \"pattern\": \"ijk\" }," + + " { \"source\": 0, \"value\": \"' or '\" }," + + " { \"source\": 0, \"redacted\": true, \"pattern\": \"ijk\" }," + + " { \"source\": 0, \"value\": \"'\" }" + + " ] } }" + + " ]" + + "}"; JSONAssert.assertEquals(expected, json, JSONCompareMode.LENIENT); } diff --git a/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sensitive/SqlRegexpTokenizerTest.java b/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sensitive/SqlRegexpTokenizerTest.java index 4268b95539b..a23d4fd4a7e 100644 --- a/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sensitive/SqlRegexpTokenizerTest.java +++ b/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sensitive/SqlRegexpTokenizerTest.java @@ -126,14 +126,12 @@ void manyUnterminatedDollarTagsRunInLinearTime() { } String sql = builder.toString(); - assertTimeoutPreemptively( - Duration.ofSeconds(10), - () -> { - Tokenizer tokenizer = new SqlRegexpTokenizer(postgresEvidence(sql)); - // None of the openers has a matching close, so tokenization yields nothing and must - // simply terminate quickly. - assertFalse(tokenizer.next()); - }); + assertTimeoutPreemptively(Duration.ofSeconds(10), () -> { + Tokenizer tokenizer = new SqlRegexpTokenizer(postgresEvidence(sql)); + // None of the openers has a matching close, so tokenization yields nothing and must + // simply terminate quickly. + assertFalse(tokenizer.next()); + }); } private static Evidence postgresEvidence(String sql) { diff --git a/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sink/CodeInjectionModuleTest.java b/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sink/CodeInjectionModuleTest.java index 98bb0022cc9..dbe4f34614d 100644 --- a/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sink/CodeInjectionModuleTest.java +++ b/dd-java-agent/agent-iast/src/test/java/com/datadog/iast/sink/CodeInjectionModuleTest.java @@ -62,10 +62,9 @@ class CodeInjectionModuleTest { @BeforeEach void setup() { - contextProvider = - Config.get().getIastContextMode() == GLOBAL - ? new IastGlobalContext.Provider() - : new IastRequestContext.Provider(); + contextProvider = Config.get().getIastContextMode() == GLOBAL + ? new IastGlobalContext.Provider() + : new IastRequestContext.Provider(); ctx = (IastRequestContext) contextProvider.buildRequestContext(); TraceSegment traceSegment = mock(TraceSegment.class); @@ -87,13 +86,8 @@ void setup() { when(overheadController.acquireRequest()).thenReturn(true); when(overheadController.consumeQuota(any(), any(), any())).thenReturn(true); - Dependencies dependencies = - new Dependencies( - Config.get(), - reporter, - overheadController, - StackWalkerFactory.INSTANCE, - contextProvider); + Dependencies dependencies = new Dependencies( + Config.get(), reporter, overheadController, StackWalkerFactory.INSTANCE, contextProvider); AgentTracer.forceRegister(tracer); IastContext.Provider.register(contextProvider); diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentCLI.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentCLI.java index 861fd92542f..86d9114e58a 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentCLI.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentCLI.java @@ -130,24 +130,20 @@ public static void sendOomeEvent(String taglist) throws Exception { @SuppressForbidden public static void scanDependencies(final String[] args) throws Exception { - Class depClass = - Class.forName( - "datadog.telemetry.dependency.DependencyService", - true, - AgentCLI.class.getClassLoader()); + Class depClass = Class.forName( + "datadog.telemetry.dependency.DependencyService", true, AgentCLI.class.getClassLoader()); Object depService = depClass.getConstructor().newInstance(); Method addUrlMethod = depService.getClass().getMethod("addURL", URL.class); Method resolveOne = depService.getClass().getMethod("resolveOneDependency"); - Consumer invoker = - (file) -> { - try { - addUrlMethod.invoke(depService, file.toURI().toURL()); - resolveOne.invoke(depService); - } catch (Exception e) { - log.error("Error invoking dependencies service", e); - } - }; + Consumer invoker = (file) -> { + try { + addUrlMethod.invoke(depService, file.toURI().toURL()); + resolveOne.invoke(depService); + } catch (Exception e) { + log.error("Error invoking dependencies service", e); + } + }; File origin = new File(args[0]); if (origin.isFile()) { recursiveDependencySearch(invoker, origin); @@ -179,32 +175,30 @@ private static void unzipJar(Consumer invoker, File file) throws IOExcepti try (JarFile jar = new JarFile(file)) { log.debug("Finding entries in file: {}", file.getName()); - jar.stream() - .forEach( - e -> { - if (e.getName().endsWith(".jar") || e.getName().endsWith(".war")) { - try { - log.debug("Jar entry found in file: {} entry: {}", file.getName(), e.getName()); - File temp = File.createTempFile("internal", ".jar"); - try (InputStream is = jar.getInputStream(e); - OutputStream out = new FileOutputStream(temp)) { - int read; - while ((read = is.read()) != -1) { - out.write(read); - } - } - log.debug("Adding new jar: {}", temp.getAbsolutePath()); - recursiveDependencySearch(invoker, temp); - if (!temp.delete()) { - log.error("Error deleting temp file: {}", temp.getAbsolutePath()); - } - } catch (Exception ex) { - log.error("Error unzipping file", ex); - } - } else { - log.debug("Entry: {} ignored in file: {}", e.getName(), file.getAbsolutePath()); - } - }); + jar.stream().forEach(e -> { + if (e.getName().endsWith(".jar") || e.getName().endsWith(".war")) { + try { + log.debug("Jar entry found in file: {} entry: {}", file.getName(), e.getName()); + File temp = File.createTempFile("internal", ".jar"); + try (InputStream is = jar.getInputStream(e); + OutputStream out = new FileOutputStream(temp)) { + int read; + while ((read = is.read()) != -1) { + out.write(read); + } + } + log.debug("Adding new jar: {}", temp.getAbsolutePath()); + recursiveDependencySearch(invoker, temp); + if (!temp.delete()) { + log.error("Error deleting temp file: {}", temp.getAbsolutePath()); + } + } catch (Exception ex) { + log.error("Error unzipping file", ex); + } + } else { + log.debug("Entry: {} ignored in file: {}", e.getName(), file.getAbsolutePath()); + } + }); } } } diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java index db69109651a..84ae5d6061a 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java @@ -134,11 +134,10 @@ public static ClassFileTransformer installBytebuddyAgent( boolean simpleMethodGraph = InstrumenterConfig.get().isResolverSimpleMethodGraph(); if (simpleMethodGraph) { // faster compiler that just considers visibility of locally declared methods - byteBuddy = - byteBuddy - .with(MethodGraph.Compiler.ForDeclaredMethods.INSTANCE) - .with(VisibilityBridgeStrategy.Default.NEVER) - .with(InstrumentedType.Factory.Default.FROZEN); + byteBuddy = byteBuddy + .with(MethodGraph.Compiler.ForDeclaredMethods.INSTANCE) + .with(VisibilityBridgeStrategy.Default.NEVER) + .with(InstrumentedType.Factory.Default.FROZEN); } AgentBuilder agentBuilder = new AgentBuilder.Default(byteBuddy); @@ -147,33 +146,31 @@ public static ClassFileTransformer installBytebuddyAgent( agentBuilder = agentBuilder.with(AgentBuilder.TypeStrategy.Default.DECORATE); } - agentBuilder = - agentBuilder - .disableClassFormatChanges() - .assureReadEdgeTo(inst, FieldBackedContextAccessor.class) - .with(AgentStrategies.transformerDecorator()) - .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) - .with(AgentStrategies.rediscoveryStrategy()) - .with(redefinitionStrategyListener(enabledSystems)) - .with(AgentStrategies.locationStrategy()) - .with(AgentStrategies.poolStrategy()) - .with(AgentBuilder.DescriptionStrategy.Default.POOL_ONLY) - .with(AgentStrategies.bufferStrategy()) - .with(AgentStrategies.typeStrategy()) - .with(new ClassLoadListener()) - // FIXME: we cannot enable it yet due to BB/JVM bug, see - // https://github.com/raphw/byte-buddy/issues/558 - // .with(AgentBuilder.LambdaInstrumentationStrategy.ENABLED) - .ignore(globalIgnoresMatcher(skipAdditionalLibraryMatcher)); + agentBuilder = agentBuilder + .disableClassFormatChanges() + .assureReadEdgeTo(inst, FieldBackedContextAccessor.class) + .with(AgentStrategies.transformerDecorator()) + .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) + .with(AgentStrategies.rediscoveryStrategy()) + .with(redefinitionStrategyListener(enabledSystems)) + .with(AgentStrategies.locationStrategy()) + .with(AgentStrategies.poolStrategy()) + .with(AgentBuilder.DescriptionStrategy.Default.POOL_ONLY) + .with(AgentStrategies.bufferStrategy()) + .with(AgentStrategies.typeStrategy()) + .with(new ClassLoadListener()) + // FIXME: we cannot enable it yet due to BB/JVM bug, see + // https://github.com/raphw/byte-buddy/issues/558 + // .with(AgentBuilder.LambdaInstrumentationStrategy.ENABLED) + .ignore(globalIgnoresMatcher(skipAdditionalLibraryMatcher)); if (DEBUG) { - agentBuilder = - agentBuilder - .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) - .with(AgentStrategies.rediscoveryStrategy()) - .with(redefinitionStrategyListener(enabledSystems)) - .with(new RedefinitionLoggingListener()) - .with(new TransformLoggingListener()); + agentBuilder = agentBuilder + .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION) + .with(AgentStrategies.rediscoveryStrategy()) + .with(redefinitionStrategyListener(enabledSystems)) + .with(new RedefinitionLoggingListener()) + .with(new TransformLoggingListener()); } for (final AgentBuilder.Listener listener : listeners) { @@ -222,7 +219,8 @@ public static ClassFileTransformer installBytebuddyAgent( for (InstrumenterModule module : instrumenterModules) { if (!module.isApplicable(enabledSystems)) { if (DEBUG) { - log.debug("Not applicable - instrumentation.class={}", module.getClass().getName()); + log.debug( + "Not applicable - instrumentation.class={}", module.getClass().getName()); } continue; } @@ -245,13 +243,12 @@ public static ClassFileTransformer installBytebuddyAgent( } if (InstrumenterConfig.get().isTelemetryEnabled()) { - InstrumenterState.setObserver( - new InstrumenterState.Observer() { - @Override - public void applied(Iterable instrumentationNames) { - IntegrationsCollector.get().update(instrumentationNames, true); - } - }); + InstrumenterState.setObserver(new InstrumenterState.Observer() { + @Override + public void applied(Iterable instrumentationNames) { + IntegrationsCollector.get().update(instrumentationNames, true); + } + }); } if (!InstrumenterConfig.get().isRuntimeContextMapPerStore()) { diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentStrategies.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentStrategies.java index 59a647d888a..02d99c53fdb 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentStrategies.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/AgentStrategies.java @@ -26,12 +26,11 @@ public class AgentStrategies { private static TransformerDecorator loadTransformerDecorator() { if (JavaVirtualMachine.isJavaVersionAtLeast(9)) { try { - return (TransformerDecorator) - Instrumenter.class - .getClassLoader() - .loadClass("datadog.trace.agent.tooling.bytebuddy.DDJava9ClassFileTransformer") - .getField("DECORATOR") - .get(null); + return (TransformerDecorator) Instrumenter.class + .getClassLoader() + .loadClass("datadog.trace.agent.tooling.bytebuddy.DDJava9ClassFileTransformer") + .getField("DECORATOR") + .get(null); } catch (Throwable e) { log.warn("Problem loading Java9 Module support, falling back to legacy transformer", e); } diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningMatcher.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningMatcher.java index 5ac7ea2e67c..6cd25947660 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningMatcher.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningMatcher.java @@ -160,7 +160,8 @@ && wouldMatch(classLoader, clazz)) { */ private static boolean isDeferred(ClassLoader classLoader) { return null != classLoader - && (DEFER_ALL || DEFERRED_CLASSLOADER_NAMES.contains(classLoader.getClass().getName())); + && (DEFER_ALL + || DEFERRED_CLASSLOADER_NAMES.contains(classLoader.getClass().getName())); } /** Tests whether this class would be ignored on retransformation. */ diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningTransformerBuilder.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningTransformerBuilder.java index 5a7e4b9c3df..f5d5201e86a 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningTransformerBuilder.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/CombiningTransformerBuilder.java @@ -50,10 +50,8 @@ public final class CombiningTransformerBuilder // Added here instead of byte-buddy's ignores because it's relatively // expensive. https://github.com/DataDog/dd-trace-java/pull/1045 - private static final ElementMatcher.Junction NOT_DECORATOR_MATCHER = - not( - declaresAnnotation( - namedOneOf("javax.decorator.Decorator", "jakarta.decorator.Decorator"))); + private static final ElementMatcher.Junction NOT_DECORATOR_MATCHER = not( + declaresAnnotation(namedOneOf("javax.decorator.Decorator", "jakarta.decorator.Decorator"))); /** Associates context stores with the class-loader matchers to activate them. */ private final Map, ElementMatcher> contextStoreInjection = @@ -122,11 +120,10 @@ private void prepareInstrumentation(InstrumenterModule module, int instrumentati classLoaderMatcher = module.classLoaderMatcher(); contextStore = module.contextStore(); - contextRequestRewriter = - !contextStore.isEmpty() - ? new VisitingTransformer( - new FieldBackedContextRequestRewriter(contextStore, module.name())) - : null; + contextRequestRewriter = !contextStore.isEmpty() + ? new VisitingTransformer( + new FieldBackedContextRequestRewriter(contextStore, module.name())) + : null; adviceShader = AdviceShader.with(module); @@ -134,14 +131,13 @@ private void prepareInstrumentation(InstrumenterModule module, int instrumentati if (module.injectHelperDependencies()) { helperClassNames = HelperScanner.withClassDependencies(helperClassNames); } - helperTransformer = - helperClassNames.length > 0 - ? new HelperTransformer( - module.useAgentCodeSource(), - adviceShader, - module.getClass().getSimpleName(), - helperClassNames) - : null; + helperTransformer = helperClassNames.length > 0 + ? new HelperTransformer( + module.useAgentCodeSource(), + adviceShader, + module.getClass().getSimpleName(), + helperClassNames) + : null; postProcessor = module.postProcessor(); @@ -185,9 +181,8 @@ private void buildTypeMatcher(Instrumenter member, int transformationId) { matchers.add( new MatchRecorder.ForHierarchy(transformationId, (Instrumenter.ForTypeHierarchy) member)); } else if (member instanceof Instrumenter.ForCallSite) { - matchers.add( - new MatchRecorder.ForType( - transformationId, ((Instrumenter.ForCallSite) member).callerType())); + matchers.add(new MatchRecorder.ForType( + transformationId, ((Instrumenter.ForCallSite) member).callerType())); } if (member instanceof Instrumenter.ForConfiguredTypes) { @@ -209,9 +204,8 @@ private void buildTypeMatcher(Instrumenter member, int transformationId) { } if (member instanceof Instrumenter.WithTypeStructure) { - matchers.add( - new MatchRecorder.NarrowType( - transformationId, ((Instrumenter.WithTypeStructure) member).structureMatcher())); + matchers.add(new MatchRecorder.NarrowType( + transformationId, ((Instrumenter.WithTypeStructure) member).structureMatcher())); } matchers.add(new MatchRecorder.NarrowLocation(transformationId, muzzle)); @@ -272,10 +266,10 @@ private void addAdviceIfEnabled( if (postProcessor != null) { customMapping = customMapping.with(postProcessor); } - AgentBuilder.Transformer.ForAdvice forAdvice = - new AgentBuilder.Transformer.ForAdvice(customMapping) - .withExceptionHandler(ExceptionHandlers.exceptionHandlerFor(adviceClass)) - .include(Utils.getBootstrapProxy()); + AgentBuilder.Transformer.ForAdvice forAdvice = new AgentBuilder.Transformer.ForAdvice( + customMapping) + .withExceptionHandler(ExceptionHandlers.exceptionHandlerFor(adviceClass)) + .include(Utils.getBootstrapProxy()); ClassLoader adviceLoader = Utils.getExtendedClassLoader(); if (adviceShader != null) { forAdvice = forAdvice.include(new ShadedAdviceLocator(adviceLoader, adviceShader)); diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java index 0f3e507f72b..85b02fe9479 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/MeterInstaller.java @@ -25,10 +25,9 @@ public class MeterInstaller { public static void installMeter() { Config config = Config.get(); StatsDClient statsDClient = createStatsDClient(config); - Monitoring monitoring = - config.isHealthMetricsEnabled() - ? new MonitoringImpl(statsDClient, 10, SECONDS) - : MonitoringImpl.DISABLED; + Monitoring monitoring = config.isHealthMetricsEnabled() + ? new MonitoringImpl(statsDClient, 10, SECONDS) + : MonitoringImpl.DISABLED; AgentMeter.registerIfAbsent(statsDClient, monitoring, DDSketchHistograms.FACTORY); } diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java index 10d31c89bd7..b22f97d84ee 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java @@ -29,14 +29,13 @@ public static synchronized void installGlobalTracer( ProfilingContextIntegration profilingContextIntegration) { if (Config.get().isTraceEnabled() || Config.get().isCiVisibilityEnabled()) { if (!(GlobalTracer.get() instanceof CoreTracer)) { - CoreTracer tracer = - CoreTracer.builder() - .sharedCommunicationObjects(sharedCommunicationObjects) - .profilingContextIntegration(profilingContextIntegration) - .reportInTracerFlare() - .pollForTracingConfiguration() - .serviceDiscoveryFactory(serviceDiscoveryFactory()) - .build(); + CoreTracer tracer = CoreTracer.builder() + .sharedCommunicationObjects(sharedCommunicationObjects) + .profilingContextIntegration(profilingContextIntegration) + .reportInTracerFlare() + .pollForTracingConfiguration() + .serviceDiscoveryFactory(serviceDiscoveryFactory()) + .build(); installGlobalTracer(tracer); } else { log.debug("GlobalTracer already registered."); diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/bytebuddy/DDTransformers.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/bytebuddy/DDTransformers.java index 0c105c0d2b9..2c651783be9 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/bytebuddy/DDTransformers.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/bytebuddy/DDTransformers.java @@ -9,18 +9,17 @@ public class DDTransformers { - private static final AgentBuilder.Transformer CONSTANT_ADJUSTER = - new AgentBuilder.Transformer() { - @Override - public DynamicType.Builder transform( - final DynamicType.Builder builder, - final TypeDescription typeDescription, - final ClassLoader classLoader, - final JavaModule javaModule, - final ProtectionDomain pd) { - return builder.visit(TypeConstantAdjustment.INSTANCE); - } - }; + private static final AgentBuilder.Transformer CONSTANT_ADJUSTER = new AgentBuilder.Transformer() { + @Override + public DynamicType.Builder transform( + final DynamicType.Builder builder, + final TypeDescription typeDescription, + final ClassLoader classLoader, + final JavaModule javaModule, + final ProtectionDomain pd) { + return builder.visit(TypeConstantAdjustment.INSTANCE); + } + }; public static AgentBuilder.Transformer defaultTransformers() { return CONSTANT_ADJUSTER; diff --git a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/usm/UsmExtractorImpl.java b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/usm/UsmExtractorImpl.java index 51a3108b97f..afa7a6aecae 100644 --- a/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/usm/UsmExtractorImpl.java +++ b/dd-java-agent/agent-installer/src/main/java/datadog/trace/agent/tooling/usm/UsmExtractorImpl.java @@ -25,11 +25,8 @@ public void send(UsmMessage message) { log.debug( " sending ioctl: {}", String.format("%08x", UsmMessageImpl.USM_IOCTL_ID.intValue())); - NativeLong res = - CLibrary.Instance.ioctl( - new NativeLong(0), - UsmMessageImpl.USM_IOCTL_ID, - Pointer.nativeValue(bm.getBufferPtr())); + NativeLong res = CLibrary.Instance.ioctl( + new NativeLong(0), UsmMessageImpl.USM_IOCTL_ID, Pointer.nativeValue(bm.getBufferPtr())); log.debug("ioctl result: {}", String.format("%08x", res.intValue())); } else { log.debug("INVALID MESSAGE: {}", message.getClass()); diff --git a/dd-java-agent/agent-installer/src/main/java25/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterFFM.java b/dd-java-agent/agent-installer/src/main/java25/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterFFM.java index a6222d6cfe4..c6a2e2d23f6 100644 --- a/dd-java-agent/agent-installer/src/main/java25/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterFFM.java +++ b/dd-java-agent/agent-installer/src/main/java25/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterFFM.java @@ -36,40 +36,37 @@ private static class Lazy { final SymbolLookup lookup = linker.defaultLookup(); // long syscall(long number, ...) // Note: variadic functions require special handling, we'll use a fixed signature - syscall = - linker.downcallHandle( - lookup.find("syscall").orElseThrow(), - FunctionDescriptor.of( - ValueLayout.JAVA_LONG, // return type: long - ValueLayout.JAVA_LONG, // syscall number - ValueLayout.ADDRESS, // const char* name - ValueLayout.JAVA_INT // int flags - ), - Linker.Option.captureCallState("errno")); + syscall = linker.downcallHandle( + lookup.find("syscall").orElseThrow(), + FunctionDescriptor.of( + ValueLayout.JAVA_LONG, // return type: long + ValueLayout.JAVA_LONG, // syscall number + ValueLayout.ADDRESS, // const char* name + ValueLayout.JAVA_INT // int flags + ), + Linker.Option.captureCallState("errno")); // ssize_t write(int fd, const void *buf, size_t count) - write = - linker.downcallHandle( - lookup.find("write").orElseThrow(), - FunctionDescriptor.of( - ValueLayout.JAVA_LONG, // return type: ssize_t - ValueLayout.JAVA_INT, // int fd - ValueLayout.ADDRESS, // const void* buf - ValueLayout.JAVA_LONG // size_t count - ), - Linker.Option.captureCallState("errno")); + write = linker.downcallHandle( + lookup.find("write").orElseThrow(), + FunctionDescriptor.of( + ValueLayout.JAVA_LONG, // return type: ssize_t + ValueLayout.JAVA_INT, // int fd + ValueLayout.ADDRESS, // const void* buf + ValueLayout.JAVA_LONG // size_t count + ), + Linker.Option.captureCallState("errno")); // int fcntl(int fd, int cmd, ... /* arg */) - fcntl = - linker.downcallHandle( - lookup.find("fcntl").orElseThrow(), - FunctionDescriptor.of( - ValueLayout.JAVA_INT, // return type: int - ValueLayout.JAVA_INT, // int fd - ValueLayout.JAVA_INT, // int cmd - ValueLayout.JAVA_INT // int arg - ), - Linker.Option.captureCallState("errno")); + fcntl = linker.downcallHandle( + lookup.find("fcntl").orElseThrow(), + FunctionDescriptor.of( + ValueLayout.JAVA_INT, // return type: int + ValueLayout.JAVA_INT, // int fd + ValueLayout.JAVA_INT, // int cmd + ValueLayout.JAVA_INT // int arg + ), + Linker.Option.captureCallState("errno")); } catch (final Throwable ex) { log.error("Failed to initialize MemFDUnixWriterFFM", ex); } finally { diff --git a/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/ExtensionFinderTest.java b/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/ExtensionFinderTest.java index 624d73ef0c4..1d312ebfcbd 100644 --- a/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/ExtensionFinderTest.java +++ b/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/ExtensionFinderTest.java @@ -60,26 +60,24 @@ public void singleOtelSpiIsReported(@TempDir Path tempDir) throws IOException { @Test public void allFourAutoconfigureSpisAreReported(@TempDir Path tempDir) throws IOException { - Path jarPath = - buildJar( - tempDir, - "ext.jar", - AUTOCONFIGURE_PROPAGATOR, - AUTOCONFIGURE_RESOURCE, - AUTOCONFIGURE_SAMPLER, - AUTOCONFIGURE_EXPORTER); + Path jarPath = buildJar( + tempDir, + "ext.jar", + AUTOCONFIGURE_PROPAGATOR, + AUTOCONFIGURE_RESOURCE, + AUTOCONFIGURE_SAMPLER, + AUTOCONFIGURE_EXPORTER); try (JarFile jar = new JarFile(jarPath.toFile(), false)) { ExtensionFinder.recordOtelSpiTelemetry(jar); } assertEquals( - new HashSet<>( - java.util.Arrays.asList( - AUTOCONFIGURE_PROPAGATOR, - AUTOCONFIGURE_RESOURCE, - AUTOCONFIGURE_SAMPLER, - AUTOCONFIGURE_EXPORTER)), + new HashSet<>(java.util.Arrays.asList( + AUTOCONFIGURE_PROPAGATOR, + AUTOCONFIGURE_RESOURCE, + AUTOCONFIGURE_SAMPLER, + AUTOCONFIGURE_EXPORTER)), reportedFqns(collector.drain())); } @@ -100,13 +98,12 @@ public void javaagentExtensionSpisAreReported(@TempDir Path tempDir) throws IOEx @Test public void nonOtelSpiIsIgnored(@TempDir Path tempDir) throws IOException { - Path jarPath = - buildJar( - tempDir, - "ext.jar", - "com.example.MyService", - "org.springframework.context.ApplicationContextInitializer", - "java.sql.Driver"); + Path jarPath = buildJar( + tempDir, + "ext.jar", + "com.example.MyService", + "org.springframework.context.ApplicationContextInitializer", + "java.sql.Driver"); try (JarFile jar = new JarFile(jarPath.toFile(), false)) { ExtensionFinder.recordOtelSpiTelemetry(jar); @@ -134,14 +131,13 @@ public void jarWithoutAnyServiceDescriptorsEmitsNothing(@TempDir Path tempDir) @Test public void mixedOtelAndNonOtelReportsOnlyOtel(@TempDir Path tempDir) throws IOException { - Path jarPath = - buildJar( - tempDir, - "ext.jar", - AUTOCONFIGURE_PROPAGATOR, - "com.example.MyService", - JAVAAGENT_AGENT_LISTENER, - "java.sql.Driver"); + Path jarPath = buildJar( + tempDir, + "ext.jar", + AUTOCONFIGURE_PROPAGATOR, + "com.example.MyService", + JAVAAGENT_AGENT_LISTENER, + "java.sql.Driver"); try (JarFile jar = new JarFile(jarPath.toFile(), false)) { ExtensionFinder.recordOtelSpiTelemetry(jar); diff --git a/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterTest.java b/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterTest.java index e41187d92ac..d83697ee656 100644 --- a/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterTest.java +++ b/dd-java-agent/agent-installer/src/test/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterTest.java @@ -45,16 +45,14 @@ void testWriteCreatesMemFd(MemFDUnixWriter writer) throws IOException { boolean memfdFound = false; try (Stream fdStream = Files.list(procSelfFd)) { - memfdFound = - fdStream.anyMatch( - fd -> { - try { - Path linkTarget = Files.readSymbolicLink(fd); - return linkTarget.toString().contains(fileName); - } catch (IOException e) { - return false; - } - }); + memfdFound = fdStream.anyMatch(fd -> { + try { + Path linkTarget = Files.readSymbolicLink(fd); + return linkTarget.toString().contains(fileName); + } catch (IOException e) { + return false; + } + }); } assertTrue(memfdFound, "memfd should be created and visible in /proc/self/fd"); } diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java index 6bcb7ce0694..c2f3f536b4d 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/AgentStatsdReporter.java @@ -85,7 +85,10 @@ public void addReportToFlare(ZipOutputStream zip) throws IOException { StringBuilder buf = new StringBuilder(); NumberFormat nf = NumberFormat.getInstance(Locale.ROOT); for (Map.Entry metric : h.entrySet()) { - buf.append(metric.getKey()).append('=').append(nf.format(metric.getValue())).append('\n'); + buf.append(metric.getKey()) + .append('=') + .append(nf.format(metric.getValue())) + .append('\n'); } TracerFlare.addText(zip, "jmxfetch.txt", buf.toString()); } diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java index a46b1cb81a1..0119708dbd5 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java @@ -71,10 +71,9 @@ private static void run(final StatsDClientManager statsDClientManager, final Con if (log.isDebugEnabled()) { String statsDConnectionString; if (namedPipe == null) { - statsDConnectionString = - "statsd:" - + (null != host ? host : "") - + (null != port && port > 0 ? ":" + port : ""); + statsDConnectionString = "statsd:" + + (null != host ? host : "") + + (null != port && port > 0 ? ":" + port : ""); } else { statsDConnectionString = "statsd:" + namedPipe; } @@ -115,23 +114,22 @@ private static void run(final StatsDClientManager statsDClientManager, final Con defaultConfigs.add(WEBSPHERE_CONFIG); } - final AppConfig.AppConfigBuilder configBuilder = - AppConfig.builder() - .action(Collections.singletonList(ACTION_COLLECT)) - // App should be run as daemon otherwise CLI apps would not exit once main method exits. - .daemon(true) - .embedded(true) - .confdDirectory(jmxFetchConfigDir) - .yamlFileList(jmxFetchConfigs) - .targetDirectInstances(true) - .instanceConfigResources(defaultConfigs) - .metricConfigResources(internalMetricsConfigs) - .metricConfigFiles(metricsConfigs) - .initialRefreshBeansPeriod(initialRefreshBeansPeriod) - .refreshBeansPeriod(refreshBeansPeriod) - .globalTags(globalTags) - .reporter(reporter) - .connectionFactory(new AgentConnectionFactory()); + final AppConfig.AppConfigBuilder configBuilder = AppConfig.builder() + .action(Collections.singletonList(ACTION_COLLECT)) + // App should be run as daemon otherwise CLI apps would not exit once main method exits. + .daemon(true) + .embedded(true) + .confdDirectory(jmxFetchConfigDir) + .yamlFileList(jmxFetchConfigs) + .targetDirectInstances(true) + .instanceConfigResources(defaultConfigs) + .metricConfigResources(internalMetricsConfigs) + .metricConfigFiles(metricsConfigs) + .initialRefreshBeansPeriod(initialRefreshBeansPeriod) + .refreshBeansPeriod(refreshBeansPeriod) + .globalTags(globalTags) + .reporter(reporter) + .connectionFactory(new AgentConnectionFactory()); if (config.isJmxFetchMultipleRuntimeServicesEnabled()) { ServiceNameCollectingTraceInterceptor serviceNameProvider = @@ -147,40 +145,37 @@ private static void run(final StatsDClientManager statsDClientManager, final Con final AppConfig appConfig = configBuilder.build(); - final Thread thread = - newAgentThread( - JMX_COLLECTOR, - new Runnable() { - @Override - public void run() { - App app = new App(appConfig); - while (true) { - // check in case dynamic-config has temporarily disabled JMXFetch - if (!appConfig.getExitWatcher().shouldExit()) { - try { - final int result = app.run(); - if (result != 0) { - log.warn("jmx collector exited with error code: {}", result); - } - } catch (final Exception e) { - String message = e.getMessage(); - boolean ignoredException = - message != null && message.startsWith("Shutdown in progress"); - if (!ignoredException) { - log.warn("Exception in jmx collector thread", e); - } - } - } - // always wait before next attempt - try { - Thread.sleep(DELAY_BETWEEN_RUN_ATTEMPTS); - } catch (final InterruptedException ignore) { - Thread.currentThread().interrupt(); - break; - } - } + final Thread thread = newAgentThread(JMX_COLLECTOR, new Runnable() { + @Override + public void run() { + App app = new App(appConfig); + while (true) { + // check in case dynamic-config has temporarily disabled JMXFetch + if (!appConfig.getExitWatcher().shouldExit()) { + try { + final int result = app.run(); + if (result != 0) { + log.warn("jmx collector exited with error code: {}", result); } - }); + } catch (final Exception e) { + String message = e.getMessage(); + boolean ignoredException = + message != null && message.startsWith("Shutdown in progress"); + if (!ignoredException) { + log.warn("Exception in jmx collector thread", e); + } + } + } + // always wait before next attempt + try { + Thread.sleep(DELAY_BETWEEN_RUN_ATTEMPTS); + } catch (final InterruptedException ignore) { + Thread.currentThread().interrupt(); + break; + } + } + } + }); thread.setContextClassLoader(JMXFetch.class.getClassLoader()); thread.start(); } diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JvmOtlpRuntimeMetrics.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JvmOtlpRuntimeMetrics.java index 5f26cdb2206..de61a533d51 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JvmOtlpRuntimeMetrics.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JvmOtlpRuntimeMetrics.java @@ -151,9 +151,8 @@ public static void start(boolean emitExperimentalMetrics) { // does not depend on the shim — so we register one here for our Attributes class-loader. OtelMetricStorage.registerAttributeReader( Attributes.class.getClassLoader(), - (attributes, visitor) -> - ((Attributes) attributes) - .forEach((a, v) -> visitor.visitAttribute(a.getType().ordinal(), a.getKey(), v))); + (attributes, visitor) -> ((Attributes) attributes) + .forEach((a, v) -> visitor.visitAttribute(a.getType().ordinal(), a.getKey(), v))); // Stable metrics — always registered. registerMemoryMetrics(); @@ -186,11 +185,7 @@ private static void registerMemoryMetrics() { List pools = ManagementFactory.getMemoryPoolMXBeans(); registerLongObservable( - "jvm.memory.used", - "Measure of memory used.", - "By", - UP_DOWN_COUNTER, - storage -> { + "jvm.memory.used", "Measure of memory used.", "By", UP_DOWN_COUNTER, storage -> { storage.recordLong(memoryBean.getHeapMemoryUsage().getUsed(), HEAP_ATTRS); storage.recordLong(memoryBean.getNonHeapMemoryUsage().getUsed(), NON_HEAP_ATTRS); for (MemoryPoolMXBean pool : pools) { @@ -199,11 +194,7 @@ private static void registerMemoryMetrics() { }); registerLongObservable( - "jvm.memory.committed", - "Measure of memory committed.", - "By", - UP_DOWN_COUNTER, - storage -> { + "jvm.memory.committed", "Measure of memory committed.", "By", UP_DOWN_COUNTER, storage -> { storage.recordLong(memoryBean.getHeapMemoryUsage().getCommitted(), HEAP_ATTRS); storage.recordLong(memoryBean.getNonHeapMemoryUsage().getCommitted(), NON_HEAP_ATTRS); for (MemoryPoolMXBean pool : pools) { @@ -212,11 +203,7 @@ private static void registerMemoryMetrics() { }); registerLongObservable( - "jvm.memory.limit", - "Measure of max obtainable memory.", - "By", - UP_DOWN_COUNTER, - storage -> { + "jvm.memory.limit", "Measure of max obtainable memory.", "By", UP_DOWN_COUNTER, storage -> { long heapMax = memoryBean.getHeapMemoryUsage().getMax(); if (heapMax != -1) { storage.recordLong(heapMax, HEAP_ATTRS); @@ -475,12 +462,8 @@ private static void registerGcDurationMetric(boolean captureGcCause) { "com.sun.management.GarbageCollectionNotificationInfo not available; skipping jvm.gc.duration"); return; } - OtelMetricStorage storage = - registerDoubleHistogramStorage( - "jvm.gc.duration", - "Duration of JVM garbage collection actions.", - "s", - GC_DURATION_BUCKETS); + OtelMetricStorage storage = registerDoubleHistogramStorage( + "jvm.gc.duration", "Duration of JVM garbage collection actions.", "s", GC_DURATION_BUCKETS); NotificationFilter filter = n -> GC_NOTIFICATION_TYPE.equals(n.getType()); GcNotificationListener listener = new GcNotificationListener(storage, captureGcCause); for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) { @@ -505,15 +488,14 @@ private static boolean isGcNotificationInfoAvailable() { private static void recordGcDuration( OtelMetricStorage storage, GarbageCollectionNotificationInfo info, boolean captureGcCause) { double durationSeconds = info.getGcInfo().getDuration() / 1000d; - Attributes attrs = - captureGcCause - ? Attributes.of( - GC_NAME, info.getGcName(), - GC_ACTION, info.getGcAction(), - GC_CAUSE, info.getGcCause()) - : Attributes.of( - GC_NAME, info.getGcName(), - GC_ACTION, info.getGcAction()); + Attributes attrs = captureGcCause + ? Attributes.of( + GC_NAME, info.getGcName(), + GC_ACTION, info.getGcAction(), + GC_CAUSE, info.getGcCause()) + : Attributes.of( + GC_NAME, info.getGcName(), + GC_ACTION, info.getGcAction()); storage.recordDouble(durationSeconds, attrs); } @@ -627,19 +609,14 @@ private static void bufferPoolMetric( String unit, List bufferPools, ToLongFunction getter) { - registerLongObservable( - name, - description, - unit, - UP_DOWN_COUNTER, - storage -> { - for (BufferPoolMXBean pool : bufferPools) { - long value = getter.applyAsLong(pool); - if (value >= 0) { - storage.recordLong(value, Attributes.of(BUFFER_POOL, pool.getName())); - } - } - }); + registerLongObservable(name, description, unit, UP_DOWN_COUNTER, storage -> { + for (BufferPoolMXBean pool : bufferPools) { + long value = getter.applyAsLong(pool); + if (value >= 0) { + storage.recordLong(value, Attributes.of(BUFFER_POOL, pool.getName())); + } + } + }); } /** Registers a long observable instrument and its callback against the bootstrap registry. */ @@ -696,18 +673,16 @@ private static OtelMetricStorage registerStorage(OtelInstrumentDescriptor descri switch (descriptor.getType()) { case OBSERVABLE_GAUGE: // observable gauges always use last-value - storageFactory = - descriptor.hasLongValues() - ? OtelMetricStorage::newLongValueStorage - : OtelMetricStorage::newDoubleValueStorage; + storageFactory = descriptor.hasLongValues() + ? OtelMetricStorage::newLongValueStorage + : OtelMetricStorage::newDoubleValueStorage; break; case OBSERVABLE_COUNTER: case OBSERVABLE_UP_DOWN_COUNTER: // observable counters use delta value since last reset - storageFactory = - descriptor.hasLongValues() - ? OtelMetricStorage::newLongDeltaStorage - : OtelMetricStorage::newDoubleDeltaStorage; + storageFactory = descriptor.hasLongValues() + ? OtelMetricStorage::newLongDeltaStorage + : OtelMetricStorage::newDoubleDeltaStorage; break; default: throw new IllegalStateException("Unexpected value: " + descriptor.getType()); diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/ServiceNameCollectingTraceInterceptor.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/ServiceNameCollectingTraceInterceptor.java index 442bea4e332..591d7c89237 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/ServiceNameCollectingTraceInterceptor.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/ServiceNameCollectingTraceInterceptor.java @@ -27,9 +27,8 @@ public class ServiceNameCollectingTraceInterceptor extends AbstractTraceIntercep private static final int SERVICE_NAME_LIMIT = Config.get().getJmxFetchMultipleRuntimeServicesLimit(); private static final AtomicIntegerFieldUpdater - SERVICE_NAMES_SIZE_UPDATER = - AtomicIntegerFieldUpdater.newUpdater( - ServiceNameCollectingTraceInterceptor.class, "serviceNamesSize"); + SERVICE_NAMES_SIZE_UPDATER = AtomicIntegerFieldUpdater.newUpdater( + ServiceNameCollectingTraceInterceptor.class, "serviceNamesSize"); private volatile int serviceNamesSize = 0; private final ConcurrentHashMap serviceNames = new ConcurrentHashMap<>(); diff --git a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsIntakeWorker.java b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsIntakeWorker.java index 68916a33fe2..6f5056b9947 100644 --- a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsIntakeWorker.java +++ b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsIntakeWorker.java @@ -72,15 +72,13 @@ public LLMObsIntakeWorker( HttpUrl.get("https://" + INTAKE_API_DOMAIN + "." + config.getSite() + "/" + apiPath); headers = Headers.of(DD_API_KEY_HEADER_NAME, config.getApiKey()); } else { - submissionUrl = - HttpUrl.get( - sco.agentUrl.toString() + DDAgentFeaturesDiscovery.V2_EVP_PROXY_ENDPOINT + apiPath); + submissionUrl = HttpUrl.get( + sco.agentUrl.toString() + DDAgentFeaturesDiscovery.V2_EVP_PROXY_ENDPOINT + apiPath); headers = Headers.of(EVP_SUBDOMAIN_HEADER_NAME, INTAKE_API_DOMAIN); } - SerializingHandler serializingHandler = - new SerializingHandler<>( - payloadDescription, queue, flushInterval, timeUnit, submissionUrl, headers, serializer); + SerializingHandler serializingHandler = new SerializingHandler<>( + payloadDescription, queue, flushInterval, timeUnit, submissionUrl, headers, serializer); this.serializerThread = newAgentThread(agentThread, serializingHandler); } @@ -192,8 +190,11 @@ protected void flushIfNecessary() { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), reqBod); - Request request = - new Request.Builder().headers(headers).url(submissionUrl).post(requestBody).build(); + Request request = new Request.Builder() + .headers(headers) + .url(submissionUrl) + .post(requestBody) + .build(); try (okhttp3.Response response = OkHttpUtils.sendWithRetries(httpClient, retryPolicyFactory, request)) { diff --git a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsSystem.java b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsSystem.java index 864cf27eb2c..a7dccf9e630 100644 --- a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsSystem.java +++ b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/LLMObsSystem.java @@ -61,17 +61,16 @@ public LLMObsCustomFeedbackProcessor( String defaultMLApp, SharedCommunicationObjects sco, Config config) { this.defaultMLApp = defaultMLApp; - this.feedbackProcessingWorker = - new LLMObsIntakeWorker<>( - "feedback", - FEEDBACK_API_PATH, - AgentThread.LLMOBS_FEEDBACK_PROCESSOR, - QUEUE_CAPACITY, - FLUSH_INTERVAL_MS, - TimeUnit.MILLISECONDS, - sco, - config, - LLMObsFeedbackEvent.batchSerializer()); + this.feedbackProcessingWorker = new LLMObsIntakeWorker<>( + "feedback", + FEEDBACK_API_PATH, + AgentThread.LLMOBS_FEEDBACK_PROCESSOR, + QUEUE_CAPACITY, + FLUSH_INTERVAL_MS, + TimeUnit.MILLISECONDS, + sco, + config, + LLMObsFeedbackEvent.batchSerializer()); this.feedbackProcessingWorker.start(); } @@ -130,17 +129,16 @@ public LLMObsCustomEvalProcessor( String defaultMLApp, SharedCommunicationObjects sco, Config config) { this.defaultMLApp = defaultMLApp; - this.evalProcessingWorker = - new LLMObsIntakeWorker<>( - "eval metrics", - EVAL_METRIC_API_PATH, - AgentThread.LLMOBS_EVALS_PROCESSOR, - QUEUE_CAPACITY, - FLUSH_INTERVAL_MS, - TimeUnit.MILLISECONDS, - sco, - config, - LLMObsEval.batchSerializer()); + this.evalProcessingWorker = new LLMObsIntakeWorker<>( + "eval metrics", + EVAL_METRIC_API_PATH, + AgentThread.LLMOBS_EVALS_PROCESSOR, + QUEUE_CAPACITY, + FLUSH_INTERVAL_MS, + TimeUnit.MILLISECONDS, + sco, + config, + LLMObsEval.batchSerializer()); this.evalProcessingWorker.start(); } @@ -167,9 +165,8 @@ public void SubmitEvaluation( } String traceID = llmObsSpan.getTraceId().toHexString(); long spanID = llmObsSpan.getSpanId(); - LLMObsEval.Score score = - new LLMObsEval.Score( - traceID, spanID, System.currentTimeMillis(), mlApp, label, tags, scoreValue); + LLMObsEval.Score score = new LLMObsEval.Score( + traceID, spanID, System.currentTimeMillis(), mlApp, label, tags, scoreValue); if (!this.evalProcessingWorker.addToQueue(score)) { LOGGER.warn( "queue full, failed to add score eval, ml_app={}, trace_id={}, span_id={}, label={}", @@ -203,9 +200,8 @@ public void SubmitEvaluation( } String traceID = llmObsSpan.getTraceId().toHexString(); long spanID = llmObsSpan.getSpanId(); - LLMObsEval.Categorical category = - new LLMObsEval.Categorical( - traceID, spanID, System.currentTimeMillis(), mlApp, label, tags, categoricalValue); + LLMObsEval.Categorical category = new LLMObsEval.Categorical( + traceID, spanID, System.currentTimeMillis(), mlApp, label, tags, categoricalValue); if (!this.evalProcessingWorker.addToQueue(category)) { LOGGER.warn( "queue full, failed to add categorical eval, ml_app={}, trace_id={}, span_id={}, label={}", @@ -237,14 +233,13 @@ public LLMObsSpan startLLMSpan( @Nullable String mlApp, @Nullable String sessionId) { - DDLLMObsSpan span = - new DDLLMObsSpan( - Tags.LLMOBS_LLM_SPAN_KIND, - spanName, - getMLApp(mlApp), - sessionId, - serviceName, - wellKnownTags); + DDLLMObsSpan span = new DDLLMObsSpan( + Tags.LLMOBS_LLM_SPAN_KIND, + spanName, + getMLApp(mlApp), + sessionId, + serviceName, + wellKnownTags); if (modelName == null || modelName.isEmpty()) { modelName = CUSTOM_MODEL_VAL; @@ -326,14 +321,13 @@ public LLMObsSpan startEmbeddingSpan( if (modelProvider == null) { modelProvider = "custom"; } - DDLLMObsSpan embeddingSpan = - new DDLLMObsSpan( - Tags.LLMOBS_EMBEDDING_SPAN_KIND, - spanName, - getMLApp(mlApp), - sessionId, - serviceName, - wellKnownTags); + DDLLMObsSpan embeddingSpan = new DDLLMObsSpan( + Tags.LLMOBS_EMBEDDING_SPAN_KIND, + spanName, + getMLApp(mlApp), + sessionId, + serviceName, + wellKnownTags); embeddingSpan.setTag(LLMObsTags.MODEL_PROVIDER, modelProvider); embeddingSpan.setTag(LLMObsTags.MODEL_NAME, modelName); return embeddingSpan; diff --git a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/DDLLMObsSpan.java b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/DDLLMObsSpan.java index 473d118cdc3..1a4ecaf4020 100644 --- a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/DDLLMObsSpan.java +++ b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/DDLLMObsSpan.java @@ -124,11 +124,10 @@ public DDLLMObsSpan( spanName = kind; } - AgentTracer.SpanBuilder spanBuilder = - AgentTracer.get() - .buildSpan(LLM_OBS_INSTRUMENTATION_NAME, spanName) - .withServiceName(serviceName) - .withSpanType(DDSpanTypes.LLMOBS); + AgentTracer.SpanBuilder spanBuilder = AgentTracer.get() + .buildSpan(LLM_OBS_INSTRUMENTATION_NAME, spanName) + .withServiceName(serviceName) + .withSpanType(DDSpanTypes.LLMOBS); span = spanBuilder.start(); @@ -207,10 +206,9 @@ public DDLLMObsSpan( if (samplingDecision == null || sampleRate == null) { sampleRate = sampler.formattedRate(); - samplingDecision = - sampler.sample(span.getTraceId().toLong()) - ? LLMObsContext.SAMPLING_DECISION_SAMPLED - : LLMObsContext.SAMPLING_DECISION_DROPPED; + samplingDecision = sampler.sample(span.getTraceId().toLong()) + ? LLMObsContext.SAMPLING_DECISION_SAMPLED + : LLMObsContext.SAMPLING_DECISION_DROPPED; } span.setTag(LLMOBS_TAG_PREFIX + SAMPLE_RATE_TAG_INTERNAL, sampleRate); span.setTag(LLMOBS_TAG_PREFIX + SAMPLING_DECISION_TAG_INTERNAL, samplingDecision); @@ -233,24 +231,22 @@ public DDLLMObsSpan( // Propagate the effective sessionId, agent_version, sampling decision and agent attribution // to descendant LLMObs spans via the context. - scope = - LLMObsContext.attach( - span.spanContext(), - sessionId, - resolvedAgentVersion, - sampleRate, - samplingDecision, - resolvedParentAgentSpanId, - resolvedParentAgentName); + scope = LLMObsContext.attach( + span.spanContext(), + sessionId, + resolvedAgentVersion, + sampleRate, + samplingDecision, + resolvedParentAgentSpanId, + resolvedParentAgentName); // For standalone agent spans (no ambient APM root), activate the underlying APM span so // that child LLMObs spans share the same trace ID and pass the trace-ID gate. Without // this, children start a fresh APM trace, the gate rejects the agent context, and // agent attribution is silently dropped. - standaloneApmScope = - Tags.LLMOBS_AGENT_SPAN_KIND.equals(kind) && span.getLocalRootSpan() == span - ? AgentTracer.activateSpan(span) - : null; + standaloneApmScope = Tags.LLMOBS_AGENT_SPAN_KIND.equals(kind) && span.getLocalRootSpan() == span + ? AgentTracer.activateSpan(span) + : null; } @Override @@ -315,16 +311,12 @@ public void annotateIO(String inputData, String outputData) { boolean hasInput = inputData != null && !inputData.isEmpty(); boolean hasOutput = outputData != null && !outputData.isEmpty(); if (Tags.LLMOBS_LLM_SPAN_KIND.equals(spanKind)) { - List inputMessages = - hasInput - ? Collections.singletonList( - LLMObs.LLMMessage.from(LLM_MESSAGE_UNKNOWN_ROLE, inputData)) - : null; - List outputMessages = - hasOutput - ? Collections.singletonList( - LLMObs.LLMMessage.from(LLM_MESSAGE_UNKNOWN_ROLE, outputData)) - : null; + List inputMessages = hasInput + ? Collections.singletonList(LLMObs.LLMMessage.from(LLM_MESSAGE_UNKNOWN_ROLE, inputData)) + : null; + List outputMessages = hasOutput + ? Collections.singletonList(LLMObs.LLMMessage.from(LLM_MESSAGE_UNKNOWN_ROLE, outputData)) + : null; annotateIO(inputMessages, outputMessages); if (hasInput || hasOutput) { LOGGER.warn( @@ -420,10 +412,9 @@ public void annotateAgentManifest(LLMObs.AgentManifest manifest) { // Read existing manifest (may be null on first call) Object existing = span.getTag(AGENT_MANIFEST); @SuppressWarnings("unchecked") - Map base = - (existing instanceof Map) - ? new LinkedHashMap<>((Map) existing) - : new LinkedHashMap<>(); + Map base = (existing instanceof Map) + ? new LinkedHashMap<>((Map) existing) + : new LinkedHashMap<>(); mergeManifest(base, manifest); base.put("framework", MANUAL_FRAMEWORK); span.setTag(AGENT_MANIFEST, base); @@ -458,10 +449,9 @@ private void mergeManifest(Map base, LLMObs.AgentManifest manife Map modelSettings = manifest.getModelSettings(); if (modelSettings != null && !modelSettings.isEmpty()) { @SuppressWarnings("unchecked") - Map existingSettings = - (base.get("model_settings") instanceof Map) - ? new LinkedHashMap<>((Map) base.get("model_settings")) - : new LinkedHashMap<>(); + Map existingSettings = (base.get("model_settings") instanceof Map) + ? new LinkedHashMap<>((Map) base.get("model_settings")) + : new LinkedHashMap<>(); existingSettings.putAll(modelSettings); base.put("model_settings", existingSettings); } diff --git a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsFeedbackEvent.java b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsFeedbackEvent.java index 87a282d1a27..b6c339f5e6a 100644 --- a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsFeedbackEvent.java +++ b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsFeedbackEvent.java @@ -56,7 +56,8 @@ private static List buildTags(@Nullable Map userTags, St * @return the batch serializer */ public static LLMObsIntakeWorker.BatchSerializer batchSerializer() { - Moshi moshi = new Moshi.Builder().add(LLMObsFeedbackEvent.class, new Adapter()).build(); + Moshi moshi = + new Moshi.Builder().add(LLMObsFeedbackEvent.class, new Adapter()).build(); JsonAdapter requestAdapter = moshi.adapter(Request.class); return batch -> requestAdapter.toJson(new Request(batch)); } diff --git a/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/DDLLMObsSpanDocumentIOTest.java b/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/DDLLMObsSpanDocumentIOTest.java index 10e8a6af54a..3f07be18ec8 100644 --- a/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/DDLLMObsSpanDocumentIOTest.java +++ b/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/DDLLMObsSpanDocumentIOTest.java @@ -76,10 +76,9 @@ void formatsRetrievalStringOutputAsDocument() throws IllegalAccessException { @Test void acceptsEmbeddingDocumentInputs() throws IllegalAccessException { DDLLMObsSpan llmObsSpan = newSpan(Tags.LLMOBS_EMBEDDING_SPAN_KIND); - List documents = - Arrays.asList( - LLMObs.Document.from("first input", "first.txt", "input-1", 0.5), - LLMObs.Document.from("second input")); + List documents = Arrays.asList( + LLMObs.Document.from("first input", "first.txt", "input-1", 0.5), + LLMObs.Document.from("second input")); try { llmObsSpan.annotateEmbeddingIO(documents, "embedding output"); @@ -95,10 +94,9 @@ void acceptsEmbeddingDocumentInputs() throws IllegalAccessException { @Test void acceptsRetrievalDocumentOutputs() throws IllegalAccessException { DDLLMObsSpan llmObsSpan = newSpan(Tags.LLMOBS_RETRIEVAL_SPAN_KIND); - List documents = - Arrays.asList( - LLMObs.Document.from("first output", "result.txt", "output-1", 0.95), - LLMObs.Document.from("second output")); + List documents = Arrays.asList( + LLMObs.Document.from("first output", "result.txt", "output-1", 0.95), + LLMObs.Document.from("second output")); try { llmObsSpan.annotateRetrievalIO("retrieval input", documents); diff --git a/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsEvalTest.java b/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsEvalTest.java index c293537a3f9..17130fe496d 100644 --- a/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsEvalTest.java +++ b/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsEvalTest.java @@ -26,10 +26,9 @@ */ class LLMObsEvalTest { - private static final JsonAdapter> JSON_READER = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + private static final JsonAdapter> JSON_READER = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); private static List serialize(LLMObsEval... evals) throws IOException { String body = LLMObsEval.batchSerializer().toJson(Arrays.asList(evals)); @@ -46,16 +45,14 @@ private static Map asMap(Object value) { @Test void testScoreEvalCarriesTheV1KeySetAndNothingElse() throws IOException { - List metrics = - serialize( - new LLMObsEval.Score( - "abc123", - 42L, - 1700000000000L, - "my-app", - "sentiment", - Collections.singletonMap("source", "web-ui"), - 0.75)); + List metrics = serialize(new LLMObsEval.Score( + "abc123", + 42L, + 1700000000000L, + "my-app", + "sentiment", + Collections.singletonMap("source", "web-ui"), + 0.75)); assertEquals(1, metrics.size()); Map metric = asMap(metrics.get(0)); @@ -82,10 +79,8 @@ void testScoreEvalCarriesTheV1KeySetAndNothingElse() throws IOException { @Test void testCategoricalEvalCarriesTheV1KeySet() throws IOException { - List metrics = - serialize( - new LLMObsEval.Categorical( - "abc123", 42L, 1700000000000L, "my-app", "tone", null, "positive")); + List metrics = serialize(new LLMObsEval.Categorical( + "abc123", 42L, 1700000000000L, "my-app", "tone", null, "positive")); Map metric = asMap(metrics.get(0)); @@ -99,11 +94,10 @@ void testCategoricalEvalCarriesTheV1KeySet() throws IOException { @Test void testABatchMixesScoreAndCategoricalInOneEnvelope() throws IOException { - List metrics = - serialize( - new LLMObsEval.Score("abc123", 42L, 1700000000000L, "my-app", "sentiment", null, 0.75), - new LLMObsEval.Categorical( - "abc123", 42L, 1700000000000L, "my-app", "tone", null, "positive")); + List metrics = serialize( + new LLMObsEval.Score("abc123", 42L, 1700000000000L, "my-app", "sentiment", null, 0.75), + new LLMObsEval.Categorical( + "abc123", 42L, 1700000000000L, "my-app", "tone", null, "positive")); assertEquals(2, metrics.size()); assertEquals(0.75, asMap(metrics.get(0)).get("score_value")); diff --git a/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsFeedbackEventTest.java b/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsFeedbackEventTest.java index ba31458cf5d..0e3b498f6c4 100644 --- a/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsFeedbackEventTest.java +++ b/dd-java-agent/agent-llmobs/src/test/java/datadog/trace/llmobs/domain/LLMObsFeedbackEventTest.java @@ -18,16 +18,14 @@ class LLMObsFeedbackEventTest { - private static final JsonAdapter> JSON_READER = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + private static final JsonAdapter> JSON_READER = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); private static Map serializeOne(LLMObs.Feedback feedback, String mlApp) throws IOException { - String body = - LLMObsFeedbackEvent.batchSerializer() - .toJson(Collections.singletonList(new LLMObsFeedbackEvent(feedback, mlApp))); + String body = LLMObsFeedbackEvent.batchSerializer() + .toJson(Collections.singletonList(new LLMObsFeedbackEvent(feedback, mlApp))); Map parsed = JSON_READER.fromJson(body); Map data = asMap(parsed.get("data")); @@ -45,16 +43,15 @@ private static Map asMap(Object value) { @Test void testFeedbackIsToldApartFromEvaluationsByEventKind() throws IOException { - Map event = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", "end_user") - .timestampMs(1700000000000L) - .build(), - "my-app"); + Map event = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", "end_user") + .timestampMs(1700000000000L) + .build(), + "my-app"); assertEquals("feedback", event.get("event_kind")); assertEquals("thumbs", event.get("label")); @@ -67,15 +64,14 @@ void testFeedbackIsToldApartFromEvaluationsByEventKind() throws IOException { @Test void testExactlyOneTargetIsEmitted() throws IOException { - Map bySessionId = - serializeOne( - LLMObs.Feedback.builder() - .sessionId("session-2") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(), - "my-app"); + Map bySessionId = serializeOne( + LLMObs.Feedback.builder() + .sessionId("session-2") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(), + "my-app"); assertEquals("session-2", bySessionId.get("session_id")); assertFalse(bySessionId.containsKey("span_id"), bySessionId.toString()); @@ -85,16 +81,15 @@ void testExactlyOneTargetIsEmitted() throws IOException { @Test void testJoinKeyTargetCarriesNoSpanNorTraceIdentifier() throws IOException { - Map event = - serializeOne( - LLMObs.Feedback.builder() - .feedbackJoinKey("incident-123") - .label("user_comment") - .textValue("The investigation missed the customer impact.") - .submitter("user-123", "end_user") - .assessment(LLMObs.Feedback.Assessment.FAIL) - .build(), - "incident-agent"); + Map event = serializeOne( + LLMObs.Feedback.builder() + .feedbackJoinKey("incident-123") + .label("user_comment") + .textValue("The investigation missed the customer impact.") + .submitter("user-123", "end_user") + .assessment(LLMObs.Feedback.Assessment.FAIL) + .build(), + "incident-agent"); assertEquals("incident-123", event.get("feedback_join_key")); assertEquals("text", event.get("metric_type")); @@ -106,80 +101,74 @@ void testJoinKeyTargetCarriesNoSpanNorTraceIdentifier() throws IOException { @Test void testExactlyOneValueKeyIsEmittedPerMetricType() throws IOException { - Map categorical = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("satisfaction") - .categoricalValue("satisfied") - .submitter("user-123", null) - .build(), - "my-app"); + Map categorical = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("satisfaction") + .categoricalValue("satisfied") + .submitter("user-123", null) + .build(), + "my-app"); assertEquals("satisfied", categorical.get("categorical_value")); assertFalse(categorical.containsKey("boolean_value"), categorical.toString()); assertFalse(categorical.containsKey("text_value"), categorical.toString()); - Map score = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("rating") - .scoreValue(0.75) - .submitter("user-123", null) - .build(), - "my-app"); + Map score = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("rating") + .scoreValue(0.75) + .submitter("user-123", null) + .build(), + "my-app"); assertEquals(0.75, score.get("score_value")); - Map json = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("details") - .jsonValue(Collections.singletonMap("missing", "customer impact")) - .submitter("user-123", null) - .build(), - "my-app"); + Map json = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("details") + .jsonValue(Collections.singletonMap("missing", "customer impact")) + .submitter("user-123", null) + .build(), + "my-app"); assertEquals(Collections.singletonMap("missing", "customer impact"), json.get("json_value")); } @Test void testSubmitterTypeIsOmittedWhenAbsent() throws IOException { - Map withType = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", "end_user") - .build(), - "my-app"); + Map withType = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", "end_user") + .build(), + "my-app"); assertEquals("user-123", asMap(withType.get("submitter")).get("id")); assertEquals("end_user", asMap(withType.get("submitter")).get("type")); - Map withoutType = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(), - "my-app"); + Map withoutType = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(), + "my-app"); assertEquals("user-123", asMap(withoutType.get("submitter")).get("id")); assertFalse(asMap(withoutType.get("submitter")).containsKey("type"), withoutType.toString()); } @Test void testAssessmentAndReasoningAreOmittedWhenAbsent() throws IOException { - Map event = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(), - "my-app"); + Map event = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(), + "my-app"); assertFalse(event.containsKey("assessment"), event.toString()); assertFalse(event.containsKey("reasoning"), event.toString()); @@ -187,32 +176,30 @@ void testAssessmentAndReasoningAreOmittedWhenAbsent() throws IOException { @Test void testReasoningIsEmittedWhenPresent() throws IOException { - Map event = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(false) - .submitter("user-123", null) - .reasoning("did not answer the question") - .build(), - "my-app"); + Map event = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(false) + .submitter("user-123", null) + .reasoning("did not answer the question") + .build(), + "my-app"); assertEquals("did not answer the question", event.get("reasoning")); } @Test void testTagsCarryTracerVersionAndMlAppAlongsideUserTags() throws IOException { - Map event = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .tag("source", "web-ui") - .build(), - "my-app"); + Map event = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .tag("source", "web-ui") + .build(), + "my-app"); List tags = (List) event.get("tags"); assertTrue(tags.contains("ddtrace.version:" + DDTraceApiInfo.VERSION), tags.toString()); @@ -222,15 +209,14 @@ void testTagsCarryTracerVersionAndMlAppAlongsideUserTags() throws IOException { @Test void testTagsAreEmittedEvenWithoutUserTags() throws IOException { - Map event = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(), - "my-app"); + Map event = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(), + "my-app"); assertEquals( Arrays.asList("ddtrace.version:" + DDTraceApiInfo.VERSION, "ml_app:my-app"), @@ -239,27 +225,22 @@ void testTagsAreEmittedEvenWithoutUserTags() throws IOException { @Test void testABatchIsSerializedAsSeveralMetricsInOneEnvelope() throws IOException { - LLMObs.Feedback thumbs = - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(); - LLMObs.Feedback comment = - LLMObs.Feedback.builder() - .spanId("123") - .label("comment") - .textValue("helpful") - .submitter("user-123", null) - .build(); - - String body = - LLMObsFeedbackEvent.batchSerializer() - .toJson( - Arrays.asList( - new LLMObsFeedbackEvent(thumbs, "my-app"), - new LLMObsFeedbackEvent(comment, "my-app"))); + LLMObs.Feedback thumbs = LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(); + LLMObs.Feedback comment = LLMObs.Feedback.builder() + .spanId("123") + .label("comment") + .textValue("helpful") + .submitter("user-123", null) + .build(); + + String body = LLMObsFeedbackEvent.batchSerializer() + .toJson(Arrays.asList( + new LLMObsFeedbackEvent(thumbs, "my-app"), new LLMObsFeedbackEvent(comment, "my-app"))); Map data = asMap(JSON_READER.fromJson(body).get("data")); List metrics = (List) asMap(data.get("attributes")).get("metrics"); @@ -271,15 +252,14 @@ void testABatchIsSerializedAsSeveralMetricsInOneEnvelope() throws IOException { @Test void testMlAppFallsBackToTheProvidedDefault() throws IOException { - Map event = - serializeOne( - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(), - "fallback-app"); + Map event = serializeOne( + LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(), + "fallback-app"); assertEquals("fallback-app", event.get("ml_app")); List tags = (List) event.get("tags"); diff --git a/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/simplelogger/SLCompatSettings.java b/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/simplelogger/SLCompatSettings.java index f3cc1a57a27..e26394f2292 100644 --- a/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/simplelogger/SLCompatSettings.java +++ b/dd-java-agent/agent-logging/src/main/java/datadog/trace/logging/simplelogger/SLCompatSettings.java @@ -141,15 +141,15 @@ public NewDTFormatter(String dateTimeFormat) { Class iClass = cl.loadClass("java.time.Instant"); Class zdtClass = cl.loadClass("java.time.ZonedDateTime"); Class zClass = cl.loadClass("java.time.ZoneId"); - this.dateTimeFormatter = - l.findStatic(fClass, "ofPattern", MethodType.methodType(fClass, String.class)) - .invoke(dateTimeFormat); - this.formatTo = - l.findVirtual( - fClass, "formatTo", MethodType.methodType(void.class, tClass, Appendable.class)); + this.dateTimeFormatter = l.findStatic( + fClass, "ofPattern", MethodType.methodType(fClass, String.class)) + .invoke(dateTimeFormat); + this.formatTo = l.findVirtual( + fClass, "formatTo", MethodType.methodType(void.class, tClass, Appendable.class)); this.instantOfEpochMilli = l.findStatic(iClass, "ofEpochMilli", MethodType.methodType(iClass, long.class)); - this.zoneId = l.findStatic(zClass, "systemDefault", MethodType.methodType(zClass)).invoke(); + this.zoneId = + l.findStatic(zClass, "systemDefault", MethodType.methodType(zClass)).invoke(); this.zdtOfInstant = l.findStatic(zdtClass, "ofInstant", MethodType.methodType(zdtClass, iClass, zClass)); } catch (Throwable t) { @@ -306,14 +306,12 @@ public SLCompatSettings( properties, fileProperties, Keys.SHOW_SHORT_LOG_NAME, Defaults.SHOW_SHORT_LOG_NAME), getBoolean(properties, fileProperties, Keys.SHOW_LOG_NAME, Defaults.SHOW_LOG_NAME), getBoolean(properties, fileProperties, Keys.SHOW_THREAD_NAME, Defaults.SHOW_THREAD_NAME), - DTFormatter.create( - getString( - properties, fileProperties, Keys.DATE_TIME_FORMAT, Defaults.DATE_TIME_FORMAT)), + DTFormatter.create(getString( + properties, fileProperties, Keys.DATE_TIME_FORMAT, Defaults.DATE_TIME_FORMAT)), getBoolean(properties, fileProperties, Keys.SHOW_DATE_TIME, Defaults.SHOW_DATE_TIME), getBoolean(properties, fileProperties, Keys.JSON_ENABLED, Defaults.JSON_ENABLED), - LogLevel.fromString( - getString( - properties, fileProperties, Keys.DEFAULT_LOG_LEVEL, Defaults.DEFAULT_LOG_LEVEL)), + LogLevel.fromString(getString( + properties, fileProperties, Keys.DEFAULT_LOG_LEVEL, Defaults.DEFAULT_LOG_LEVEL)), getBoolean(properties, fileProperties, Keys.EMBED_EXCEPTION, Defaults.EMBED_EXCEPTION)); } diff --git a/dd-java-agent/agent-logs-intake/src/main/java/datadog/trace/logging/intake/LogsWriterImpl.java b/dd-java-agent/agent-logs-intake/src/main/java/datadog/trace/logging/intake/LogsWriterImpl.java index 6d88d0e0a59..bb450581977 100644 --- a/dd-java-agent/agent-logs-intake/src/main/java/datadog/trace/logging/intake/LogsWriterImpl.java +++ b/dd-java-agent/agent-logs-intake/src/main/java/datadog/trace/logging/intake/LogsWriterImpl.java @@ -42,9 +42,8 @@ public LogsWriterImpl(Config config, BackendApiFactory apiFactory, Intake intake commonTags.put("hostname", config.getHostName()); messageQueue = new ArrayBlockingQueue<>(config.getAgentlessLogSubmissionQueueSize()); - messagePollingThread = - AgentThreadFactory.newAgentThread( - AgentThreadFactory.AgentThread.LOGS_INTAKE, this::logPollingLoop); + messagePollingThread = AgentThreadFactory.newAgentThread( + AgentThreadFactory.AgentThread.LOGS_INTAKE, this::logPollingLoop); } @Override diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common/OtelInstrumentationScope.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common/OtelInstrumentationScope.java index 28e912d8a54..84bd42f7a7c 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common/OtelInstrumentationScope.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common/OtelInstrumentationScope.java @@ -8,8 +8,12 @@ public final class OtelInstrumentationScope implements Comparable { private final UTF8BytesString scopeName; - @Nullable private final UTF8BytesString scopeVersion; - @Nullable private final UTF8BytesString schemaUrl; + + @Nullable + private final UTF8BytesString scopeVersion; + + @Nullable + private final UTF8BytesString schemaUrl; public OtelInstrumentationScope( String scopeName, @Nullable String scopeVersion, @Nullable String schemaUrl) { diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentBuilder.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentBuilder.java index 80791e9007a..4e5d39fe383 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentBuilder.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentBuilder.java @@ -11,8 +11,11 @@ public final class OtelInstrumentBuilder { private final OtelInstrumentType instrumentType; private final boolean longValues; - @Nullable private String description; - @Nullable private String unit; + @Nullable + private String description; + + @Nullable + private String unit; /** * Starts building an instrument of long values with the given name and type. diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentDescriptor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentDescriptor.java index 9c77db43bbf..71584f7eff1 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentDescriptor.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentDescriptor.java @@ -10,8 +10,13 @@ public final class OtelInstrumentDescriptor { private final UTF8BytesString instrumentName; private final OtelInstrumentType instrumentType; private final boolean longValues; - @Nullable private final UTF8BytesString description; - @Nullable private final UTF8BytesString unit; + + @Nullable + private final UTF8BytesString description; + + @Nullable + private final UTF8BytesString unit; + private int hash; public OtelInstrumentDescriptor( diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java index 18c4e379e96..2fd0ac3b5a3 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java @@ -50,9 +50,8 @@ public boolean unregisterObservable( } public void collectMetrics(OtlpMetricsVisitor visitor) { - scopedStorage.forEach( - (scope, storage) -> - collectScopedMetrics(scope, storage, visitor.visitScopedMetrics(scope))); + scopedStorage.forEach((scope, storage) -> + collectScopedMetrics(scope, storage, visitor.visitScopedMetrics(scope))); } private void collectScopedMetrics( diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otlp/logs/OtlpLogRecord.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otlp/logs/OtlpLogRecord.java index c4aa16c5461..d58c126478a 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otlp/logs/OtlpLogRecord.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otlp/logs/OtlpLogRecord.java @@ -12,11 +12,20 @@ public final class OtlpLogRecord { public final long timestampNanos; public final long observedNanos; public final int severityNumber; - @Nullable public final String severityText; - @Nullable public final String body; + + @Nullable + public final String severityText; + + @Nullable + public final String body; + public final Map attributes; - @Nullable public final AgentSpanContext spanContext; - @Nullable public final String eventName; + + @Nullable + public final AgentSpanContext spanContext; + + @Nullable + public final String eventName; public OtlpLogRecord( OtelInstrumentationScope instrumentationScope, diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/AgentTextMapPropagator.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/AgentTextMapPropagator.java index ae7d708b5e4..4fc05676765 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/AgentTextMapPropagator.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/AgentTextMapPropagator.java @@ -41,16 +41,12 @@ public Context extract(Context context, @Nullable C carrier, TextMapGetter { - for (String key : getter.keys(carrier1)) { - classifier.accept(key, getter.get(carrier1, key)); - } - }); + datadog.context.Context extracted = defaultPropagator() + .extract(convertContext(context), carrier, (carrier1, classifier) -> { + for (String key : getter.keys(carrier1)) { + classifier.accept(key, getter.get(carrier1, key)); + } + }); return new OtelContext(extracted); } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/TraceStateHelper.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/TraceStateHelper.java index b0e2c135936..94a40bfd415 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/TraceStateHelper.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/context/propagation/TraceStateHelper.java @@ -50,13 +50,12 @@ public static String encodeHeader(TraceState traceState) { return ""; } StringBuilder builder = new StringBuilder(TRACESTATE_MAX_SIZE); - traceState.forEach( - (key, value) -> { - if (builder.length() != 0) { - builder.append(TRACESTATE_ENTRY_DELIMITER); - } - builder.append(key).append(TRACESTATE_KEY_VALUE_DELIMITER).append(value); - }); + traceState.forEach((key, value) -> { + if (builder.length() != 0) { + builder.append(TRACESTATE_ENTRY_DELIMITER); + } + builder.append(key).append(TRACESTATE_KEY_VALUE_DELIMITER).append(value); + }); return builder.toString(); } } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLogRecordBuilder.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLogRecordBuilder.java index 81cfb7c875e..0d8b61aec51 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLogRecordBuilder.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLogRecordBuilder.java @@ -24,7 +24,8 @@ @ParametersAreNonnullByDefault final class OtelLogRecordBuilder implements LogRecordBuilder { - @VisibleForTesting static TimeSource TIME_SOURCE = SystemTimeSource.INSTANCE; + @VisibleForTesting + static TimeSource TIME_SOURCE = SystemTimeSource.INSTANCE; private static final AttributeKey EXCEPTION_TYPE_KEY = stringKey("exception.type"); private static final AttributeKey EXCEPTION_MESSAGE_KEY = stringKey("exception.message"); @@ -34,11 +35,21 @@ final class OtelLogRecordBuilder implements LogRecordBuilder { private long timestampNanos; private long observedNanos; private Severity severity = Severity.UNDEFINED_SEVERITY_NUMBER; - @Nullable private String severityText; - @Nullable private String body; - @Nullable private Map, Object> attributes; - @Nullable private Context context; - @Nullable private String eventName; + + @Nullable + private String severityText; + + @Nullable + private String body; + + @Nullable + private Map, Object> attributes; + + @Nullable + private Context context; + + @Nullable + private String eventName; private boolean attributesEmitted; @@ -148,17 +159,16 @@ public void emit() { } Context context = this.context != null ? this.context : Context.current(); if (logger.isEnabled(severity, context)) { - OtelLogRecordProcessor.INSTANCE.addLog( - new OtlpLogRecord( - logger.instrumentationScope, - timestampNanos, - observedNanos != 0 ? observedNanos : TIME_SOURCE.getCurrentTimeNanos(), - severity.getSeverityNumber(), - severityText, - body, - attributes != null ? attributes : Collections.emptyMap(), - extract(context), - eventName)); + OtelLogRecordProcessor.INSTANCE.addLog(new OtlpLogRecord( + logger.instrumentationScope, + timestampNanos, + observedNanos != 0 ? observedNanos : TIME_SOURCE.getCurrentTimeNanos(), + severity.getSeverityNumber(), + severityText, + body, + attributes != null ? attributes : Collections.emptyMap(), + extract(context), + eventName)); attributesEmitted = true; } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerBuilder.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerBuilder.java index b0b9da1f90e..7d7c6847693 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerBuilder.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerBuilder.java @@ -10,8 +10,12 @@ final class OtelLoggerBuilder implements LoggerBuilder { private final OtelLoggerProvider loggerProvider; private final String instrumentationScopeName; - @Nullable private String instrumentationScopeVersion; - @Nullable private String schemaUrl; + + @Nullable + private String instrumentationScopeVersion; + + @Nullable + private String schemaUrl; OtelLoggerBuilder(OtelLoggerProvider loggerProvider, String instrumentationScopeName) { this.loggerProvider = loggerProvider; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerProvider.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerProvider.java index 45fc6924353..dcc6bff30fa 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerProvider.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/logs/OtelLoggerProvider.java @@ -28,9 +28,8 @@ private OtelLoggerProvider() { // register attribute reader for class-loader where this provider is being used/injected OtelLogRecordProcessor.registerAttributeReader( AttributeKey.class.getClassLoader(), - (attributes, visitor) -> - ((Map, ?>) attributes) - .forEach((a, v) -> visitor.visitAttribute(a.getType().ordinal(), a.getKey(), v))); + (attributes, visitor) -> ((Map, ?>) attributes) + .forEach((a, v) -> visitor.visitAttribute(a.getType().ordinal(), a.getKey(), v))); } @Override diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java index c0e950917f7..171acb63515 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java @@ -56,10 +56,9 @@ public void record(double value, Attributes attributes, Context unused) { } static final class Builder implements DoubleHistogramBuilder { - private static final List DEFAULT_BOUNDARIES = - asList( - 0d, 5d, 10d, 25d, 50d, 75d, 100d, 250d, 500d, 750d, 1_000d, 2_500d, 5_000d, 7_500d, - 10_000d); + private static final List DEFAULT_BOUNDARIES = asList( + 0d, 5d, 10d, 25d, 50d, 75d, 100d, 250d, 500d, 750d, 1_000d, 2_500d, 5_000d, 7_500d, + 10_000d); private final OtelMeter meter; private final OtelInstrumentBuilder builder; @@ -102,9 +101,8 @@ public LongHistogramBuilder ofLongs() { @Override public DoubleHistogram build() { - return new OtelDoubleHistogram( - meter.registerStorage( - builder, descriptor -> newHistogramStorage(descriptor, bucketBoundaries))); + return new OtelDoubleHistogram(meter.registerStorage( + builder, descriptor -> newHistogramStorage(descriptor, bucketBoundaries))); } static List validateBoundaries(List boundaries) { @@ -123,11 +121,8 @@ static List validateBoundaries(List boundaries) { throw new IllegalArgumentException("invalid bucket boundary: NaN"); } if (previousBoundary != null && previousBoundary >= boundary) { - throw new IllegalArgumentException( - "Bucket boundaries must be in increasing order: " - + previousBoundary - + " >= " - + boundary); + throw new IllegalArgumentException("Bucket boundaries must be in increasing order: " + + previousBoundary + " >= " + boundary); } previousBoundary = boundary; } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java index 6543748ee26..210876f073e 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java @@ -91,9 +91,8 @@ public LongHistogramBuilder setExplicitBucketBoundariesAdvice(List bucketB @Override public LongHistogram build() { - return new OtelLongHistogram( - meter.registerStorage( - builder, descriptor -> newHistogramStorage(descriptor, bucketBoundaries))); + return new OtelLongHistogram(meter.registerStorage( + builder, descriptor -> newHistogramStorage(descriptor, bucketBoundaries))); } } } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java index 1befb5a1b6b..130981408c3 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java @@ -103,9 +103,8 @@ OtelMetricStorage registerStorage( OtelObservableMeasurement registerObservableStorage( OtelInstrumentBuilder builder, Function storageFactory) { - return new OtelObservableMeasurement( - OtelMetricRegistry.INSTANCE.registerStorage( - instrumentationScope, builder.observableDescriptor(), storageFactory)); + return new OtelObservableMeasurement(OtelMetricRegistry.INSTANCE.registerStorage( + instrumentationScope, builder.observableDescriptor(), storageFactory)); } OtelObservableCallback registerObservableCallback(Consumer callback, M measurement) { @@ -125,7 +124,8 @@ boolean unregisterObservableCallback(OtelObservableCallback observable) { } private static boolean validInstrumentName(@Nullable String instrumentName) { - if (instrumentName != null && VALID_INSTRUMENT_NAME_PATTERN.matcher(instrumentName).matches()) { + if (instrumentName != null + && VALID_INSTRUMENT_NAME_PATTERN.matcher(instrumentName).matches()) { return true; } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterBuilder.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterBuilder.java index 6ce632e24d3..02264bdf52c 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterBuilder.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterBuilder.java @@ -10,8 +10,12 @@ final class OtelMeterBuilder implements MeterBuilder { private final OtelMeterProvider meterProvider; private final String instrumentationScopeName; - @Nullable private String instrumentationScopeVersion; - @Nullable private String schemaUrl; + + @Nullable + private String instrumentationScopeVersion; + + @Nullable + private String schemaUrl; OtelMeterBuilder(OtelMeterProvider meterProvider, String instrumentationScopeName) { this.meterProvider = meterProvider; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java index 245a5e19a1f..9df8ff67913 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java @@ -28,9 +28,8 @@ private OtelMeterProvider() { // register attribute reader for class-loader where this provider is being used/injected OtelMetricStorage.registerAttributeReader( Attributes.class.getClassLoader(), - (attributes, visitor) -> - ((Attributes) attributes) - .forEach((a, v) -> visitor.visitAttribute(a.getType().ordinal(), a.getKey(), v))); + (attributes, visitor) -> ((Attributes) attributes) + .forEach((a, v) -> visitor.visitAttribute(a.getType().ordinal(), a.getKey(), v))); } @Override diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java index a328a63140f..5222cdd5c13 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java @@ -258,40 +258,39 @@ public static SpanAttributes convertAttributes(Attributes attributes) { return SpanAttributes.EMPTY; } SpanAttributes.Builder builder = SpanAttributes.builder(); - attributes.forEach( - (attributeKey, value) -> { - String key = attributeKey.getKey(); - switch (attributeKey.getType()) { - case STRING: - builder.put(key, (String) value); - break; - case BOOLEAN: - builder.put(key, (boolean) value); - break; - case LONG: - builder.put(key, (long) value); - break; - case DOUBLE: - builder.put(key, (double) value); - break; - case STRING_ARRAY: - //noinspection unchecked - builder.putStringArray(key, (List) value); - break; - case BOOLEAN_ARRAY: - //noinspection unchecked - builder.putBooleanArray(key, (List) value); - break; - case LONG_ARRAY: - //noinspection unchecked - builder.putLongArray(key, (List) value); - break; - case DOUBLE_ARRAY: - //noinspection unchecked - builder.putDoubleArray(key, (List) value); - break; - } - }); + attributes.forEach((attributeKey, value) -> { + String key = attributeKey.getKey(); + switch (attributeKey.getType()) { + case STRING: + builder.put(key, (String) value); + break; + case BOOLEAN: + builder.put(key, (boolean) value); + break; + case LONG: + builder.put(key, (long) value); + break; + case DOUBLE: + builder.put(key, (double) value); + break; + case STRING_ARRAY: + //noinspection unchecked + builder.putStringArray(key, (List) value); + break; + case BOOLEAN_ARRAY: + //noinspection unchecked + builder.putBooleanArray(key, (List) value); + break; + case LONG_ARRAY: + //noinspection unchecked + builder.putLongArray(key, (List) value); + break; + case DOUBLE_ARRAY: + //noinspection unchecked + builder.putDoubleArray(key, (List) value); + break; + } + }); return builder.build(); } } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpanEvent.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpanEvent.java index a49cab4b877..2dfef71e957 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpanEvent.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpanEvent.java @@ -171,9 +171,8 @@ public static void setTimeSource(TimeSource newTimeSource) { } public String toJson() { - StringBuilder builder = - new StringBuilder( - "{\"time_unix_nano\":" + this.timestamp + ",\"name\":\"" + this.name + "\""); + StringBuilder builder = new StringBuilder( + "{\"time_unix_nano\":" + this.timestamp + ",\"name\":\"" + this.name + "\""); if (!this.attributes.isEmpty()) { builder.append(",\"attributes\":").append(this.attributes); } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java index 2db018771e5..76743a7ff42 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java @@ -10,8 +10,12 @@ final class OtelTracerBuilder implements TracerBuilder { private final OtelTracerProvider tracerProvider; private final String instrumentationScopeName; - @Nullable private String instrumentationScopeVersion; - @Nullable private String schemaUrl; + + @Nullable + private String instrumentationScopeVersion; + + @Nullable + private String schemaUrl; OtelTracerBuilder(OtelTracerProvider tracerProvider, String instrumentationScopeName) { this.tracerProvider = tracerProvider; diff --git a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelExtensionHandler.java b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelExtensionHandler.java index 4411a342c40..56e7a29ea13 100644 --- a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelExtensionHandler.java +++ b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelExtensionHandler.java @@ -73,13 +73,12 @@ protected byte[] doMapBytecode(String unused) { null, "java/lang/Object", null); - MethodVisitor mv = - cw.visitMethod( - Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, - "create", - "()L" + REFERENCE_MATCHER_CLASS + ";", - null, - null); + MethodVisitor mv = cw.visitMethod( + Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, + "create", + "()L" + REFERENCE_MATCHER_CLASS + ";", + null, + null); mv.visitCode(); mv.visitTypeInsn(Opcodes.NEW, REFERENCE_MATCHER_CLASS); mv.visitInsn(Opcodes.DUP); diff --git a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java index 5f1df5d050a..2665da338fc 100644 --- a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java +++ b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java @@ -20,9 +20,8 @@ /** Maps OpenTelemetry instrumentations to use the Datadog {@link InstrumenterModule} API. */ public final class OtelInstrumentationMapper extends ClassRemapper { - private static final Set UNSUPPORTED_TYPES = - Collections.singleton( - "io/opentelemetry/javaagent/tooling/muzzle/InstrumentationModuleMuzzle"); + private static final Set UNSUPPORTED_TYPES = Collections.singleton( + "io/opentelemetry/javaagent/tooling/muzzle/InstrumentationModuleMuzzle"); public OtelInstrumentationMapper(ClassVisitor classVisitor) { super(classVisitor, Renamer.INSTANCE); diff --git a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumenterModule.java b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumenterModule.java index 52f74215432..9ee34249891 100644 --- a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumenterModule.java +++ b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumenterModule.java @@ -81,14 +81,13 @@ public List getAdditionalHelperClassNames() { @Override public Map contextStore() { Map virtualFields = new HashMap<>(); - registerMuzzleVirtualFields( - new VirtualFieldBuilder() { - @Override - public VirtualFieldBuilder register(String typeName, String fieldTypeName) { - virtualFields.put(typeName, fieldTypeName); - return this; - } - }); + registerMuzzleVirtualFields(new VirtualFieldBuilder() { + @Override + public VirtualFieldBuilder register(String typeName, String fieldTypeName) { + virtualFields.put(typeName, fieldTypeName); + return this; + } + }); return virtualFields; } diff --git a/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerControllerTest.java b/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerControllerTest.java index 20bb760a357..4f67983e711 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerControllerTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerControllerTest.java @@ -26,8 +26,9 @@ public void testCreateContinuousRecording() throws Exception { ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); DatadogProfilerController controller = new DatadogProfilerController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertEquals("ddprof", data.getName()); } } diff --git a/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerOngoingRecordingTest.java b/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerOngoingRecordingTest.java index a3032c7beb5..55459983489 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerOngoingRecordingTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-ddprof/src/test/java/com/datadog/profiling/controller/ddprof/DatadogProfilerOngoingRecordingTest.java @@ -25,8 +25,11 @@ public class DatadogProfilerOngoingRecordingTest { private static final String TEST_NAME = "recording name"; - @Mock private Instant start; - @Mock private Instant end; + @Mock + private Instant start; + + @Mock + private Instant end; private DatadogProfilerOngoingRecording ongoingRecording; diff --git a/dd-java-agent/agent-profiling/profiling-controller-jfr/implementation/src/main/java11/com/datadog/profiling/controller/jfr/JPMSJFRAccess.java b/dd-java-agent/agent-profiling/profiling-controller-jfr/implementation/src/main/java11/com/datadog/profiling/controller/jfr/JPMSJFRAccess.java index 927a337b667..e01584bc9a2 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-jfr/implementation/src/main/java11/com/datadog/profiling/controller/jfr/JPMSJFRAccess.java +++ b/dd-java-agent/agent-profiling/profiling-controller-jfr/implementation/src/main/java11/com/datadog/profiling/controller/jfr/JPMSJFRAccess.java @@ -143,10 +143,9 @@ public boolean setStackDepth(int depth) { @Override public boolean setBaseLocation(String location) { try { - Object safePath = - Path.class.isAssignableFrom(safePathClass) - ? Paths.get(location) - : safePathClass.getConstructor(Path.class).newInstance(Paths.get(location)); + Object safePath = Path.class.isAssignableFrom(safePathClass) + ? Paths.get(location) + : safePathClass.getConstructor(Path.class).newInstance(Paths.get(location)); setRepositoryBaseMH.invoke(safePath); return true; } catch (Throwable throwable) { diff --git a/dd-java-agent/agent-profiling/profiling-controller-jfr/src/main/java/com/datadog/profiling/controller/jfr/JFRAccess.java b/dd-java-agent/agent-profiling/profiling-controller-jfr/src/main/java/com/datadog/profiling/controller/jfr/JFRAccess.java index 92f51a009ef..f0a18e415ef 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-jfr/src/main/java/com/datadog/profiling/controller/jfr/JFRAccess.java +++ b/dd-java-agent/agent-profiling/profiling-controller-jfr/src/main/java/com/datadog/profiling/controller/jfr/JFRAccess.java @@ -16,18 +16,17 @@ public abstract class JFRAccess implements Timestamper { private static final Logger log = LoggerFactory.getLogger(JFRAccess.class); /** No-op JFR access implementation. */ - public static final JFRAccess NOOP = - new JFRAccess() { - @Override - public boolean setStackDepth(int depth) { - return false; - } + public static final JFRAccess NOOP = new JFRAccess() { + @Override + public boolean setStackDepth(int depth) { + return false; + } - @Override - public boolean setBaseLocation(String location) { - return false; - } - }; + @Override + public boolean setBaseLocation(String location) { + return false; + } + }; /** * Factory for JFR access.
diff --git a/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/JfpUtilsTest.java b/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/JfpUtilsTest.java index 9e4e7c4e5b9..cd771f4c4b5 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/JfpUtilsTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/JfpUtilsTest.java @@ -61,11 +61,8 @@ public void testLoadingConfigSafepoints(String safepoints) throws IOException { assertEquals("true", config.get("jdk.ExecuteVMOperation#enabled")); config .keySet() - .forEach( - key -> - assertTrue( - key.startsWith("jdk.Safepoint") - || key.equals("jdk.ExecuteVMOperation#enabled"))); + .forEach(key -> assertTrue( + key.startsWith("jdk.Safepoint") || key.equals("jdk.ExecuteVMOperation#enabled"))); } @ParameterizedTest diff --git a/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/TestJfrRecorder.java b/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/TestJfrRecorder.java index cbf90124a2e..fa8352866c7 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/TestJfrRecorder.java +++ b/dd-java-agent/agent-profiling/profiling-controller-jfr/src/test/java/com/datadog/profiling/controller/jfr/TestJfrRecorder.java @@ -47,64 +47,58 @@ public final Type registerEventType(Class eventType) { * JMC implementation is slightly mishandling some event types - not using the special call * and rather registering all implicit fields by hand. */ - return recording.registerType( - getEventName(eventType), - "jdk.jfr.Event", - b -> { - Field[] fields = eventType.getDeclaredFields(); - for (Field f : fields) { - if (Modifier.isTransient(f.getModifiers()) || Modifier.isStatic(f.getModifiers())) { - // skip static and transient fields - continue; - } - // Add field definition - Type fieldType = types.getType(f.getType().getName()); - if (fieldType != null) { - java.lang.annotation.Annotation[] as = f.getAnnotations(); - String fieldName = getFieldName(f); - if (fieldName.equals("startTime") - || fieldName.equals("eventThread") - || fieldName.equals("stackTrace")) { - // built-in fields; skip - continue; - } - TypedFieldBuilder fieldTypeBuilder = types.fieldBuilder(fieldName, fieldType); - - for (java.lang.annotation.Annotation a : as) { - AnnotationValueObject val = processAnnotation(types, a); - if (val != null) { - fieldTypeBuilder = - val.annotationValue != null - ? fieldTypeBuilder.addAnnotation(val.annotationType, val.annotationValue) - : fieldTypeBuilder.addAnnotation(val.annotationType); - } - } - b.addField(fieldTypeBuilder.build()); - } + return recording.registerType(getEventName(eventType), "jdk.jfr.Event", b -> { + Field[] fields = eventType.getDeclaredFields(); + for (Field f : fields) { + if (Modifier.isTransient(f.getModifiers()) || Modifier.isStatic(f.getModifiers())) { + // skip static and transient fields + continue; + } + // Add field definition + Type fieldType = types.getType(f.getType().getName()); + if (fieldType != null) { + java.lang.annotation.Annotation[] as = f.getAnnotations(); + String fieldName = getFieldName(f); + if (fieldName.equals("startTime") + || fieldName.equals("eventThread") + || fieldName.equals("stackTrace")) { + // built-in fields; skip + continue; } - // force 'startTime' field - b.addField( - "startTime", - Types.Builtin.LONG, - field -> - field.addAnnotation(Types.JDK.ANNOTATION_TIMESTAMP, "NANOSECONDS_SINCE_EPOCH")); - // force 'eventThread' field - b.addField("eventThread", Types.JDK.THREAD); - - // force 'stackTrace' field if the event is collecting stacktraces - if (hasStackTrace(eventType)) { - b.addField("stackTrace", Types.JDK.STACK_TRACE); - } - for (java.lang.annotation.Annotation a : eventType.getAnnotations()) { + TypedFieldBuilder fieldTypeBuilder = types.fieldBuilder(fieldName, fieldType); + + for (java.lang.annotation.Annotation a : as) { AnnotationValueObject val = processAnnotation(types, a); if (val != null) { - b = - val.annotationValue != null - ? b.addAnnotation(val.annotationType, val.annotationValue) - : b.addAnnotation(val.annotationType); + fieldTypeBuilder = val.annotationValue != null + ? fieldTypeBuilder.addAnnotation(val.annotationType, val.annotationValue) + : fieldTypeBuilder.addAnnotation(val.annotationType); } } - }); + b.addField(fieldTypeBuilder.build()); + } + } + // force 'startTime' field + b.addField( + "startTime", + Types.Builtin.LONG, + field -> field.addAnnotation(Types.JDK.ANNOTATION_TIMESTAMP, "NANOSECONDS_SINCE_EPOCH")); + // force 'eventThread' field + b.addField("eventThread", Types.JDK.THREAD); + + // force 'stackTrace' field if the event is collecting stacktraces + if (hasStackTrace(eventType)) { + b.addField("stackTrace", Types.JDK.STACK_TRACE); + } + for (java.lang.annotation.Annotation a : eventType.getAnnotations()) { + AnnotationValueObject val = processAnnotation(types, a); + if (val != null) { + b = val.annotationValue != null + ? b.addAnnotation(val.annotationType, val.annotationValue) + : b.addAnnotation(val.annotationType); + } + } + }); } private AnnotationValueObject processAnnotation( @@ -138,14 +132,11 @@ private AnnotationValueObject processAnnotation( String annotationValue = value; String annotationTypeName = annotation.annotationType().getTypeName(); Type annotationType = - types.getOrAdd( - annotationTypeName, - Annotation.ANNOTATION_SUPER_TYPE_NAME, - builder -> { - if (annotationValue != null) { - builder.addField("value", Types.Builtin.STRING); - } - }); + types.getOrAdd(annotationTypeName, Annotation.ANNOTATION_SUPER_TYPE_NAME, builder -> { + if (annotationValue != null) { + builder.addField("value", Types.Builtin.STRING); + } + }); return new AnnotationValueObject(annotationType, annotationValue); } @@ -200,143 +191,124 @@ private TypedValue createEventValue(Event event) { Type eventType = recording.getType(getEventName(event.getClass())); Field[] fields = event.getClass().getDeclaredFields(); - TypedValue typedValue = - eventType.asValue( - access -> { - boolean startTimeWritten = false; - boolean eventThreadWritten = false; - boolean stackTraceWritten = false; - for (Field f : fields) { - f.setAccessible(true); - - /* - * From jdk.jfr.Event.java: Supported field types are the Java primitives: {@code - * boolean}, {@code char}, {@code byte}, {@code short}, {@code int}, {@code long}, - * {@code float}, and {@code double}. Supported reference types are: {@code String}, - * {@code Thread} and {@code Class}. Arrays, enums, and other reference types are - * silently ignored and not included. Fields that are of the supported types can be - * excluded by using the transient modifier. Static fields, even of the supported - * types, are not included. - */ - // Transient and static fields are excluded - if (Modifier.isTransient(f.getModifiers()) || Modifier.isStatic(f.getModifiers())) { - continue; - } - - String fldName = getFieldName(f); - if (fldName.equals("startTime")) { - startTimeWritten = true; - } else if (fldName.equals("eventThread")) { - eventThreadWritten = true; - } else if (fldName.equals("stackTrace")) { - stackTraceWritten = true; - } - try { - switch (f.getType().getName()) { - case "byte": - { - byte byteValue = f.getByte(event); - access.putField(fldName, byteValue); - break; - } - case "char": - { - char charValue = f.getChar(event); - access.putField(fldName, charValue); - break; - } - case "short": - { - short shortValue = f.getShort(event); - access.putField(fldName, shortValue); - break; - } - case "int": - { - int intValue = f.getInt(event); - access.putField(fldName, intValue); - break; - } - case "long": - { - long longValue = f.getLong(event); - access.putField(fldName, longValue); - break; - } - case "float": - { - float floatValue = f.getFloat(event); - access.putField(fldName, floatValue); - break; - } - case "double": - { - double doubleValue = f.getDouble(event); - access.putField(fldName, doubleValue); - break; - } - case "boolean": - { - boolean booleanValue = f.getBoolean(event); - access.putField(fldName, booleanValue); - break; - } - case "java.lang.String": - { - String stringValue = (String) f.get(event); - access.putField(fldName, stringValue); - break; - } - case "java.lang.Class": - { - Class clz = (Class) f.get(event); - access.putField( - fldName, - fldAccess -> { - fldAccess - .putField( - "name", - nameAccess -> { - nameAccess.putField("string", clz.getSimpleName()); - }) - .putField("package", clz.getPackage().getName()) - .putField("modifiers", clz.getModifiers()); - }); - break; - } - case "java.lang.Thread": - { - Thread thrd = (Thread) f.get(event); - putThreadField(access, fldName, thrd); - break; - } - case "java.lang.StackTraceElement[]": - { - StackTraceElement[] stackTrace = (StackTraceElement[]) f.get(event); - putStackTraceField(access, fldName, stackTrace); - break; - } - default: - { - // System.err.println("Cannot write type:" + f.getType().getName()); - } - } - } catch (IllegalAccessException e) { - throw new RuntimeException(); - } - } - if (!startTimeWritten) { - // default to 0 - access.putField("startTime", 0L); - } - if (!eventThreadWritten) { - // default to current thread - putThreadField(access, "eventThread", Thread.currentThread()); - } - if (!stackTraceWritten && hasStackTrace(event.getClass())) { - putStackTraceField(access, "stackTrace", Thread.currentThread().getStackTrace()); - } - }); + TypedValue typedValue = eventType.asValue(access -> { + boolean startTimeWritten = false; + boolean eventThreadWritten = false; + boolean stackTraceWritten = false; + for (Field f : fields) { + f.setAccessible(true); + + /* + * From jdk.jfr.Event.java: Supported field types are the Java primitives: {@code + * boolean}, {@code char}, {@code byte}, {@code short}, {@code int}, {@code long}, + * {@code float}, and {@code double}. Supported reference types are: {@code String}, + * {@code Thread} and {@code Class}. Arrays, enums, and other reference types are + * silently ignored and not included. Fields that are of the supported types can be + * excluded by using the transient modifier. Static fields, even of the supported + * types, are not included. + */ + // Transient and static fields are excluded + if (Modifier.isTransient(f.getModifiers()) || Modifier.isStatic(f.getModifiers())) { + continue; + } + + String fldName = getFieldName(f); + if (fldName.equals("startTime")) { + startTimeWritten = true; + } else if (fldName.equals("eventThread")) { + eventThreadWritten = true; + } else if (fldName.equals("stackTrace")) { + stackTraceWritten = true; + } + try { + switch (f.getType().getName()) { + case "byte": { + byte byteValue = f.getByte(event); + access.putField(fldName, byteValue); + break; + } + case "char": { + char charValue = f.getChar(event); + access.putField(fldName, charValue); + break; + } + case "short": { + short shortValue = f.getShort(event); + access.putField(fldName, shortValue); + break; + } + case "int": { + int intValue = f.getInt(event); + access.putField(fldName, intValue); + break; + } + case "long": { + long longValue = f.getLong(event); + access.putField(fldName, longValue); + break; + } + case "float": { + float floatValue = f.getFloat(event); + access.putField(fldName, floatValue); + break; + } + case "double": { + double doubleValue = f.getDouble(event); + access.putField(fldName, doubleValue); + break; + } + case "boolean": { + boolean booleanValue = f.getBoolean(event); + access.putField(fldName, booleanValue); + break; + } + case "java.lang.String": { + String stringValue = (String) f.get(event); + access.putField(fldName, stringValue); + break; + } + case "java.lang.Class": { + Class clz = (Class) f.get(event); + access.putField(fldName, fldAccess -> { + fldAccess + .putField("name", nameAccess -> { + nameAccess.putField("string", clz.getSimpleName()); + }) + .putField("package", clz.getPackage().getName()) + .putField("modifiers", clz.getModifiers()); + }); + break; + } + case "java.lang.Thread": { + Thread thrd = (Thread) f.get(event); + putThreadField(access, fldName, thrd); + break; + } + case "java.lang.StackTraceElement[]": { + StackTraceElement[] stackTrace = (StackTraceElement[]) f.get(event); + putStackTraceField(access, fldName, stackTrace); + break; + } + default: { + // System.err.println("Cannot write type:" + f.getType().getName()); + } + } + } catch (IllegalAccessException e) { + throw new RuntimeException(); + } + } + if (!startTimeWritten) { + // default to 0 + access.putField("startTime", 0L); + } + if (!eventThreadWritten) { + // default to current thread + putThreadField(access, "eventThread", Thread.currentThread()); + } + if (!stackTraceWritten && hasStackTrace(event.getClass())) { + putStackTraceField(access, "stackTrace", Thread.currentThread().getStackTrace()); + } + }); return typedValue; } @@ -371,14 +343,12 @@ private boolean isJfrAnnotation(java.lang.annotation.Annotation target) { } private void putThreadField(TypedValueBuilder access, String fldName, Thread thread) { - access.putField( - fldName, - fldAccess -> { - fldAccess - .putField("javaThreadId", thread.getId()) - .putField("osThreadId", thread.getId()) - .putField("javaName", thread.getName()); - }); + access.putField(fldName, fldAccess -> { + fldAccess + .putField("javaThreadId", thread.getId()) + .putField("osThreadId", thread.getId()) + .putField("javaName", thread.getName()); + }); } private void putStackTraceField( @@ -393,78 +363,54 @@ private void putStackTraceField( break; } } - access.putField( - fldName, - p -> { - p.putField("frames", frames).putField("truncated", truncated[0]); - }); + access.putField(fldName, p -> { + p.putField("frames", frames).putField("truncated", truncated[0]); + }); } private TypedValue asStackFrame(Types types, StackTraceElement element) { return frameCache.computeIfAbsent( element, - k -> - types - .getType(Types.JDK.STACK_FRAME) - .asValue( - p -> { - p.putField("method", methodValue(types, k)) - .putField("lineNumber", k.getLineNumber()) - .putField("bytecodeIndex", -1) - .putField("type", k.isNativeMethod() ? "native" : "java"); - })); + k -> types.getType(Types.JDK.STACK_FRAME).asValue(p -> { + p.putField("method", methodValue(types, k)) + .putField("lineNumber", k.getLineNumber()) + .putField("bytecodeIndex", -1) + .putField("type", k.isNativeMethod() ? "native" : "java"); + })); } private TypedValue methodValue(Types types, StackTraceElement element) { - return types - .getType(Types.JDK.METHOD) - .asValue( - p -> { - p.putField("type", classValue(types, element)) - .putField("name", element.getMethodName()); - }); + return types.getType(Types.JDK.METHOD).asValue(p -> { + p.putField("type", classValue(types, element)).putField("name", element.getMethodName()); + }); } private TypedValue classValue(Types types, StackTraceElement element) { - return types - .getType(Types.JDK.CLASS) - .asValue( - p -> { - p.putField("name", getSimpleName(element.getClassName())); - }); + return types.getType(Types.JDK.CLASS).asValue(p -> { + p.putField("name", getSimpleName(element.getClassName())); + }); } private TypedValue classLoaderValue(Types types, String classLoaderName) { return classLoaderCache.computeIfAbsent( classLoaderName, - k -> - types - .getType(Types.JDK.CLASS_LOADER) - .asValue( - p -> { - p.putField("name", k); - })); + k -> types.getType(Types.JDK.CLASS_LOADER).asValue(p -> { + p.putField("name", k); + })); } private TypedValue packageValue(Types types, String packageName, String module) { - return types - .getType(Types.JDK.PACKAGE) - .asValue( - p -> { - p.putField("name", packageName).putField("module", moduleValue(types, module)); - }); + return types.getType(Types.JDK.PACKAGE).asValue(p -> { + p.putField("name", packageName).putField("module", moduleValue(types, module)); + }); } private TypedValue moduleValue(Types types, String module) { return moduleCache.computeIfAbsent( module, - k -> - types - .getType(Types.JDK.MODULE) - .asValue( - p -> { - p.putField("name", k); - })); + k -> types.getType(Types.JDK.MODULE).asValue(p -> { + p.putField("name", k); + })); } private String getSimpleName(String className) { diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JFREventContextIntegration.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JFREventContextIntegration.java index 999266980f8..6b277a36b13 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JFREventContextIntegration.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JFREventContextIntegration.java @@ -22,21 +22,18 @@ public JFREventContextIntegration() { // Note: Loading CheckpointEvent when JFRCheckpointer is loaded is important because it also // loads JFR classes - which may not be present on some JVMs EventType.getEventType(EndpointEvent.class); - isEndpointCollectionEnabled = - ConfigProvider.getInstance() - .getBoolean( - ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED, - ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED_DEFAULT); - isTimelineEventsEnabled = - ConfigProvider.getInstance() - .getBoolean( - ProfilingConfig.PROFILING_TIMELINE_EVENTS_ENABLED, - ProfilingConfig.PROFILING_TIMELINE_EVENTS_ENABLED_DEFAULT); - isQueueTimeEnabled = - ConfigProvider.getInstance() - .getBoolean( - ProfilingConfig.PROFILING_QUEUEING_TIME_ENABLED, - ProfilingConfig.PROFILING_QUEUEING_TIME_ENABLED_DEFAULT); + isEndpointCollectionEnabled = ConfigProvider.getInstance() + .getBoolean( + ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED, + ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED_DEFAULT); + isTimelineEventsEnabled = ConfigProvider.getInstance() + .getBoolean( + ProfilingConfig.PROFILING_TIMELINE_EVENTS_ENABLED, + ProfilingConfig.PROFILING_TIMELINE_EVENTS_ENABLED_DEFAULT); + isQueueTimeEnabled = ConfigProvider.getInstance() + .getBoolean( + ProfilingConfig.PROFILING_QUEUEING_TIME_ENABLED, + ProfilingConfig.PROFILING_QUEUEING_TIME_ENABLED_DEFAULT); } // native image process will enable context integration immediately - the value will get diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JfrProfilerSettings.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JfrProfilerSettings.java index f74d626909a..6abeafaf505 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JfrProfilerSettings.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/JfrProfilerSettings.java @@ -23,10 +23,9 @@ public JfrProfilerSettings( ControllerContext.Snapshot context, boolean hasJfrStackDepthApplied) { super(configProvider, context.getDatadogProfilerUnavailableReason(), hasJfrStackDepthApplied); - this.jfrImplementation = - Platform.isNativeImage() - ? "native-image" - : (JavaVirtualMachine.isOracleJDK8() ? "oracle" : "openjdk"); + this.jfrImplementation = Platform.isNativeImage() + ? "native-image" + : (JavaVirtualMachine.isOracleJDK8() ? "oracle" : "openjdk"); this.isDdprofActive = context.isDatadogProfilerEnabled(); } diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkController.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkController.java index 6f6bb01bef4..2b55be9f2a7 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkController.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkController.java @@ -107,9 +107,8 @@ public OpenJdkController(final ConfigProvider configProvider) Map recordingSettings; try { - recordingSettings = - JfpUtils.readNamedJfpResource( - ultraMinimal ? JfpUtils.SAFEPOINTS_JFP : JfpUtils.DEFAULT_JFP); + recordingSettings = JfpUtils.readNamedJfpResource( + ultraMinimal ? JfpUtils.SAFEPOINTS_JFP : JfpUtils.DEFAULT_JFP); } catch (final IOException e) { throw new ConfigurationException(e); } @@ -143,9 +142,8 @@ public OpenJdkController(final ConfigProvider configProvider) "enabling Datadog heap histogram on JVM without an efficient implementation of the jdk.ObjectCount event. " + "This may increase p99 latency. Consider upgrading to JDK 17.0.9+ or 21+ to reduce latency impact."); } - String mode = - configProvider.getString( - PROFILING_HEAP_HISTOGRAM_MODE, PROFILING_HEAP_HISTOGRAM_MODE_DEFAULT); + String mode = configProvider.getString( + PROFILING_HEAP_HISTOGRAM_MODE, PROFILING_HEAP_HISTOGRAM_MODE_DEFAULT); if ("periodic".equalsIgnoreCase(mode)) { enableEvent(recordingSettings, "jdk.ObjectCount", "user enabled histogram heap collection"); } else { @@ -156,19 +154,17 @@ public OpenJdkController(final ConfigProvider configProvider) if (configProvider.getBoolean( PROFILING_QUEUEING_TIME_ENABLED, PROFILING_QUEUEING_TIME_ENABLED_DEFAULT)) { - long threshold = - configProvider.getLong( - PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS, - PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS_DEFAULT); + long threshold = configProvider.getLong( + PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS, + PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS_DEFAULT); recordingSettings.put("datadog.QueueTime#threshold", threshold + " ms"); } // Toggle settings from override file try { - recordingSettings.putAll( - JfpUtils.readOverrideJfpResource( - configProvider.getString(ProfilingConfig.PROFILING_TEMPLATE_OVERRIDE_FILE))); + recordingSettings.putAll(JfpUtils.readOverrideJfpResource( + configProvider.getString(ProfilingConfig.PROFILING_TEMPLATE_OVERRIDE_FILE))); } catch (final IOException e) { throw new ConfigurationException(e); } @@ -210,12 +206,10 @@ ProfilingConfig.PROFILING_HEAP_ENABLED, isLiveHeapProfilingSafe())) { // ddprof live heap requires Java 11+ (JVMTI Allocation Sampler) // isJmethodIDSafe() matches ddprof's own default for liveheap: it only enables // MEMLEAK mode by default on versions where jmethodID is safe. - boolean ddprofLikelyActive = - isJavaVersionAtLeast(11) - && configProvider.getBoolean( - ProfilingConfig.PROFILING_DATADOG_PROFILER_LIVEHEAP_ENABLED, isJmethodIDSafe()) - && configProvider.getBoolean( - ProfilingConfig.PROFILING_DATADOG_PROFILER_ENABLED, true); + boolean ddprofLikelyActive = isJavaVersionAtLeast(11) + && configProvider.getBoolean( + ProfilingConfig.PROFILING_DATADOG_PROFILER_LIVEHEAP_ENABLED, isJmethodIDSafe()) + && configProvider.getBoolean(ProfilingConfig.PROFILING_DATADOG_PROFILER_ENABLED, true); if (ddprofLikelyActive) { disableEvent( recordingSettings, @@ -303,10 +297,9 @@ && isEventEnabled(recordingSettings, "jdk.NativeMethodSample")) { } private static String getJfrRepositoryBase(ConfigProvider configProvider) { - String legacy = - configProvider.getString( - ProfilingConfig.PROFILING_JFR_REPOSITORY_BASE, - ProfilingConfig.PROFILING_JFR_REPOSITORY_BASE_DEFAULT); + String legacy = configProvider.getString( + ProfilingConfig.PROFILING_JFR_REPOSITORY_BASE, + ProfilingConfig.PROFILING_JFR_REPOSITORY_BASE_DEFAULT); if (!legacy.equals(ProfilingConfig.PROFILING_JFR_REPOSITORY_BASE_DEFAULT)) { log.warn( "The configuration key {} is deprecated. Please use {} instead.", diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecording.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecording.java index 4b9d71e3a26..997dfb89751 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecording.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecording.java @@ -81,43 +81,39 @@ public class OpenJdkOngoingRecording implements OngoingRecording { private void disableOverriddenEvents(ControllerContext.Snapshot context) { for (ProfilingMode mode : context.getDatadogProfilingModes()) { switch (mode) { - case CPU: - { - // CPU execution profiling will take over these events, including - // jdk.CPUTimeSample (JEP 518, JDK 25+) which is enabled as a fallback - // when ddprof is unavailable - log.debug("Disabling built-in CPU profiling events"); - recording.disable("jdk.ExecutionSample"); - recording.disable("jdk.NativeMethodSample"); - recording.disable("jdk.CPUTimeSample"); - recording.disable("jdk.CPUTimeSamplesLost"); - break; - } - case WALL: - { - // wall-time profiling will take over these events - log.debug("Disabling built-in wall-time tracing events"); - recording.disable("jdk.JavaMonitorWait"); - recording.disable("jdk.ThreadPark"); - recording.disable("jdk.ThreadSleep"); - break; - } - case ALLOCATION: - { - // allocation profiling will take over these events - log.debug("Disabling built-in allocation profiling events"); - recording.disable("jdk.ObjectAllocationOutsideTLAB"); - recording.disable("jdk.ObjectAllocationInNewTLAB"); - recording.disable("jdk.ObjectAllocationSample"); - break; - } - case MEMLEAK: - { - // memleak profiling will take over these events - log.debug("Disabling built-in memory leak profiling events"); - recording.disable("jdk.OldObjectSample"); - break; - } + case CPU: { + // CPU execution profiling will take over these events, including + // jdk.CPUTimeSample (JEP 518, JDK 25+) which is enabled as a fallback + // when ddprof is unavailable + log.debug("Disabling built-in CPU profiling events"); + recording.disable("jdk.ExecutionSample"); + recording.disable("jdk.NativeMethodSample"); + recording.disable("jdk.CPUTimeSample"); + recording.disable("jdk.CPUTimeSamplesLost"); + break; + } + case WALL: { + // wall-time profiling will take over these events + log.debug("Disabling built-in wall-time tracing events"); + recording.disable("jdk.JavaMonitorWait"); + recording.disable("jdk.ThreadPark"); + recording.disable("jdk.ThreadSleep"); + break; + } + case ALLOCATION: { + // allocation profiling will take over these events + log.debug("Disabling built-in allocation profiling events"); + recording.disable("jdk.ObjectAllocationOutsideTLAB"); + recording.disable("jdk.ObjectAllocationInNewTLAB"); + recording.disable("jdk.ObjectAllocationSample"); + break; + } + case MEMLEAK: { + // memleak profiling will take over these events + log.debug("Disabling built-in memory leak profiling events"); + recording.disable("jdk.OldObjectSample"); + break; + } default: break; } diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactory.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactory.java index f6d0635c809..48b14529a78 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactory.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactory.java @@ -85,16 +85,15 @@ private void processSynchronizables( Set waitingFramesSet = waitingFrames.get(li); if (waitingFramesSet != null) { for (StackTraceElement waitingFrame : waitingFramesSet) { - events.add( - new DeadlockedThreadEvent( - id, - ti.getThreadId(), - ti.getThreadName(), - ti.getLockOwnerId(), - ti.getLockOwnerName(), - ti.getLockName(), - null, - frameAsString(waitingFrame))); + events.add(new DeadlockedThreadEvent( + id, + ti.getThreadId(), + ti.getThreadName(), + ti.getLockOwnerId(), + ti.getLockOwnerName(), + ti.getLockName(), + null, + frameAsString(waitingFrame))); } } } @@ -109,16 +108,15 @@ private void processLockedMonitors( Set waitingFramesSet = waitingFrames.get(mi); if (waitingFramesSet != null) { for (StackTraceElement waitingFrame : waitingFramesSet) { - events.add( - new DeadlockedThreadEvent( - id, - ti.getThreadId(), - ti.getThreadName(), - ti.getLockOwnerId(), - ti.getLockOwnerName(), - ti.getLockName(), - frameAsString(mi.getLockedStackFrame()), - frameAsString(waitingFrame))); + events.add(new DeadlockedThreadEvent( + id, + ti.getThreadId(), + ti.getThreadName(), + ti.getLockOwnerId(), + ti.getLockOwnerName(), + ti.getLockName(), + frameAsString(mi.getLockedStackFrame()), + frameAsString(waitingFrame))); } } } diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java index 68b3e063da6..7d8d8289035 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/main/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactory.java @@ -48,9 +48,9 @@ public static void registerEvents() { ObjectName objectName = new ObjectName("com.sun.management:type=DiagnosticCommand"); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - boolean annotatedMapsAvailable = - Arrays.stream(mbs.getMBeanInfo(objectName).getOperations()) - .anyMatch(x -> x.getName().equals("systemMap")); + boolean annotatedMapsAvailable = Arrays.stream( + mbs.getMBeanInfo(objectName).getOperations()) + .anyMatch(x -> x.getName().equals("systemMap")); if (annotatedMapsAvailable) { // Let's register the periodic SmapEntry event. // The AggregatedSmapEntry event will be generated from the common logic, based on the diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/InstantiationTest.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/InstantiationTest.java index 1a604d71291..fa21144c882 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/InstantiationTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/InstantiationTest.java @@ -27,7 +27,9 @@ public void testCreateController() throws UnsupportedEnvironmentException { assertEquals( 1, ((CompositeController) controller) - .getControllers().stream().filter(c -> c instanceof OpenJdkController).count()); + .getControllers().stream() + .filter(c -> c instanceof OpenJdkController) + .count()); } else { assertInstanceOf(OpenJdkController.class, controller); } diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkControllerTest.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkControllerTest.java index eee7a2f9638..6ba86e3d957 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkControllerTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkControllerTest.java @@ -46,8 +46,9 @@ public void testCreateContinuousRecording() throws Exception { ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { assertEquals(TEST_NAME, recording.getName()); @@ -63,8 +64,9 @@ public void testHeapProfilerIsDisabledOnUnsupportedVersion() throws Exception { ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { assertEquals( @@ -81,8 +83,9 @@ public void testHeapProfilerIsStillOverriddenOnUnsupportedVersion() throws Excep ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { if (!isOldObjectSampleAvailable()) { @@ -102,10 +105,10 @@ public void testHeapProfilerIsStillOverriddenThroughConfig() throws Exception { ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - try (final Recording recording = - ((OpenJdkRecordingData) - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop()) - .getRecording()) { + try (final Recording recording = ((OpenJdkRecordingData) controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop()) + .getRecording()) { // On JVMs where OldObjectSample is not available (e.g. Java 8), explicitly enabling heap // profiling has no effect — the event cannot be safely enabled. assertEquals( @@ -121,8 +124,9 @@ public void testAllocationProfilerIsDisabledOnUnsupportedVersion() throws Except ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { if (isObjectAllocationSampleAvailable()) { @@ -162,8 +166,9 @@ public void testAllocationProfilerIsStillOverriddenOnUnsupportedVersion() throws ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { if (!isObjectAllocationSampleAvailable()) { @@ -187,10 +192,10 @@ public void testAllocationProfilerIsStillOverriddenThroughConfig() throws Except ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - try (final Recording recording = - ((OpenJdkRecordingData) - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop()) - .getRecording()) { + try (final Recording recording = ((OpenJdkRecordingData) controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop()) + .getRecording()) { if (!isObjectAllocationSampleAvailable()) { assertEquals( true, @@ -212,8 +217,9 @@ public void testNativeProfilerIsDisabledOnUnsupportedVersion() throws Exception ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { assertFalse( @@ -228,8 +234,9 @@ public void testNativeProfilerIsStillOverriddenOnUnsupportedVersion() throws Exc ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { if (!isNativeMethodSampleAvailable()) { @@ -251,9 +258,9 @@ public void testOldObjectSampleDisabledWhenDdprofMemleakActive() throws Exceptio context.setDatadogProfilingModes(EnumSet.of(ProfilingMode.MEMLEAK)); OpenJdkController controller = new OpenJdkController(configProvider); - try (final Recording recording = - ((OpenJdkRecordingData) controller.createRecording(TEST_NAME, context.snapshot()).stop()) - .getRecording()) { + try (final Recording recording = ((OpenJdkRecordingData) + controller.createRecording(TEST_NAME, context.snapshot()).stop()) + .getRecording()) { assertFalse(Boolean.parseBoolean(recording.getSettings().get("jdk.OldObjectSample#enabled"))); } } @@ -266,8 +273,9 @@ public void testUnifiedFlagDisabledTurnsOffOldObjectSample() throws Exception { ConfigProvider configProvider = ConfigProvider.withPropertiesOverride(props); OpenJdkController controller = new OpenJdkController(configProvider); - RecordingData data = - controller.createRecording(TEST_NAME, new ControllerContext().snapshot()).stop(); + RecordingData data = controller + .createRecording(TEST_NAME, new ControllerContext().snapshot()) + .stop(); assertTrue(data instanceof OpenJdkRecordingData); try (final Recording recording = ((OpenJdkRecordingData) data).getRecording()) { assertFalse( diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecordingTest.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecordingTest.java index cc7f65aeb43..e94c5a9904f 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecordingTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkOngoingRecordingTest.java @@ -31,9 +31,14 @@ public class OpenJdkOngoingRecordingTest { private static final String TEST_NAME = "recording name"; - @Mock private Instant start; - @Mock private Instant end; - @Mock private Recording recording; + @Mock + private Instant start; + + @Mock + private Instant end; + + @Mock + private Recording recording; private OpenJdkOngoingRecording ongoingRecording; @@ -60,11 +65,9 @@ public void testStop() { public void testStopOnStopped() { when(recording.getState()).thenReturn(RecordingState.STOPPED); - assertThrows( - IllegalStateException.class, - () -> { - ongoingRecording.stop(); - }); + assertThrows(IllegalStateException.class, () -> { + ongoingRecording.stop(); + }); verify(recording, never()).stop(); } @@ -93,11 +96,9 @@ public void testSnapshot() { public void testSnapshotOnStopped() { when(recording.getState()).thenReturn(RecordingState.STOPPED); - assertThrows( - IllegalStateException.class, - () -> { - ongoingRecording.snapshot(start); - }); + assertThrows(IllegalStateException.class, () -> { + ongoingRecording.snapshot(start); + }); verify(recording, never()).stop(); } diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkRecordingDataTest.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkRecordingDataTest.java index fc1e164245d..0cd6dc52bf7 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkRecordingDataTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/OpenJdkRecordingDataTest.java @@ -30,13 +30,26 @@ public class OpenJdkRecordingDataTest { private static final String TEST_NAME = "recording name"; - @Mock Instant start; - @Mock Instant end; - @Mock Instant customStart; - @Mock Instant customEnd; - @Mock private InputStream stream; - @Mock private InputStream customStream; - @Mock private Recording recording; + @Mock + Instant start; + + @Mock + Instant end; + + @Mock + Instant customStart; + + @Mock + Instant customEnd; + + @Mock + private InputStream stream; + + @Mock + private InputStream customStream; + + @Mock + private Recording recording; private OpenJdkRecordingData recordingData; private OpenJdkRecordingData customRecordingData; @@ -51,9 +64,8 @@ public void setup() throws IOException { when(recording.getName()).thenReturn(TEST_NAME); recordingData = new OpenJdkRecordingData(recording, ProfilingSnapshot.Kind.PERIODIC); - customRecordingData = - new OpenJdkRecordingData( - recording, customStart, customEnd, ProfilingSnapshot.Kind.PERIODIC); + customRecordingData = new OpenJdkRecordingData( + recording, customStart, customEnd, ProfilingSnapshot.Kind.PERIODIC); } @Test diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactoryTest.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactoryTest.java index e49b6daf00c..06e523cf626 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactoryTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/DeadlockEventFactoryTest.java @@ -25,44 +25,41 @@ class DeadlockEventFactoryTest { @BeforeEach void setUp() { - eventFactory = - new DeadlockEventFactory() { - @Override - boolean isDeadlockEventEnabled() { - return true; - } + eventFactory = new DeadlockEventFactory() { + @Override + boolean isDeadlockEventEnabled() { + return true; + } - @Override - boolean isDeadlockedThreadEventEnabled() { - return true; - } - }; + @Override + boolean isDeadlockedThreadEventEnabled() { + return true; + } + }; - disabledDetailsEventFactory = - new DeadlockEventFactory() { - @Override - boolean isDeadlockEventEnabled() { - return true; - } + disabledDetailsEventFactory = new DeadlockEventFactory() { + @Override + boolean isDeadlockEventEnabled() { + return true; + } - @Override - boolean isDeadlockedThreadEventEnabled() { - return false; - } - }; + @Override + boolean isDeadlockedThreadEventEnabled() { + return false; + } + }; - allDisabledEventFactory = - new DeadlockEventFactory() { - @Override - boolean isDeadlockEventEnabled() { - return false; - } + allDisabledEventFactory = new DeadlockEventFactory() { + @Override + boolean isDeadlockEventEnabled() { + return false; + } - @Override - boolean isDeadlockedThreadEventEnabled() { - return false; - } - }; + @Override + boolean isDeadlockedThreadEventEnabled() { + return false; + } + }; } @Test @@ -89,32 +86,29 @@ void collectEvents() throws Exception { private void assertDeadlock(boolean isMonitor, int expected) throws InterruptedException { String classifier = isMonitor ? "monitor" : "lock"; - List events = - eventFactory.collectEvents().stream() - .filter( - e -> { - if (e instanceof DeadlockedThreadEvent) { - return ((DeadlockedThreadEvent) e).getThreadName().contains(classifier); - } - return true; - }) - .sorted( - (e1, e2) -> { - if (e1 instanceof DeadlockEvent) { - return e2 instanceof DeadlockEvent ? 0 : -1; - } else { - if (e2 instanceof DeadlockEvent) { - return 1; - } - } - if (e1 instanceof DeadlockedThreadEvent && e2 instanceof DeadlockedThreadEvent) { - return ((DeadlockedThreadEvent) e1) - .getThreadName() - .compareTo(((DeadlockedThreadEvent) e2).getThreadName()); - } - return 0; - }) - .collect(Collectors.toList()); + List events = eventFactory.collectEvents().stream() + .filter(e -> { + if (e instanceof DeadlockedThreadEvent) { + return ((DeadlockedThreadEvent) e).getThreadName().contains(classifier); + } + return true; + }) + .sorted((e1, e2) -> { + if (e1 instanceof DeadlockEvent) { + return e2 instanceof DeadlockEvent ? 0 : -1; + } else { + if (e2 instanceof DeadlockEvent) { + return 1; + } + } + if (e1 instanceof DeadlockedThreadEvent && e2 instanceof DeadlockedThreadEvent) { + return ((DeadlockedThreadEvent) e1) + .getThreadName() + .compareTo(((DeadlockedThreadEvent) e2).getThreadName()); + } + return 0; + }) + .collect(Collectors.toList()); assertNotNull(events); assertEquals(3, events.size()); // 1 deadlock event + 2 deadlocked thread events in that order @@ -165,42 +159,39 @@ private static int setupMonitorDeadlock() throws InterruptedException { Object lockA = new Object(); Object lockB = new Object(); - Thread threadA = - new Thread( - () -> { - synchronized (lockA) { - phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked - synchronized (lockB) { - phaser.arriveAndDeregister(); // virtually unreachable - } - } - }, - "monitor-thread-A"); - Thread threadB = - new Thread( - () -> { - synchronized (lockB) { - phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked - synchronized (lockA) { - phaser.arriveAndDeregister(); // virtually unreachable - } - } - }, - "monitor-thread-B"); + Thread threadA = new Thread( + () -> { + synchronized (lockA) { + phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked + synchronized (lockB) { + phaser.arriveAndDeregister(); // virtually unreachable + } + } + }, + "monitor-thread-A"); + Thread threadB = new Thread( + () -> { + synchronized (lockB) { + phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked + synchronized (lockA) { + phaser.arriveAndDeregister(); // virtually unreachable + } + } + }, + "monitor-thread-B"); threadA.setDaemon(true); threadB.setDaemon(true); CountDownLatch latch = new CountDownLatch(1); - Thread main = - new Thread( - () -> { - threadA.start(); - threadB.start(); - phaser.arriveAndAwaitAdvance(); // enter deadlock - phaser.arriveAndAwaitAdvance(); // unreachable if deadlock is present - latch.countDown(); - }, - "main-monitor-thread"); + Thread main = new Thread( + () -> { + threadA.start(); + threadB.start(); + phaser.arriveAndAwaitAdvance(); // enter deadlock + phaser.arriveAndAwaitAdvance(); // unreachable if deadlock is present + latch.countDown(); + }, + "main-monitor-thread"); main.setDaemon(true); main.start(); @@ -217,54 +208,51 @@ private static int setupSynchronizableDeadlock() throws InterruptedException { Lock lockA = new ReentrantLock(); Lock lockB = new ReentrantLock(); - Thread threadA = - new Thread( - () -> { - lockA.lock(); - try { - phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked - lockB.lock(); - try { - phaser.arriveAndDeregister(); // virtually unreachable - } finally { - lockB.unlock(); - } - } finally { - lockA.unlock(); - } - }, - "lock-thread-A"); - Thread threadB = - new Thread( - () -> { - lockB.lock(); - try { - phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked - lockA.lock(); - try { - phaser.arriveAndDeregister(); // virtually unreachable - } finally { - lockA.unlock(); - } - } finally { - lockB.unlock(); - } - }, - "lock-thread-B"); + Thread threadA = new Thread( + () -> { + lockA.lock(); + try { + phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked + lockB.lock(); + try { + phaser.arriveAndDeregister(); // virtually unreachable + } finally { + lockB.unlock(); + } + } finally { + lockA.unlock(); + } + }, + "lock-thread-A"); + Thread threadB = new Thread( + () -> { + lockB.lock(); + try { + phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked + lockA.lock(); + try { + phaser.arriveAndDeregister(); // virtually unreachable + } finally { + lockA.unlock(); + } + } finally { + lockB.unlock(); + } + }, + "lock-thread-B"); threadA.setDaemon(true); threadB.setDaemon(true); CountDownLatch latch = new CountDownLatch(1); - Thread main = - new Thread( - () -> { - threadA.start(); - threadB.start(); - phaser.arriveAndAwaitAdvance(); // enter deadlock - phaser.arriveAndAwaitAdvance(); // unreachable if deadlock is present - latch.countDown(); - }, - "main-lock-thread"); + Thread main = new Thread( + () -> { + threadA.start(); + threadB.start(); + phaser.arriveAndAwaitAdvance(); // enter deadlock + phaser.arriveAndAwaitAdvance(); // unreachable if deadlock is present + latch.countDown(); + }, + "main-lock-thread"); main.setDaemon(true); main.start(); diff --git a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactoryTest.java b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactoryTest.java index 61daba54326..68f9780895c 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactoryTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller-openjdk/src/test/java/com/datadog/profiling/controller/openjdk/events/SmapEntryFactoryTest.java @@ -19,12 +19,9 @@ public class SmapEntryFactoryTest { @ParameterizedTest @ValueSource(ints = {23, 24}) void testAnnotatedRegionsSanity(int javaVersion) throws Exception { - try (BufferedReader br = - new BufferedReader( - new InputStreamReader( - Objects.requireNonNull( - SmapEntryFactory.class.getResourceAsStream( - "/smap/annotated_regions_" + javaVersion + ".txt"))))) { + try (BufferedReader br = new BufferedReader( + new InputStreamReader(Objects.requireNonNull(SmapEntryFactory.class.getResourceAsStream( + "/smap/annotated_regions_" + javaVersion + ".txt"))))) { long sentinel = 0x1000000420000000L; String line = null; @@ -51,11 +48,8 @@ void testAnnotatedRegionsSanity(int javaVersion) throws Exception { @Test void testSmapSanity() throws Exception { - try (BufferedReader br = - new BufferedReader( - new InputStreamReader( - Objects.requireNonNull( - SmapEntryFactory.class.getResourceAsStream("/smap/smaps.txt"))))) { + try (BufferedReader br = new BufferedReader(new InputStreamReader( + Objects.requireNonNull(SmapEntryFactory.class.getResourceAsStream("/smap/smaps.txt"))))) { List events = new ArrayList<>(); SmapEntryCache.readEvents(br, events); assertNotNull(events); diff --git a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/JfrMBeanHelper.java b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/JfrMBeanHelper.java index 95ce537484c..ac6a4933b55 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/JfrMBeanHelper.java +++ b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/JfrMBeanHelper.java @@ -77,35 +77,32 @@ final class JfrMBeanHelper { private static final String KEY_MAX_AGE = "maxAge"; private static final String KEY_TO_DISK = "toDisk"; - private static final String[] SETTING_NAMES = - new String[] { - KEY_NAME, - KEY_TO_DISK, - KEY_DURATION, - KEY_MAX_SIZE, - KEY_MAX_AGE, - KEY_DESTINATION_FILE, - KEY_START_TIME, - KEY_DESTINATION_COMPRESSED - }; - private static final OpenType[] SETTING_TYPES = - new OpenType[] { - SimpleType.STRING, - SimpleType.BOOLEAN, - SimpleType.LONG, - SimpleType.LONG, - SimpleType.LONG, - SimpleType.STRING, - SimpleType.DATE, - SimpleType.BOOLEAN - }; + private static final String[] SETTING_NAMES = new String[] { + KEY_NAME, + KEY_TO_DISK, + KEY_DURATION, + KEY_MAX_SIZE, + KEY_MAX_AGE, + KEY_DESTINATION_FILE, + KEY_START_TIME, + KEY_DESTINATION_COMPRESSED + }; + private static final OpenType[] SETTING_TYPES = new OpenType[] { + SimpleType.STRING, + SimpleType.BOOLEAN, + SimpleType.LONG, + SimpleType.LONG, + SimpleType.LONG, + SimpleType.STRING, + SimpleType.DATE, + SimpleType.BOOLEAN + }; private static final String[] OPTION_NAMES = new String[] {KEY_ID, KEY_THRESHOLD, KEY_STACKTRACE_SERVER, KEY_PERIOD_SERVER, KEY_ENABLED}; - private static final OpenType[] OPTION_TYPES = - new OpenType[] { - SimpleType.INTEGER, SimpleType.LONG, SimpleType.BOOLEAN, SimpleType.LONG, SimpleType.BOOLEAN - }; + private static final OpenType[] OPTION_TYPES = new OpenType[] { + SimpleType.INTEGER, SimpleType.LONG, SimpleType.BOOLEAN, SimpleType.LONG, SimpleType.BOOLEAN + }; private static final CompositeType OPTIONS_COMPOSITE_TYPE = generateOptionsType(); private static final CompositeType SETTINGS_COMPOSITE_TYPE = generateSettingsType(); @@ -247,13 +244,11 @@ public void closeRecording(ObjectName recordingId) throws IOException { public ObjectName cloneRecording(ObjectName recordingId) throws IOException { log.debug("Cloning recording {}", recordingId.getKeyProperty("name")); - ObjectName cloned = - (ObjectName) - invokeJfrOperation( - CLONE_RECORDING, - recordingId, - "Clone of " + recordingId.getKeyProperty("name"), - Boolean.TRUE); + ObjectName cloned = (ObjectName) invokeJfrOperation( + CLONE_RECORDING, + recordingId, + "Clone of " + recordingId.getKeyProperty("name"), + Boolean.TRUE); log.debug( "Recording {} has been cloned to {}", recordingId.getKeyProperty("name"), @@ -304,35 +299,31 @@ List encodeEventSettings(Map settings) throws IOE Object[] values = new Object[] {entry.getKey(), -1L, Boolean.FALSE, -1L, Boolean.FALSE}; for (Map.Entry valueEntry : entry.getValue().entrySet()) { switch (valueEntry.getKey()) { - case "threshold": - { - values[1] = parseDuration(valueEntry.getValue(), ChronoUnit.NANOS).toNanos(); - break; - } - case "stackTrace": - { - values[2] = Boolean.parseBoolean(valueEntry.getValue()); - break; - } - case "period": - { - String valueStr = valueEntry.getValue(); - if (valueStr.contains("Chunk")) { - values[3] = 0L; // magic number for 'everyChunk' - } else { - values[3] = parseDuration(valueEntry.getValue(), ChronoUnit.MILLIS).toMillis(); - } - break; - } - case "enabled": - { - values[4] = Boolean.parseBoolean(valueEntry.getValue()); - break; - } - default: - { - log.warn("Unsupported setting name: {}. Skipping.", valueEntry.getKey()); + case "threshold": { + values[1] = parseDuration(valueEntry.getValue(), ChronoUnit.NANOS).toNanos(); + break; + } + case "stackTrace": { + values[2] = Boolean.parseBoolean(valueEntry.getValue()); + break; + } + case "period": { + String valueStr = valueEntry.getValue(); + if (valueStr.contains("Chunk")) { + values[3] = 0L; // magic number for 'everyChunk' + } else { + values[3] = + parseDuration(valueEntry.getValue(), ChronoUnit.MILLIS).toMillis(); } + break; + } + case "enabled": { + values[4] = Boolean.parseBoolean(valueEntry.getValue()); + break; + } + default: { + log.warn("Unsupported setting name: {}. Skipping.", valueEntry.getKey()); + } } } eventSettings.add(new CompositeDataSupport(OPTIONS_COMPOSITE_TYPE, OPTION_NAMES, values)); @@ -346,10 +337,9 @@ List encodeEventSettings(Map settings) throws IOE CompositeData encodeRecordingSettings(String name, long maxSize, Duration maxAge) throws IOException { try { - return new CompositeDataSupport( - SETTINGS_COMPOSITE_TYPE, - SETTING_NAMES, - new Object[] {name, false, 0L, maxSize, maxAge.toMillis(), null, new Date(), false}); + return new CompositeDataSupport(SETTINGS_COMPOSITE_TYPE, SETTING_NAMES, new Object[] { + name, false, 0L, maxSize, maxAge.toMillis(), null, new Date(), false + }); } catch (OpenDataException e) { throw new IOException(e); } @@ -380,32 +370,26 @@ static Duration parseDuration(String timeUnitStr, TemporalUnit defaultTimeUnit) } switch (valueUnit[1].toLowerCase(Locale.ROOT)) { - case "ns": - { - return Duration.of(value, ChronoUnit.NANOS); - } - case "us": - { - return Duration.of(value, ChronoUnit.MICROS); - } - case "ms": - { - return Duration.of(value, ChronoUnit.MILLIS); - } - case "s": - { - return Duration.of(value, ChronoUnit.SECONDS); - } - case "m": - { - return Duration.of(value, ChronoUnit.MINUTES); - } - default: - { - log.debug( - "Unsupported time unit: {}. Assuming {}", valueUnit[1], defaultTimeUnit.toString()); - return Duration.of(value, defaultTimeUnit); - } + case "ns": { + return Duration.of(value, ChronoUnit.NANOS); + } + case "us": { + return Duration.of(value, ChronoUnit.MICROS); + } + case "ms": { + return Duration.of(value, ChronoUnit.MILLIS); + } + case "s": { + return Duration.of(value, ChronoUnit.SECONDS); + } + case "m": { + return Duration.of(value, ChronoUnit.MINUTES); + } + default: { + log.debug( + "Unsupported time unit: {}. Assuming {}", valueUnit[1], defaultTimeUnit.toString()); + return Duration.of(value, defaultTimeUnit); + } } } diff --git a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkController.java b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkController.java index c3478506bc4..5457aeb9b0b 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkController.java +++ b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkController.java @@ -41,11 +41,9 @@ public OracleJdkController(@Nonnull final ConfigProvider configProvider) try { log.debug("Initializing Oracle JFR controller"); helper = new JfrMBeanHelper(); - eventSettings = - Collections.unmodifiableMap( - JfpUtils.readJfpResources( - JfpUtils.DEFAULT_JFP, - configProvider.getString(ProfilingConfig.PROFILING_TEMPLATE_OVERRIDE_FILE))); + eventSettings = Collections.unmodifiableMap(JfpUtils.readJfpResources( + JfpUtils.DEFAULT_JFP, + configProvider.getString(ProfilingConfig.PROFILING_TEMPLATE_OVERRIDE_FILE))); } catch (final IOException e) { throw new ConfigurationException(e); } diff --git a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkOngoingRecording.java b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkOngoingRecording.java index 2edbc1a369e..d64d07cb673 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkOngoingRecording.java +++ b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkOngoingRecording.java @@ -38,14 +38,13 @@ public OracleJdkRecordingData stop() { try { log.debug("Stopping recording {}", name); helper.stopRecording(recordingId); - OracleJdkRecordingData data = - new OracleJdkRecordingData( - name, - recordingId, - start, - getEndTime(helper, recordingId, Instant.now()), - ProfilingSnapshot.Kind.PERIODIC, - helper); + OracleJdkRecordingData data = new OracleJdkRecordingData( + name, + recordingId, + start, + getEndTime(helper, recordingId, Instant.now()), + ProfilingSnapshot.Kind.PERIODIC, + helper); log.debug("Recording {} has been stopped and its data collected", name); return data; } catch (IOException e) { diff --git a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkRecordingData.java b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkRecordingData.java index 226e1b0f24d..5f3ac53c46a 100644 --- a/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkRecordingData.java +++ b/dd-java-agent/agent-profiling/profiling-controller-oracle/src/main/java/com/datadog/profiling/controller/oracle/OracleJdkRecordingData.java @@ -124,9 +124,8 @@ public void close() throws IOException { private void fill() throws IOException { if (streamId == -1L) { - streamId = - helper.openStream( - recordingId, new Date(start.toEpochMilli()), new Date(end.toEpochMilli())); + streamId = helper.openStream( + recordingId, new Date(start.toEpochMilli()), new Date(end.toEpochMilli())); } buf = helper.readStream(streamId); if (buf != null) { diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java index 666aa0029f5..1e49e4cce59 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java @@ -34,17 +34,13 @@ public static boolean checkEnvironment(String temp, StringBuilder sb) { appendLine("Profiler requires Java 8 or newer", sb); return false; } - appendLine( - () -> - sb.append("Using Java version: ") - .append(JavaVirtualMachine.getRuntimeVersion()) - .append(" (") - .append(SystemProperties.getOrDefault("java.home", "unknown")) - .append(")")); - appendLine( - () -> - sb.append("Running as user: ") - .append(SystemProperties.getOrDefault("user.name", "unknown"))); + appendLine(() -> sb.append("Using Java version: ") + .append(JavaVirtualMachine.getRuntimeVersion()) + .append(" (") + .append(SystemProperties.getOrDefault("java.home", "unknown")) + .append(")")); + appendLine(() -> sb.append("Running as user: ") + .append(SystemProperties.getOrDefault("user.name", "unknown"))); boolean result = false; result |= checkJFR(sb); result |= checkDdprof(sb); @@ -60,11 +56,9 @@ public static boolean checkEnvironment(String temp, StringBuilder sb) { return false; } else { if (!temp.equals(SystemProperties.get("java.io.tmpdir"))) { - appendLine( - () -> - sb.append("! Make sure to add '-Ddd.profiling.tempdir=") - .append(temp) - .append("' to your JVM command line !")); + appendLine(() -> sb.append("! Make sure to add '-Ddd.profiling.tempdir=") + .append(temp) + .append("' to your JVM command line !")); } } appendLine("Profiler is ready to be used.", sb); @@ -93,10 +87,8 @@ private static boolean checkDdprof(StringBuilder sb) { appendLine("Datadog profiler is only supported on Linux.", sb); return false; } else { - appendLine( - () -> - sb.append("Datadog profiler is supported on ") - .append(JavaVirtualMachine.getRuntimeVersion())); + appendLine(() -> sb.append("Datadog profiler is supported on ") + .append(JavaVirtualMachine.getRuntimeVersion())); return true; } } @@ -135,47 +127,42 @@ private static boolean checkTempLocation(String temp, StringBuilder sb) { } catch (Exception e) { appendLine(() -> sb.append("Unable to create temp directory in location ").append(temp)); if (isPosix) { - appendLine( - () -> - sb.append("Base dir: ") - .append(base) - .append(" [") - .append(getPermissionsStringSafe(base)) - .append("]")); + appendLine(() -> sb.append("Base dir: ") + .append(base) + .append(" [") + .append(getPermissionsStringSafe(base)) + .append("]")); } appendLine(() -> sb.append("Error: ").append(e)); } finally { if (Files.exists(target)) { try { - Files.walkFileTree( - target, - new FileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) - throws IOException { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) - throws IOException { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } - }); + Files.walkFileTree(target, new FileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) + throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) + throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); } catch (IOException ignored) { // should never happen } @@ -202,7 +189,8 @@ private static boolean checkCreateTempFile(Path target, StringBuilder sb) { appendLine(() -> sb.append("Test file created: ").append(testFile)); return true; } catch (Exception e) { - appendLine(() -> sb.append("Unable to create test file in temp directory ").append(target)); + appendLine( + () -> sb.append("Unable to create test file in temp directory ").append(target)); appendLine(() -> sb.append("Error: ").append(e)); } return false; @@ -241,25 +229,22 @@ private static boolean extractSoFromJar(Path target, StringBuilder sb) throws Ex try (JarFile jarFile = new JarFile(new File(jarUrl.toURI()))) { return jarFile.stream() .filter(e -> e.getName().contains("libjavaProfiler.so")) - .filter( - e -> - e.getName().contains(linuxArchFolder) - && (!OperatingSystem.isMusl() || e.getName().contains("-musl"))) + .filter(e -> e.getName().contains(linuxArchFolder) + && (!OperatingSystem.isMusl() || e.getName().contains("-musl"))) .findFirst() - .map( - e -> { - try { - Path soFile = target.resolve("libjavaProfiler.so"); - Files.createDirectories(soFile.getParent()); - Files.copy(jarFile.getInputStream(e), soFile); - appendLine(() -> sb.append("Native library extracted to: ").append(soFile)); - return true; - } catch (Throwable t) { - appendLine("Failed to extract or load native library", sb); - appendLine(() -> sb.append("Error: ").append(t)); - } - return false; - }) + .map(e -> { + try { + Path soFile = target.resolve("libjavaProfiler.so"); + Files.createDirectories(soFile.getParent()); + Files.copy(jarFile.getInputStream(e), soFile); + appendLine(() -> sb.append("Native library extracted to: ").append(soFile)); + return true; + } catch (Throwable t) { + appendLine("Failed to extract or load native library", sb); + appendLine(() -> sb.append("Error: ").append(t)); + } + return false; + }) .orElse(Boolean.FALSE); } } diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerSettingsSupport.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerSettingsSupport.java index a60e6b8f1dc..a77678e1f63 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerSettingsSupport.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilerSettingsSupport.java @@ -57,12 +57,8 @@ public int hashCode() { @Override public String toString() { - return "ProfilerActivationSetting{" - + "enablement=" - + enablement - + ", ssiMechanism=" - + ssiMechanism - + '}'; + return "ProfilerActivationSetting{" + "enablement=" + enablement + ", ssiMechanism=" + + ssiMechanism + '}'; } } @@ -120,64 +116,48 @@ protected ProfilerSettingsSupport( ConfigProvider configProvider, String ddprofUnavailableReason, boolean hasJfrStackDepthApplied) { - uploadPeriod = - configProvider.getInteger( - ProfilingConfig.PROFILING_UPLOAD_PERIOD, - ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT); - uploadTimeout = - configProvider.getInteger( - ProfilingConfig.PROFILING_UPLOAD_TIMEOUT, - ProfilingConfig.PROFILING_UPLOAD_TIMEOUT_DEFAULT); + uploadPeriod = configProvider.getInteger( + ProfilingConfig.PROFILING_UPLOAD_PERIOD, ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT); + uploadTimeout = configProvider.getInteger( + ProfilingConfig.PROFILING_UPLOAD_TIMEOUT, ProfilingConfig.PROFILING_UPLOAD_TIMEOUT_DEFAULT); // First try the new debug upload compression property, and fall back to the deprecated one - uploadCompression = - configProvider.getString( - ProfilingConfig.PROFILING_DEBUG_UPLOAD_COMPRESSION, - ProfilingConfig.PROFILING_DEBUG_UPLOAD_COMPRESSION_DEFAULT, - ProfilingConfig.PROFILING_UPLOAD_COMPRESSION); - allocationProfilingEnabled = - configProvider.getBoolean( - ProfilingConfig.PROFILING_ALLOCATION_ENABLED, - ProfilingSupport.isObjectAllocationSampleAvailable()); - heapProfilingEnabled = - configProvider.getBoolean( - ProfilingConfig.PROFILING_HEAP_ENABLED, ProfilingSupport.isLiveHeapProfilingSafe()); - startForceFirst = - configProvider.getBoolean( - ProfilingConfig.PROFILING_START_FORCE_FIRST, - ProfilingConfig.PROFILING_START_FORCE_FIRST_DEFAULT); + uploadCompression = configProvider.getString( + ProfilingConfig.PROFILING_DEBUG_UPLOAD_COMPRESSION, + ProfilingConfig.PROFILING_DEBUG_UPLOAD_COMPRESSION_DEFAULT, + ProfilingConfig.PROFILING_UPLOAD_COMPRESSION); + allocationProfilingEnabled = configProvider.getBoolean( + ProfilingConfig.PROFILING_ALLOCATION_ENABLED, + ProfilingSupport.isObjectAllocationSampleAvailable()); + heapProfilingEnabled = configProvider.getBoolean( + ProfilingConfig.PROFILING_HEAP_ENABLED, ProfilingSupport.isLiveHeapProfilingSafe()); + startForceFirst = configProvider.getBoolean( + ProfilingConfig.PROFILING_START_FORCE_FIRST, + ProfilingConfig.PROFILING_START_FORCE_FIRST_DEFAULT); templateOverride = configProvider.getString(ProfilingConfig.PROFILING_TEMPLATE_OVERRIDE_FILE); - exceptionSampleLimit = - configProvider.getInteger( - ProfilingConfig.PROFILING_EXCEPTION_SAMPLE_LIMIT, - ProfilingConfig.PROFILING_EXCEPTION_SAMPLE_LIMIT_DEFAULT); - exceptionHistogramTopItems = - configProvider.getInteger( - ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS, - ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS_DEFAULT); - exceptionHistogramMaxSize = - configProvider.getInteger( - ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE, - ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE_DEFAULT); + exceptionSampleLimit = configProvider.getInteger( + ProfilingConfig.PROFILING_EXCEPTION_SAMPLE_LIMIT, + ProfilingConfig.PROFILING_EXCEPTION_SAMPLE_LIMIT_DEFAULT); + exceptionHistogramTopItems = configProvider.getInteger( + ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS, + ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS_DEFAULT); + exceptionHistogramMaxSize = configProvider.getInteger( + ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE, + ProfilingConfig.PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE_DEFAULT); hotspotsEnabled = configProvider.getBoolean(ProfilingConfig.PROFILING_HOTSPOTS_ENABLED, false); - endpointsEnabled = - configProvider.getBoolean( - ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED, - ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED_DEFAULT); - auxiliaryProfiler = - configProvider.getString( - ProfilingConfig.PROFILING_AUXILIARY_TYPE, getDefaultAuxiliaryProfiler()); + endpointsEnabled = configProvider.getBoolean( + ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED, + ProfilingConfig.PROFILING_ENDPOINT_COLLECTION_ENABLED_DEFAULT); + auxiliaryProfiler = configProvider.getString( + ProfilingConfig.PROFILING_AUXILIARY_TYPE, getDefaultAuxiliaryProfiler()); perfEventsParanoid = readPerfEventsParanoidSetting(); - hasNativeStacks = - !"no" - .equalsIgnoreCase( - configProvider.getString( - ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK, - configProvider.getString( - "profiling.async.cstack", - ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK_DEFAULT))); - requestedStackDepth = - configProvider.getInteger( - ProfilingConfig.PROFILING_STACKDEPTH, ProfilingConfig.PROFILING_STACKDEPTH_DEFAULT); + hasNativeStacks = !"no" + .equalsIgnoreCase(configProvider.getString( + ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK, + configProvider.getString( + "profiling.async.cstack", + ProfilingConfig.PROFILING_DATADOG_PROFILER_CSTACK_DEFAULT))); + requestedStackDepth = configProvider.getInteger( + ProfilingConfig.PROFILING_STACKDEPTH, ProfilingConfig.PROFILING_STACKDEPTH_DEFAULT); jfrStackDepth = getStackDepth(); seLinuxStatus = getSELinuxStatus(); @@ -192,11 +172,10 @@ protected ProfilerSettingsSupport( } private static int getStackDepth() { - String value = - JavaVirtualMachine.getVmOptions().stream() - .filter(o -> o.startsWith("-XX:FlightRecorderOptions")) - .findFirst() - .orElse(null); + String value = JavaVirtualMachine.getVmOptions().stream() + .filter(o -> o.startsWith("-XX:FlightRecorderOptions")) + .findFirst() + .orElse(null); if (value != null) { int start = value.indexOf(STACKDEPTH_KEY); if (start != -1) { diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilingSystem.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilingSystem.java index bfb3df0f333..e545e098667 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilingSystem.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/ProfilingSystem.java @@ -266,10 +266,9 @@ public void snapshot(boolean onShutdown) { final RecordingType recordingType = RecordingType.CONTINUOUS; try { log.debug("Creating profiler snapshot"); - final RecordingData recordingData = - recording.snapshot( - lastSnapshot, - onShutdown ? ProfilingSnapshot.Kind.ON_SHUTDOWN : ProfilingSnapshot.Kind.PERIODIC); + final RecordingData recordingData = recording.snapshot( + lastSnapshot, + onShutdown ? ProfilingSnapshot.Kind.ON_SHUTDOWN : ProfilingSnapshot.Kind.PERIODIC); log.debug("Snapshot created: {}", recordingData); if (recordingData != null) { // To make sure that we don't get data twice, we say that the next start should be diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/test/java/com/datadog/profiling/controller/ProfilingSystemTest.java b/dd-java-agent/agent-profiling/profiling-controller/src/test/java/com/datadog/profiling/controller/ProfilingSystemTest.java index 324b9944bc0..728ef83b7dd 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/test/java/com/datadog/profiling/controller/ProfilingSystemTest.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/test/java/com/datadog/profiling/controller/ProfilingSystemTest.java @@ -79,14 +79,26 @@ public class ProfilingSystemTest { private final AgentTaskScheduler scheduler = new AgentTaskScheduler(PROFILER_RECORDING_SCHEDULER); - @Mock private ThreadLocalRandom threadLocalRandom; - @Mock private ConfigProvider configProvider; - @Mock private Controller controller; + @Mock + private ThreadLocalRandom threadLocalRandom; - @Mock private ControllerContext.Snapshot context; - @Mock private OngoingRecording recording; - @Mock private RecordingData recordingData; - @Mock private RecordingDataListener listener; + @Mock + private ConfigProvider configProvider; + + @Mock + private Controller controller; + + @Mock + private ControllerContext.Snapshot context; + + @Mock + private OngoingRecording recording; + + @Mock + private RecordingData recordingData; + + @Mock + private RecordingDataListener listener; private Appender mockedAppender; @@ -134,16 +146,15 @@ void testInvalidOracleJdk() throws Exception { when(controller.createRecording(ProfilingSystem.RECORDING_NAME, context)) .thenThrow( new RuntimeException(new RuntimeException("com.oracle.jrockit:type=FlightRecorder"))); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - Duration.ofMillis(1), - true); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + Duration.ofMillis(1), + true); system.start(); assertLog( Level.WARN, @@ -155,16 +166,15 @@ void testRuntimeException() throws Exception { // Simulate the message part when(controller.createRecording(ProfilingSystem.RECORDING_NAME, context)) .thenThrow(new RuntimeException(new RuntimeException())); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - Duration.ofMillis(1), - true); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + Duration.ofMillis(1), + true); assertThrows(RuntimeException.class, () -> system.start()); } @@ -173,33 +183,31 @@ void testOtherException() throws Exception { // Simulate the message part when(controller.createRecording(ProfilingSystem.RECORDING_NAME, context)) .thenThrow(new IllegalArgumentException()); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - Duration.ofMillis(1), - true); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + Duration.ofMillis(1), + true); assertThrows(IllegalArgumentException.class, () -> system.start()); } @Test public void testShutdown() throws Exception { - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ZERO, - Duration.ofMillis(300), - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ZERO, + Duration.ofMillis(300), + false, + scheduler, + threadLocalRandom); startProfilingSystem(system); verify(controller).createRecording(any(), any()); system.shutdown(); @@ -210,18 +218,17 @@ public void testShutdown() throws Exception { @Test public void testShutdownWithRunningProfilingRecording() throws Exception { - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ZERO, - Duration.ofMillis(300), - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ZERO, + Duration.ofMillis(300), + false, + scheduler, + threadLocalRandom); startProfilingSystem(system); verify(controller).createRecording(any(), any()); system.shutdown(); @@ -232,19 +239,17 @@ public void testShutdownWithRunningProfilingRecording() throws Exception { @Test public void testShutdownWithSnapshotOnShutdown() throws Exception { - final ProfilingSystem system = - spy( - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ZERO, - Duration.ofMillis(300), - false, - scheduler, - threadLocalRandom)); + final ProfilingSystem system = spy(new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ZERO, + Duration.ofMillis(300), + false, + scheduler, + threadLocalRandom)); final ProfilingSystem.SnapshotRecording snapshotRecording = spy(system.createSnapshotRecording(Instant.now())); @@ -260,18 +265,17 @@ public void testShutdownWithSnapshotOnShutdown() throws Exception { @Test public void testForceEarlySTartup() throws Exception { - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ZERO, - Duration.ofMillis(300), - true, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ZERO, + Duration.ofMillis(300), + true, + scheduler, + threadLocalRandom); system.start(); assertTrue(system.isStarted()); verify(controller).createRecording(any(), any()); @@ -280,34 +284,32 @@ public void testForceEarlySTartup() throws Exception { @Test public void testShutdownInterruption() throws Exception { final Thread mainThread = Thread.currentThread(); - doAnswer( - (InvocationOnMock invocation) -> { - while (!scheduler.isShutdown()) { - try { - Thread.sleep(100); - } catch (final InterruptedException e) { - // Ignore InterruptedException to make sure this threads lives through executor - // shutdown - } - } - // Interrupting main thread to make sure this is handled properly - mainThread.interrupt(); - return null; - }) + doAnswer((InvocationOnMock invocation) -> { + while (!scheduler.isShutdown()) { + try { + Thread.sleep(100); + } catch (final InterruptedException e) { + // Ignore InterruptedException to make sure this threads lives through executor + // shutdown + } + } + // Interrupting main thread to make sure this is handled properly + mainThread.interrupt(); + return null; + }) .when(listener) .onNewData(any(), any(), anyBoolean()); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - Duration.ofMillis(100), - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + Duration.ofMillis(100), + false, + scheduler, + threadLocalRandom); startProfilingSystem(system); // Make sure we actually started the recording before terminating verify(controller, timeout(300)).createRecording(any(), any()); @@ -317,34 +319,32 @@ public void testShutdownInterruption() throws Exception { @Test public void testCanShutDownWithoutStarting() throws ConfigurationException { - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - Duration.ofMillis(300), - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + Duration.ofMillis(300), + false, + scheduler, + threadLocalRandom); system.shutdown(); assertTrue(scheduler.isShutdown()); } @Test public void testDoesntSendDataIfNotStarted() throws Exception { - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - Duration.ofMillis(1), - false); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + Duration.ofMillis(1), + false); Thread.sleep(50); system.shutdown(); verify(controller, never()).createRecording(any(), any()); @@ -355,16 +355,15 @@ public void testDoesntSendDataIfNotStarted() throws Exception { public void testDoesntSendPeriodicRecordingIfPeriodicRecordingIsDisabled() throws InterruptedException, ConfigurationException { when(recording.snapshot(any(), any())).thenReturn(recordingData); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - Duration.ofMillis(10), - false); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + Duration.ofMillis(10), + false); startProfilingSystem(system); Thread.sleep(200); system.shutdown(); @@ -373,53 +372,47 @@ public void testDoesntSendPeriodicRecordingIfPeriodicRecordingIsDisabled() @Test public void testProfilingSystemNegativeStartupDelay() { - assertThrows( - ConfigurationException.class, - () -> { - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(-10), - Duration.ZERO, - Duration.ofMillis(200), - false); - }); + assertThrows(ConfigurationException.class, () -> { + new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(-10), + Duration.ZERO, + Duration.ofMillis(200), + false); + }); } @Test public void testProfilingSystemNegativeStartupRandomRangeDelay() { - assertThrows( - ConfigurationException.class, - () -> { - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(-20), - Duration.ofMillis(200), - false); - }); + assertThrows(ConfigurationException.class, () -> { + new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(-20), + Duration.ofMillis(200), + false); + }); } @Test public void testProfilingSystemNegativeUploadPeriod() { - assertThrows( - ConfigurationException.class, - () -> { - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(20), - Duration.ofMillis(-200), - false); - }); + assertThrows(ConfigurationException.class, () -> { + new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(20), + Duration.ofMillis(-200), + false); + }); } /** Ensure that we continue recording after one recording fails to get created */ @@ -431,18 +424,17 @@ public void testRecordingSnapshotError() throws ConfigurationException { .thenThrow(new RuntimeException("Test")) .thenAnswer(generateMockRecordingData(generatedRecordingData)); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - uploadPeriod, - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + uploadPeriod, + false, + scheduler, + threadLocalRandom); startProfilingSystem(system); final ArgumentCaptor captor = ArgumentCaptor.forClass(RecordingData.class); @@ -461,18 +453,17 @@ public void testRecordingSnapshotNoData() throws ConfigurationException { .thenReturn(null) .thenAnswer(generateMockRecordingData(generatedRecordingData)); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - Duration.ofMillis(10), - Duration.ofMillis(5), - uploadPeriod, - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + Duration.ofMillis(10), + Duration.ofMillis(5), + uploadPeriod, + false, + scheduler, + threadLocalRandom); startProfilingSystem(system); final ArgumentCaptor captor = ArgumentCaptor.forClass(RecordingData.class); @@ -492,18 +483,17 @@ public void testRandomizedStartupDelay() throws ConfigurationException { when(threadLocalRandom.nextLong(startupDelayRandomRange.toMillis())) .thenReturn(additionalRandomDelay.toMillis()); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - startupDelay, - startupDelayRandomRange, - Duration.ofMillis(100), - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + startupDelay, + startupDelayRandomRange, + Duration.ofMillis(100), + false, + scheduler, + threadLocalRandom); final Duration randomizedDelay = system.getStartupDelay(); @@ -514,18 +504,17 @@ public void testRandomizedStartupDelay() throws ConfigurationException { public void testFixedStartupDelay() throws ConfigurationException { final Duration startupDelay = Duration.ofMillis(100); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - startupDelay, - Duration.ZERO, - Duration.ofMillis(100), - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + startupDelay, + Duration.ZERO, + Duration.ofMillis(100), + false, + scheduler, + threadLocalRandom); assertEquals(startupDelay, system.getStartupDelay()); } @@ -537,18 +526,17 @@ public void testEarlyShutdownException() throws Exception { final Duration startupDelay = Duration.ofMillis(1); - final ProfilingSystem system = - new ProfilingSystem( - configProvider, - controller, - context, - listener, - startupDelay, - Duration.ZERO, - Duration.ofMillis(100), - false, - scheduler, - threadLocalRandom); + final ProfilingSystem system = new ProfilingSystem( + configProvider, + controller, + context, + listener, + startupDelay, + Duration.ZERO, + Duration.ofMillis(100), + false, + scheduler, + threadLocalRandom); system.start(); Thread.sleep(200); diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java index 897b12d1334..fd6043394c9 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java @@ -220,9 +220,8 @@ void reset() { private DatadogProfiler(ConfigProvider configProvider) { this.configProvider = configProvider; this.profiler = DdprofLibraryLoader.javaProfiler().getComponent(); - this.detailedDebugLogging = - configProvider.getBoolean( - PROFILING_DETAILED_DEBUG_LOGGING, PROFILING_DETAILED_DEBUG_LOGGING_DEFAULT); + this.detailedDebugLogging = configProvider.getBoolean( + PROFILING_DETAILED_DEBUG_LOGGING, PROFILING_DETAILED_DEBUG_LOGGING_DEFAULT); Throwable reasonNotLoaded = DdprofLibraryLoader.javaProfiler().getReasonNotLoaded(); if (reasonNotLoaded != null) { throw new UnsupportedOperationException( @@ -266,10 +265,8 @@ private DatadogProfiler(ConfigProvider configProvider) { } this.isAppOffset = appOffsets; this.hasAppContext = anyApp; - this.queueTimeThresholdMillis = - configProvider.getLong( - PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS, - PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS_DEFAULT); + this.queueTimeThresholdMillis = configProvider.getLong( + PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS, PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS_DEFAULT); this.recordingsPath = TempLocationManager.getInstance().getTempDir().resolve("recordings"); if (!Files.exists(recordingsPath)) { @@ -433,10 +430,9 @@ String cmdStartProfiling(Path file) throws IllegalStateException { // using cpu time schedule int interval = getCpuInterval(); if (JavaVirtualMachine.isJ9()) - interval = - interval == ProfilingConfig.PROFILING_DATADOG_PROFILER_CPU_INTERVAL_DEFAULT - ? ProfilingConfig.PROFILING_DATADOG_PROFILER_J9_CPU_INTERVAL_DEFAULT - : interval; + interval = interval == ProfilingConfig.PROFILING_DATADOG_PROFILER_CPU_INTERVAL_DEFAULT + ? ProfilingConfig.PROFILING_DATADOG_PROFILER_J9_CPU_INTERVAL_DEFAULT + : interval; cmd.append(",cpu=").append(interval).append('m'); } } diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java index b54b069fe55..802506212b7 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java @@ -188,12 +188,11 @@ public static boolean isAllocationProfilingEnabled(ConfigProvider configProvider // JVMTI Allocation Sampler is available since Java 11 if (JavaVirtualMachine.isJavaVersionAtLeast(11)) { boolean dflt = isJmethodIDSafe(); - boolean enableDdprofAlloc = - getBoolean( - configProvider, - PROFILING_ALLOCATION_ENABLED, - dflt, - PROFILING_DATADOG_PROFILER_ALLOC_ENABLED); + boolean enableDdprofAlloc = getBoolean( + configProvider, + PROFILING_ALLOCATION_ENABLED, + dflt, + PROFILING_DATADOG_PROFILER_ALLOC_ENABLED); if (!dflt && enableDdprofAlloc) { log.warn( @@ -228,21 +227,18 @@ public static boolean isMemoryLeakProfilingEnabled(ConfigProvider configProvider // JVMTI Allocation Sampler is required for ddprof live heap and is available since Java 11. // isJmethodIDSafe() alone is not sufficient — Java 8 is jmethodID-safe but lacks the sampler. boolean isSafe = JavaVirtualMachine.isJavaVersionAtLeast(11) && isJmethodIDSafe(); - boolean enableDdprofMemleak = - getBoolean( - configProvider, - PROFILING_DATADOG_PROFILER_LIVEHEAP_ENABLED, - isSafe, - PROFILING_DATADOG_PROFILER_MEMLEAK_ENABLED); + boolean enableDdprofMemleak = getBoolean( + configProvider, + PROFILING_DATADOG_PROFILER_LIVEHEAP_ENABLED, + isSafe, + PROFILING_DATADOG_PROFILER_MEMLEAK_ENABLED); if (!isSafe && enableDdprofMemleak) { - log.warn( - "Live heap profiling (ddprof) was enabled although it is not considered stable" - + " on this JVM version."); + log.warn("Live heap profiling (ddprof) was enabled although it is not considered stable" + + " on this JVM version."); } if (!enableDdprofMemleak && !isOldObjectSampleAvailable()) { - log.warn( - "ddprof live heap profiling is disabled and JFR OldObjectSample is not available" - + " on this JVM. Live heap profiling will be inactive."); + log.warn("ddprof live heap profiling is disabled and JFR OldObjectSample is not available" + + " on this JVM. Live heap profiling will be inactive."); } return enableDdprofMemleak; } @@ -367,11 +363,10 @@ public static int getSafeMode() { } public static String getCStack(ConfigProvider configProvider) { - String cstack = - getString( - configProvider, - PROFILING_DATADOG_PROFILER_CSTACK, - PROFILING_DATADOG_PROFILER_CSTACK_DEFAULT); + String cstack = getString( + configProvider, + PROFILING_DATADOG_PROFILER_CSTACK, + PROFILING_DATADOG_PROFILER_CSTACK_DEFAULT); if (cstack.startsWith("vm") && !(JavaVirtualMachine.isHotspot())) { // can't use the VM stackwalking on non-hotspot VMs // fall-back to 'dwarf' unwinding diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilingIntegration.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilingIntegration.java index 45f5f5fb015..32589997b3b 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilingIntegration.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilingIntegration.java @@ -28,33 +28,32 @@ public class DatadogProfilingIntegration implements ProfilingContextIntegration private static final boolean IS_PROFILING_QUEUEING_TIME_ENABLED = DatadogProfilerConfig.isQueueTimeEnabled(); - private final Stateful contextManager = - new Stateful() { - @Override - public void close() { - // clearTraceContext wipes all custom slots (incl. operation/resource) and reapplies - // app-managed context, so no separate clearContextValue calls are needed. - DDPROF.clearTraceContext(); - } - - @Override - public void activate(Object context) { - if (context instanceof ProfilerContext) { - ProfilerContext profilerContext = (ProfilerContext) context; - // One native call: trace/span context + operation and resource attributes, then - // reapply of app-managed context (setTraceContext resets custom slots). - DDPROF.setTraceContext( - profilerContext.getRootSpanId(), - profilerContext.getSpanId(), - profilerContext.getTraceIdHigh(), - profilerContext.getTraceIdLow(), - SPAN_NAME_INDEX, - profilerContext.getOperationName(), - RESOURCE_NAME_INDEX, - profilerContext.getResourceName()); - } - } - }; + private final Stateful contextManager = new Stateful() { + @Override + public void close() { + // clearTraceContext wipes all custom slots (incl. operation/resource) and reapplies + // app-managed context, so no separate clearContextValue calls are needed. + DDPROF.clearTraceContext(); + } + + @Override + public void activate(Object context) { + if (context instanceof ProfilerContext) { + ProfilerContext profilerContext = (ProfilerContext) context; + // One native call: trace/span context + operation and resource attributes, then + // reapply of app-managed context (setTraceContext resets custom slots). + DDPROF.setTraceContext( + profilerContext.getRootSpanId(), + profilerContext.getSpanId(), + profilerContext.getTraceIdHigh(), + profilerContext.getTraceIdLow(), + SPAN_NAME_INDEX, + profilerContext.getOperationName(), + RESOURCE_NAME_INDEX, + profilerContext.getResourceName()); + } + } + }; @Override public Stateful newScopeState(ProfilerContext profilerContext) { diff --git a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java index c09e6ce8fb9..0b7d399112a 100644 --- a/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java +++ b/dd-java-agent/agent-profiling/profiling-ddprof/src/test/java/com/datadog/profiling/ddprof/DatadogProfilerTest.java @@ -103,9 +103,8 @@ void testStartCmd(boolean cpu, boolean wall, boolean alloc, boolean memleak) thr private static Stream profilingModes() { return IntStream.range(0, 1 << 4) - .mapToObj( - x -> - Arguments.of((x & 0x1000) != 0, (x & 0x100) != 0, (x & 0x10) != 0, (x & 0x1) != 0)); + .mapToObj(x -> + Arguments.of((x & 0x1000) != 0, (x & 0x100) != 0, (x & 0x10) != 0, (x & 0x1) != 0)); } @Test diff --git a/dd-java-agent/agent-profiling/profiling-scrubber/src/main/java/com/datadog/profiling/scrubber/DefaultScrubDefinition.java b/dd-java-agent/agent-profiling/profiling-scrubber/src/main/java/com/datadog/profiling/scrubber/DefaultScrubDefinition.java index a625041150f..00c86e48a76 100644 --- a/dd-java-agent/agent-profiling/profiling-scrubber/src/main/java/com/datadog/profiling/scrubber/DefaultScrubDefinition.java +++ b/dd-java-agent/agent-profiling/profiling-scrubber/src/main/java/com/datadog/profiling/scrubber/DefaultScrubDefinition.java @@ -35,18 +35,16 @@ public final class DefaultScrubDefinition { * @return a configured {@link JfrScrubber} */ public static JfrScrubber create(List excludeEventTypes) { - Set excludeSet = - excludeEventTypes != null - ? new HashSet<>(excludeEventTypes) - : Collections.emptySet(); + Set excludeSet = excludeEventTypes != null + ? new HashSet<>(excludeEventTypes) + : Collections.emptySet(); - return new JfrScrubber( - eventTypeName -> { - if (excludeSet.contains(eventTypeName)) { - return null; - } - return DEFAULT_SCRUB_FIELDS.get(eventTypeName); - }); + return new JfrScrubber(eventTypeName -> { + if (excludeSet.contains(eventTypeName)) { + return null; + } + return DEFAULT_SCRUB_FIELDS.get(eventTypeName); + }); } private DefaultScrubDefinition() {} diff --git a/dd-java-agent/agent-profiling/profiling-scrubber/src/test/java/com/datadog/profiling/scrubber/JfrScrubberTest.java b/dd-java-agent/agent-profiling/profiling-scrubber/src/test/java/com/datadog/profiling/scrubber/JfrScrubberTest.java index 00503c71251..ac6a659da34 100644 --- a/dd-java-agent/agent-profiling/profiling-scrubber/src/test/java/com/datadog/profiling/scrubber/JfrScrubberTest.java +++ b/dd-java-agent/agent-profiling/profiling-scrubber/src/test/java/com/datadog/profiling/scrubber/JfrScrubberTest.java @@ -24,7 +24,8 @@ class JfrScrubberTest { - @TempDir Path tempDir; + @TempDir + Path tempDir; private Path inputFile; diff --git a/dd-java-agent/agent-profiling/profiling-testing/src/main/java/com/datadog/profiling/testing/ProfilingTestUtils.java b/dd-java-agent/agent-profiling/profiling-testing/src/main/java/com/datadog/profiling/testing/ProfilingTestUtils.java index 6ad32081c38..4a9749c98f8 100644 --- a/dd-java-agent/agent-profiling/profiling-testing/src/main/java/com/datadog/profiling/testing/ProfilingTestUtils.java +++ b/dd-java-agent/agent-profiling/profiling-testing/src/main/java/com/datadog/profiling/testing/ProfilingTestUtils.java @@ -20,12 +20,11 @@ public static Multimap parseProfilingRequestParameters( .stream() .collect( ImmutableMultimap::builder, - (builder, value) -> - builder.put( - value.getFieldName(), - OCTET_STREAM.toString().equals(value.getContentType()) - ? value.get() - : value.getString()), + (builder, value) -> builder.put( + value.getFieldName(), + OCTET_STREAM.toString().equals(value.getContentType()) + ? value.get() + : value.getString()), (builder1, builder2) -> builder1.putAll(builder2.build())) .build(); } diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/CompressingRequestBody.java b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/CompressingRequestBody.java index ec4458ed070..d2d7296f7a2 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/CompressingRequestBody.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/CompressingRequestBody.java @@ -229,29 +229,26 @@ long getWrittenBytes() { private void attemptWrite(@Nonnull InputStream inputStream, @Nonnull OutputStream outputStream) throws IOException { - try (OutputStream sinkStream = - isCompressed(inputStream) - ? new BufferedOutputStream(outputStream) { - @Override - public void close() throws IOException { - // Do not propagate close; call 'flush()' instead. - // Compression streams must be 'closed' because they finalize the - // compression - // in that method. - flush(); - } - } - : new BufferedOutputStream( - outputStreamMapper.apply( - new BufferedOutputStream(outputStream) { - @Override - public void close() throws IOException { - // Do not propagate close; call 'flush()' instead. - // Compression streams must be 'closed' because they finalize the - // compression in that method. - flush(); - } - }))) { + try (OutputStream sinkStream = isCompressed(inputStream) + ? new BufferedOutputStream(outputStream) { + @Override + public void close() throws IOException { + // Do not propagate close; call 'flush()' instead. + // Compression streams must be 'closed' because they finalize the + // compression + // in that method. + flush(); + } + } + : new BufferedOutputStream(outputStreamMapper.apply(new BufferedOutputStream(outputStream) { + @Override + public void close() throws IOException { + // Do not propagate close; call 'flush()' instead. + // Compression streams must be 'closed' because they finalize the + // compression in that method. + flush(); + } + }))) { BufferedSink sink = Okio.buffer(Okio.sink(sinkStream)); try (Source source = Okio.buffer(Okio.source(inputStream))) { sink.writeAll(source); @@ -356,24 +353,20 @@ private static OutputStreamMappingFunction getOutputStreamMapper( } switch (compressionType) { - case GZIP: - { - return GZIPOutputStream::new; - } - case OFF: - { - return out -> out; - } - case LZ4: - { - return CompressingRequestBody::toLz4Stream; - } + case GZIP: { + return GZIPOutputStream::new; + } + case OFF: { + return out -> out; + } + case LZ4: { + return CompressingRequestBody::toLz4Stream; + } case ON: case ZSTD: - default: - { - return CompressingRequestBody::toZstdStream; - } + default: { + return CompressingRequestBody::toZstdStream; + } } } diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ProfileUploader.java b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ProfileUploader.java index 86ea3f6e3e0..47e322c4273 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ProfileUploader.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/ProfileUploader.java @@ -99,19 +99,14 @@ public final class ProfileUploader { private static final String JAVA_TRACING_LIBRARY = "dd-trace-java"; - private static final Headers EVENT_HEADER = - Headers.of( - "Content-Disposition", - "form-data; name=\"" + V4_EVENT_NAME + "\"; filename=\"" + V4_EVENT_FILENAME + "\""); - - private static final Headers V4_DATA_HEADERS = - Headers.of( - "Content-Disposition", - "form-data; name=\"" - + V4_ATTACHMENT_NAME - + "\"; filename=\"" - + V4_ATTACHMENT_FILENAME - + "\""); + private static final Headers EVENT_HEADER = Headers.of( + "Content-Disposition", + "form-data; name=\"" + V4_EVENT_NAME + "\"; filename=\"" + V4_EVENT_FILENAME + "\""); + + private static final Headers V4_DATA_HEADERS = Headers.of( + "Content-Disposition", + "form-data; name=\"" + V4_ATTACHMENT_NAME + "\"; filename=\"" + V4_ATTACHMENT_FILENAME + + "\""); static final String SERVELESS_TAG = "functionname"; @@ -181,33 +176,30 @@ public ProfileUploader(final Config config, final ConfigProvider configProvider) // Comma separated tags string for V2.4 format Pattern quotes = Pattern.compile("\""); - jsonAdapter = - new RecordingDataAdapter( - quotes.matcher(String.join(",", tagsToList(tagsMap))).replaceAll("")); + jsonAdapter = new RecordingDataAdapter( + quotes.matcher(String.join(",", tagsToList(tagsMap))).replaceAll("")); uploadTimeout = Duration.ofSeconds(config.getProfilingUploadTimeout()); // This is the same thing OkHttp Dispatcher is doing except thread naming and daemonization - okHttpExecutorService = - new ThreadPoolExecutor( - 0, - Integer.MAX_VALUE, - 60, - TimeUnit.SECONDS, - new SynchronousQueue<>(), - new AgentThreadFactory(PROFILER_HTTP_DISPATCHER)); - - client = - OkHttpUtils.buildHttpClient( - config, - new Dispatcher(okHttpExecutorService), - url, - true, - MAX_RUNNING_REQUESTS, - config.getProfilingProxyHost(), - config.getProfilingProxyPort(), - config.getProfilingProxyUsername(), - config.getProfilingProxyPassword(), - uploadTimeout.toMillis()); + okHttpExecutorService = new ThreadPoolExecutor( + 0, + Integer.MAX_VALUE, + 60, + TimeUnit.SECONDS, + new SynchronousQueue<>(), + new AgentThreadFactory(PROFILER_HTTP_DISPATCHER)); + + client = OkHttpUtils.buildHttpClient( + config, + new Dispatcher(okHttpExecutorService), + url, + true, + MAX_RUNNING_REQUESTS, + config.getProfilingProxyHost(), + config.getProfilingProxyPort(), + config.getProfilingProxyUsername(), + config.getProfilingProxyPassword(), + uploadTimeout.toMillis()); compressionType = CompressionType.of(config.getProfilingUploadCompression()); } @@ -273,24 +265,23 @@ public void upload( CountDownLatch latch = new CountDownLatch(sync ? 1 : 0); AtomicBoolean handled = new AtomicBoolean(false); - call.enqueue( - new Callback() { - @Override - public void onResponse(final Call call, final Response response) throws IOException { - if (handled.compareAndSet(false, true)) { - handleResponse(call, response, data, onCompletion); - latch.countDown(); - } - } + call.enqueue(new Callback() { + @Override + public void onResponse(final Call call, final Response response) throws IOException { + if (handled.compareAndSet(false, true)) { + handleResponse(call, response, data, onCompletion); + latch.countDown(); + } + } - @Override - public void onFailure(final Call call, final IOException e) { - if (handled.compareAndSet(false, true)) { - handleFailure(call, e, data, onCompletion); - latch.countDown(); - } - } - }); + @Override + public void onFailure(final Call call, final IOException e) { + if (handled.compareAndSet(false, true)) { + handleFailure(call, e, data, onCompletion); + latch.countDown(); + } + } + }); if (sync) { try { log.debug("Waiting at most {} seconds for upload to finish", uploadTimeout.plusSeconds(1)); @@ -318,10 +309,9 @@ private void handleFailure( final RecordingData data, @Nonnull final Runnable onCompletion) { if (isEmptyReplyFromServer(e)) { - ioLogger.error( - "Failed to upload profile, received empty reply from " - + call.request().url() - + " after uploading profile"); + ioLogger.error("Failed to upload profile, received empty reply from " + + call.request().url() + + " after uploading profile"); } else { ioLogger.error("Failed to upload profile to " + call.request().url(), e); } @@ -367,7 +357,9 @@ private IOLogger.Response getLoggerResponse(final okhttp3.Response response) { try { final ResponseBody body = response.body(); return new IOLogger.Response( - response.code(), response.message(), body == null ? "" : body.string().trim()); + response.code(), + response.message(), + body == null ? "" : body.string().trim()); } catch (final NullPointerException | IOException ignored) { } } @@ -426,8 +418,9 @@ private Call makeRequest(@Nonnull final RecordingType type, @Nonnull final Recor headers.put(HEADER_DD_EVP_ORIGIN, JAVA_TRACING_LIBRARY); headers.put(HEADER_DD_EVP_ORIGIN_VERSION, VersionInfo.VERSION); - return client.newCall( - OkHttpUtils.prepareRequest(url, headers, config, agentless).post(requestBody).build()); + return client.newCall(OkHttpUtils.prepareRequest(url, headers, config, agentless) + .post(requestBody) + .build()); } private boolean canEnqueueMoreRequests() { diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java index 3a306e4105b..bdb480340e6 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java @@ -29,14 +29,13 @@ /** Call the `jfr` cli on the given recording */ public class JfrCliHelper { - private static ExecutorService executorService = - new ThreadPoolExecutor( - 0, - Integer.MAX_VALUE, - 60, - TimeUnit.SECONDS, - new SynchronousQueue<>(), - new AgentThreadFactory(PROFILER_HTTP_DISPATCHER)); + private static ExecutorService executorService = new ThreadPoolExecutor( + 0, + Integer.MAX_VALUE, + 60, + TimeUnit.SECONDS, + new SynchronousQueue<>(), + new AgentThreadFactory(PROFILER_HTTP_DISPATCHER)); private static Pattern lineSeparatorRegex = Pattern.compile(System.lineSeparator()); private static Pattern metadataSeparatorRegex = Pattern.compile("^=+$"); @@ -71,12 +70,10 @@ public static void invokeOn(final RecordingData data, final IOLogger ioLogger) { Process process = builder.start(); try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { - Future asyncRedirect = - executorService.submit( - () -> { - redirect(process.getInputStream(), out); - return true; - }); + Future asyncRedirect = executorService.submit(() -> { + redirect(process.getInputStream(), out); + return true; + }); if (!process.waitFor(30, TimeUnit.SECONDS)) { ioLogger.error("Failed to gather information on recording, `jfr` never finished"); @@ -127,13 +124,11 @@ public static void invokeOn(final RecordingData data, final IOLogger ioLogger) { events.stream() .sorted(Comparator.comparing(Event::getSize).reversed()) .limit(10) - .forEach( - event -> { - ioLogger.error( - String.format( - "Event: %s, size = %d, count = %d", - event.getType(), event.getSize(), event.getCount())); - }); + .forEach(event -> { + ioLogger.error(String.format( + "Event: %s, size = %d, count = %d", + event.getType(), event.getSize(), event.getCount())); + }); } catch (Exception e) { ioLogger.error("Failed to gather information on recording", e); return; diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/CompressingRequestBodyTest.java b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/CompressingRequestBodyTest.java index 952a73a44af..f6054dd80b8 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/CompressingRequestBodyTest.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/CompressingRequestBodyTest.java @@ -48,18 +48,16 @@ static void setupAll() throws Exception { @ParameterizedTest @EnumSource(CompressionType.class) void contentLength(CompressionType compressionType) throws Exception { - CompressingRequestBody instance = - new CompressingRequestBody( - compressionType, mock(CompressingRequestBody.InputStreamSupplier.class)); + CompressingRequestBody instance = new CompressingRequestBody( + compressionType, mock(CompressingRequestBody.InputStreamSupplier.class)); assertEquals(-1, instance.contentLength()); } @ParameterizedTest @EnumSource(CompressionType.class) void contentType(CompressionType compressionType) { - CompressingRequestBody instance = - new CompressingRequestBody( - compressionType, mock(CompressingRequestBody.InputStreamSupplier.class)); + CompressingRequestBody instance = new CompressingRequestBody( + compressionType, mock(CompressingRequestBody.InputStreamSupplier.class)); assertEquals(CompressingRequestBody.OCTET_STREAM, instance.contentType()); } @@ -109,15 +107,12 @@ private CompressingRequestBody.InputStreamSupplier faultySupplier(int failingAtt CompressingRequestBody.InputStreamSupplier supplier = mock(CompressingRequestBody.InputStreamSupplier.class); AtomicInteger invocationCounter = new AtomicInteger(failingAttempts); - when(supplier.get()) - .then( - (Answer) - invocation -> { - if (invocationCounter.getAndDecrement() > 0) { - throw new IllegalStateException(); - } - return testRecordingStream(); - }); + when(supplier.get()).then((Answer) invocation -> { + if (invocationCounter.getAndDecrement() > 0) { + throw new IllegalStateException(); + } + return testRecordingStream(); + }); return supplier; } @@ -127,81 +122,73 @@ private CompressingRequestBody.InputStreamSupplier faultyStreamSupplier(int fail mock(CompressingRequestBody.InputStreamSupplier.class); AtomicInteger invocationCounter = new AtomicInteger(failingAttempts); - when(supplier.get()) - .then( - (Answer) - invocation -> - new BufferedInputStream(testRecordingStream()) { - int byteCounter = 300; // read first 300 bytes without error + when(supplier.get()).then((Answer) + invocation -> new BufferedInputStream(testRecordingStream()) { + int byteCounter = 300; // read first 300 bytes without error - @Override - public synchronized int read() throws IOException { - if (--byteCounter <= 0 && invocationCounter.getAndDecrement() > 0) { - throw new IllegalStateException(); - } - return super.read(); - } + @Override + public synchronized int read() throws IOException { + if (--byteCounter <= 0 && invocationCounter.getAndDecrement() > 0) { + throw new IllegalStateException(); + } + return super.read(); + } - @Override - public synchronized int read(byte[] b, int off, int len) throws IOException { - byteCounter -= len; - if (byteCounter <= 0 && invocationCounter.getAndDecrement() > 0) { - throw new IllegalStateException(); - } - return super.read(b, off, len); - } - }); + @Override + public synchronized int read(byte[] b, int off, int len) throws IOException { + byteCounter -= len; + if (byteCounter <= 0 && invocationCounter.getAndDecrement() > 0) { + throw new IllegalStateException(); + } + return super.read(b, off, len); + } + }); return supplier; } @ParameterizedTest @EnumSource(CompressionType.class) void writeTo(CompressionType compressionType) throws IOException { - CompressingRequestBody instance = - new CompressingRequestBody( - compressionType, CompressingRequestBodyTest::testRecordingStream); + CompressingRequestBody instance = new CompressingRequestBody( + compressionType, CompressingRequestBodyTest::testRecordingStream); byte[] compressed = instanceWriteAsBytes(instance); BufferedInputStream compressedStream = new BufferedInputStream(new ByteArrayInputStream(compressed)); switch (compressionType) { - case OFF: - { - assertFalse(CompressingRequestBody.isCompressed(compressedStream)); - assertArrayEquals(recordingData, compressed); - assertEquals(recordingData.length, instance.getReadBytes()); - assertEquals(recordingData.length, instance.getWrittenBytes()); - break; - } - case LZ4: - { - assertTrue(CompressingRequestBody.isLz4(compressedStream)); - byte[] uncompressed = IOUtils.toByteArray(new LZ4FrameInputStream(compressedStream)); - assertArrayEquals(recordingData, uncompressed); - assertEquals(recordingData.length, instance.getReadBytes()); - assertEquals(compressed.length, instance.getWrittenBytes()); - break; - } - case GZIP: - { - assertTrue(CompressingRequestBody.isGzip(compressedStream)); - byte[] uncompressed = IOUtils.toByteArray(new GZIPInputStream(compressedStream)); - assertArrayEquals(recordingData, uncompressed); - assertEquals(recordingData.length, instance.getReadBytes()); - assertEquals(compressed.length, instance.getWrittenBytes()); - break; - } + case OFF: { + assertFalse(CompressingRequestBody.isCompressed(compressedStream)); + assertArrayEquals(recordingData, compressed); + assertEquals(recordingData.length, instance.getReadBytes()); + assertEquals(recordingData.length, instance.getWrittenBytes()); + break; + } + case LZ4: { + assertTrue(CompressingRequestBody.isLz4(compressedStream)); + byte[] uncompressed = IOUtils.toByteArray(new LZ4FrameInputStream(compressedStream)); + assertArrayEquals(recordingData, uncompressed); + assertEquals(recordingData.length, instance.getReadBytes()); + assertEquals(compressed.length, instance.getWrittenBytes()); + break; + } + case GZIP: { + assertTrue(CompressingRequestBody.isGzip(compressedStream)); + byte[] uncompressed = IOUtils.toByteArray(new GZIPInputStream(compressedStream)); + assertArrayEquals(recordingData, uncompressed); + assertEquals(recordingData.length, instance.getReadBytes()); + assertEquals(compressed.length, instance.getWrittenBytes()); + break; + } case ON: - case ZSTD: - { - assertTrue(CompressingRequestBody.isZstd(compressedStream)); - byte[] uncompressed = IOUtils.toByteArray(new ZstdInputStream(compressedStream)); - assertArrayEquals(recordingData, uncompressed); - assertEquals(recordingData.length, instance.getReadBytes()); - assertEquals(compressed.length, instance.getWrittenBytes()); - break; - } + case ZSTD: { + assertTrue(CompressingRequestBody.isZstd(compressedStream)); + byte[] uncompressed = IOUtils.toByteArray(new ZstdInputStream(compressedStream)); + assertArrayEquals(recordingData, uncompressed); + assertEquals(recordingData.length, instance.getReadBytes()); + assertEquals(compressed.length, instance.getWrittenBytes()); + break; + } } } @@ -216,21 +203,18 @@ void writeToRecompression(CompressionType targetType) throws IOException { } switch (type) { case LZ4: - case ON: - { - compressedStream = new LZ4FrameOutputStream(baos); - break; - } - case GZIP: - { - compressedStream = new GZIPOutputStream(baos); - break; - } - case ZSTD: - { - compressedStream = new ZstdOutputStream(baos); - break; - } + case ON: { + compressedStream = new LZ4FrameOutputStream(baos); + break; + } + case GZIP: { + compressedStream = new GZIPOutputStream(baos); + break; + } + case ZSTD: { + compressedStream = new ZstdOutputStream(baos); + break; + } } assertNotNull(compressedStream); @@ -239,10 +223,8 @@ void writeToRecompression(CompressionType targetType) throws IOException { byte[] compressedInput = baos.toByteArray(); - CompressingRequestBody instance = - new CompressingRequestBody( - targetType, - () -> new RecordingInputStream(new ByteArrayInputStream(compressedInput))); + CompressingRequestBody instance = new CompressingRequestBody( + targetType, () -> new RecordingInputStream(new ByteArrayInputStream(compressedInput))); byte[] compressedOutput = instanceWriteAsBytes(instance); assertArrayEquals(compressedInput, compressedOutput); diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ProfileUploaderTest.java b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ProfileUploaderTest.java index f29d3186e9b..a0a4bff0890 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ProfileUploaderTest.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ProfileUploaderTest.java @@ -123,16 +123,16 @@ public class ProfileUploaderTest { } // We sort tags to have expected parameters to have expected result - private static final Map EXPECTED_TAGS = - new ImmutableMap.Builder() - .put("baz", "123") - .put("foo", "bar") - .put(SERVELESS_TAG, FUNCTION_NAME) - .put("quoted", "quoted") - .put(DDTags.PID_TAG, PidHelper.getPid()) - .put(VersionInfo.PROFILER_VERSION_TAG, VersionInfo.VERSION) - .put(VersionInfo.LIBRARY_VERSION_TAG, VersionInfo.VERSION) - .build(); + private static final Map EXPECTED_TAGS = new ImmutableMap.Builder< + String, String>() + .put("baz", "123") + .put("foo", "bar") + .put(SERVELESS_TAG, FUNCTION_NAME) + .put("quoted", "quoted") + .put(DDTags.PID_TAG, PidHelper.getPid()) + .put(VersionInfo.PROFILER_VERSION_TAG, VersionInfo.VERSION) + .put(VersionInfo.LIBRARY_VERSION_TAG, VersionInfo.VERSION) + .build(); private static final int SEQUENCE_NUMBER = 123; private static final int PROFILE_START = 1000; @@ -148,9 +148,14 @@ public class ProfileUploaderTest { private final Duration FOREVER_REQUEST_TIMEOUT = Duration.ofSeconds(1000); - @Mock private Config config; - @Mock private ConfigProvider configProvider; - @Mock private IOLogger ioLogger; + @Mock + private Config config; + + @Mock + private ConfigProvider configProvider; + + @Mock + private IOLogger ioLogger; private final MockWebServer server = new MockWebServer(); private HttpUrl url; @@ -172,9 +177,8 @@ public void setup() throws IOException { when(config.getProfilingUploadTimeout()).thenReturn((int) REQUEST_TIMEOUT.getSeconds()); when(config.isProfilingUploadSummaryOn413Enabled()).thenReturn(true); - uploader = - new ProfileUploader( - config, configProvider, ioLogger, (int) TERMINATION_TIMEOUT.getSeconds()); + uploader = new ProfileUploader( + config, configProvider, ioLogger, (int) TERMINATION_TIMEOUT.getSeconds()); } @AfterEach @@ -202,9 +206,8 @@ public void testHappyPath(ProfilingSnapshot.Kind kind) throws Exception { // Then assertEquals(url, recordedRequest.getRequestUrl()); - final List multiPartItems = - FileUpload.parse( - recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); + final List multiPartItems = FileUpload.parse( + recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); final FileItem rawEvent = multiPartItems.get(0); assertEquals(ProfileUploader.V4_EVENT_NAME, rawEvent.getFieldName()); @@ -223,14 +226,16 @@ public void testHappyPath(ProfilingSnapshot.Kind kind) throws Exception { final ObjectMapper mapper = new ObjectMapper(); final JsonNode event = mapper.readTree(rawEvent.getString()); - assertEquals(ProfileUploader.V4_ATTACHMENT_FILENAME, event.get("attachments").get(0).asText()); + assertEquals( + ProfileUploader.V4_ATTACHMENT_FILENAME, event.get("attachments").get(0).asText()); assertEquals(ProfileUploader.V4_FAMILY, event.get("family").asText()); assertEquals(ProfileUploader.V4_VERSION, event.get("version").asText()); assertEquals( Instant.ofEpochSecond(PROFILE_START).toString(), event.get(V4_PROFILE_START_PARAM).asText()); assertEquals( - Instant.ofEpochSecond(PROFILE_END).toString(), event.get(V4_PROFILE_END_PARAM).asText()); + Instant.ofEpochSecond(PROFILE_END).toString(), + event.get(V4_PROFILE_END_PARAM).asText()); Map expectedTags = new TreeMap<>(EXPECTED_TAGS); expectedTags.put("snapshot", kind.name().toLowerCase()); assertEquals( @@ -255,9 +260,8 @@ public void testHappyPathSync(ProfilingSnapshot.Kind kind) throws Exception { // Then assertEquals(url, recordedRequest.getRequestUrl()); - final List multiPartItems = - FileUpload.parse( - recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); + final List multiPartItems = FileUpload.parse( + recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); final FileItem rawEvent = multiPartItems.get(0); assertEquals(ProfileUploader.V4_EVENT_NAME, rawEvent.getFieldName()); @@ -276,14 +280,16 @@ public void testHappyPathSync(ProfilingSnapshot.Kind kind) throws Exception { final ObjectMapper mapper = new ObjectMapper(); final JsonNode event = mapper.readTree(rawEvent.getString()); - assertEquals(ProfileUploader.V4_ATTACHMENT_FILENAME, event.get("attachments").get(0).asText()); + assertEquals( + ProfileUploader.V4_ATTACHMENT_FILENAME, event.get("attachments").get(0).asText()); assertEquals(ProfileUploader.V4_FAMILY, event.get("family").asText()); assertEquals(ProfileUploader.V4_VERSION, event.get("version").asText()); assertEquals( Instant.ofEpochSecond(PROFILE_START).toString(), event.get(V4_PROFILE_START_PARAM).asText()); assertEquals( - Instant.ofEpochSecond(PROFILE_END).toString(), event.get(V4_PROFILE_END_PARAM).asText()); + Instant.ofEpochSecond(PROFILE_END).toString(), + event.get(V4_PROFILE_END_PARAM).asText()); Map expectedTags = new TreeMap<>(EXPECTED_TAGS); expectedTags.put("snapshot", kind.name().toLowerCase()); assertEquals( @@ -308,9 +314,8 @@ public void testZippedInput() throws Exception { assertNull(recordedRequest.getHeader("DD-API-KEY")); - final List multiPartItems = - FileUpload.parse( - recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); + final List multiPartItems = FileUpload.parse( + recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); final FileItem rawEvent = multiPartItems.get(0); assertEquals(ProfileUploader.V4_EVENT_NAME, rawEvent.getFieldName()); @@ -344,9 +349,8 @@ public void testCompression(final String compression) throws Exception { assertNull(recordedRequest.getHeader("DD-API-KEY")); - final List multiPartItems = - FileUpload.parse( - recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); + final List multiPartItems = FileUpload.parse( + recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); final FileItem rawEvent = multiPartItems.get(0); assertEquals(ProfileUploader.V4_EVENT_NAME, rawEvent.getFieldName()); @@ -375,9 +379,8 @@ public void testCompression(final String compression) throws Exception { @Test public void testRequestWithContainerId() throws Exception { - uploader = - new ProfileUploader( - config, configProvider, ioLogger, (int) TERMINATION_TIMEOUT.getSeconds()); + uploader = new ProfileUploader( + config, configProvider, ioLogger, (int) TERMINATION_TIMEOUT.getSeconds()); server.enqueue(new MockResponse().setResponseCode(200)); uploadAndWait(RECORDING_TYPE, mockRecordingData()); @@ -610,11 +613,8 @@ public void testNoReplyFromServer() throws Exception { uploader.shutdown(); verify(recording).release(); verify(ioLogger) - .error( - eq( - "Failed to upload profile, received empty reply from " - + url - + " after uploading profile")); + .error(eq("Failed to upload profile, received empty reply from " + url + + " after uploading profile")); } @Test @@ -630,11 +630,8 @@ public void testNoReplyFromServerSync() throws Exception { uploader.shutdown(); verify(recording).release(); verify(ioLogger) - .error( - eq( - "Failed to upload profile, received empty reply from " - + url - + " after uploading profile")); + .error(eq("Failed to upload profile, received empty reply from " + url + + " after uploading profile")); } @Test @@ -662,11 +659,10 @@ public void testSyncDoesNotStayBlocked() throws Exception { @Test public void testTimeout() throws Exception { - server.enqueue( - new MockResponse() - .setHeadersDelay( - REQUEST_IO_OPERATION_TIMEOUT.plus(Duration.ofSeconds(1)).toMillis(), - TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse() + .setHeadersDelay( + REQUEST_IO_OPERATION_TIMEOUT.plus(Duration.ofSeconds(1)).toMillis(), + TimeUnit.MILLISECONDS)); final RecordingData recording = mockRecordingData(); uploadAndWait(RECORDING_TYPE, recording); @@ -685,11 +681,10 @@ public void testTimeout() throws Exception { @Test public void testTimeoutSync() throws Exception { - server.enqueue( - new MockResponse() - .setHeadersDelay( - REQUEST_IO_OPERATION_TIMEOUT.plus(Duration.ofSeconds(1)).toMillis(), - TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse() + .setHeadersDelay( + REQUEST_IO_OPERATION_TIMEOUT.plus(Duration.ofSeconds(1)).toMillis(), + TimeUnit.MILLISECONDS)); final RecordingData recording = mockRecordingData(); uploader.upload(RECORDING_TYPE, recording, true); @@ -719,10 +714,8 @@ public void testUnfinishedRecording() throws Exception { @Test public void testEmptyRecording() throws Exception { final RecordingData recording = mockRecordingData(); - when(recording.getStream()) - .then( - (Answer) - instance -> new RecordingInputStream(new ByteArrayInputStream(new byte[0]))); + when(recording.getStream()).then((Answer) + instance -> new RecordingInputStream(new ByteArrayInputStream(new byte[0]))); server.enqueue(new MockResponse().setResponseCode(200)); uploadAndWait(RECORDING_TYPE, recording); @@ -734,12 +727,11 @@ public void testEmptyRecording() throws Exception { public void testEnqueuedRequestsExecuted() throws Exception { // We have to block all parallel requests to make sure queue is kept full for (int i = 0; i < ProfileUploader.MAX_RUNNING_REQUESTS; i++) { - server.enqueue( - new MockResponse() - .setHeadersDelay( - // 1 second should be enough to schedule all requests and not hit timeout - Duration.ofSeconds(1).toMillis(), TimeUnit.MILLISECONDS) - .setResponseCode(200)); + server.enqueue(new MockResponse() + .setHeadersDelay( + // 1 second should be enough to schedule all requests and not hit timeout + Duration.ofSeconds(1).toMillis(), TimeUnit.MILLISECONDS) + .setResponseCode(200)); } server.enqueue(new MockResponse().setResponseCode(200)); @@ -770,10 +762,9 @@ public void testTooManyRequests() throws Exception { // We have to block all parallel requests to make sure queue is kept full for (int i = 0; i < ProfileUploader.MAX_RUNNING_REQUESTS; i++) { - server.enqueue( - new MockResponse() - .setHeadersDelay(FOREVER_REQUEST_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS) - .setResponseCode(200)); + server.enqueue(new MockResponse() + .setHeadersDelay(FOREVER_REQUEST_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS) + .setResponseCode(200)); } server.enqueue(new MockResponse().setResponseCode(200)); @@ -832,18 +823,16 @@ public void testRequestWithProcessTags(boolean processTagsEnabled) throws Except when(config.isServiceNameSetByUser()).thenReturn(true); } ProcessTags.reset(config); - uploader = - new ProfileUploader( - config, configProvider, ioLogger, (int) TERMINATION_TIMEOUT.getSeconds()); + uploader = new ProfileUploader( + config, configProvider, ioLogger, (int) TERMINATION_TIMEOUT.getSeconds()); server.enqueue(new MockResponse().setResponseCode(200)); uploadAndWait(RECORDING_TYPE, mockRecordingData()); final RecordedRequest recordedRequest = server.takeRequest(5, TimeUnit.SECONDS); assertNotNull(recordedRequest); - final List multiPartItems = - FileUpload.parse( - recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); + final List multiPartItems = FileUpload.parse( + recordedRequest.getBody().readByteArray(), recordedRequest.getHeader("Content-Type")); final FileItem rawEvent = multiPartItems.get(0); final Map parsed = new ObjectMapper().readValue(rawEvent.get(), Map.class); @@ -866,10 +855,8 @@ private RecordingData mockRecordingData(final boolean zip) throws IOException { private RecordingData mockRecordingData(final boolean zip, ProfilingSnapshot.Kind kind) throws IOException { final RecordingData recordingData = mock(RecordingData.class, withSettings().lenient()); - when(recordingData.getStream()) - .then( - (Answer) - invocation -> spy(new RecordingInputStream(recordingStream(zip)))); + when(recordingData.getStream()).then((Answer) + invocation -> spy(new RecordingInputStream(recordingStream(zip)))); when(recordingData.getName()).thenReturn(RECORDING_NAME_PREFIX + SEQUENCE_NUMBER); when(recordingData.getStart()).thenReturn(Instant.ofEpochSecond(PROFILE_START)); when(recordingData.getEnd()).thenReturn(Instant.ofEpochSecond(PROFILE_END)); diff --git a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java index fb94c5490e1..8f33a8aeb65 100644 --- a/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java +++ b/dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java @@ -43,7 +43,8 @@ public class JfrCliHelperTest { private static final int PROFILE_START = 1000; private static final int PROFILE_END = 1100; - @Mock private IOLogger ioLogger; + @Mock + private IOLogger ioLogger; @Test public void testInvokeOn() throws Exception { @@ -85,10 +86,8 @@ private RecordingData mockRecordingData() throws IOException { private RecordingData mockRecordingData(boolean zip) throws IOException { final RecordingData recordingData = mock(RecordingData.class, withSettings().lenient()); - when(recordingData.getStream()) - .then( - (Answer) - invocation -> spy(new RecordingInputStream(recordingStream(zip)))); + when(recordingData.getStream()).then((Answer) + invocation -> spy(new RecordingInputStream(recordingStream(zip)))); when(recordingData.getName()).thenReturn(RECODING_NAME_PREFIX + SEQUENCE_NUMBER); when(recordingData.getStart()).thenReturn(Instant.ofEpochSecond(PROFILE_START)); when(recordingData.getEnd()).thenReturn(Instant.ofEpochSecond(PROFILE_END)); diff --git a/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java b/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java index 236bf52b1ae..f8a4b79f9c1 100644 --- a/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java +++ b/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java @@ -228,13 +228,12 @@ private static String getFixProposalMessage(boolean datadogProfilerEnabled, bool final String javaVendor = SystemProperties.getOrDefault("java.vendor", "unknown"); final String javaVersion = SystemProperties.getOrDefault("java.version", "unknown"); final String javaRuntimeName = SystemProperties.getOrDefault("java.runtime.name", "unknown"); - final String message = - "Not enabling profiling for vendor=" - + javaVendor - + ", version=" - + javaVersion - + ", runtimeName=" - + javaRuntimeName; + final String message = "Not enabling profiling for vendor=" + + javaVendor + + ", version=" + + javaVersion + + ", runtimeName=" + + javaRuntimeName; try { if (javaVersion == null) { return message; diff --git a/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/ProfilingAgent.java b/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/ProfilingAgent.java index 9175e0bc40f..22fd7af79c6 100644 --- a/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/ProfilingAgent.java +++ b/dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/ProfilingAgent.java @@ -111,10 +111,9 @@ public static synchronized boolean run(final boolean earlyStart, Instrumentation ProfilerFlareReporter.register(); ProcessContext.register(configProvider); - boolean startForceFirst = - Platform.isNativeImage() - || configProvider.getBoolean( - PROFILING_START_FORCE_FIRST, PROFILING_START_FORCE_FIRST_DEFAULT); + boolean startForceFirst = Platform.isNativeImage() + || configProvider.getBoolean( + PROFILING_START_FORCE_FIRST, PROFILING_START_FORCE_FIRST_DEFAULT); if (!isStartForceFirstSafe()) { log.debug( @@ -151,11 +150,10 @@ public static synchronized boolean run(final boolean earlyStart, Instrumentation RecordingDataListener listener = uploader::upload; if (dumper != null) { RecordingDataListener upload = listener; - listener = - (type, data, sync) -> { - dumper.onNewData(type, data, sync); - upload.onNewData(type, data, sync); - }; + listener = (type, data, sync) -> { + dumper.onNewData(type, data, sync); + upload.onNewData(type, data, sync); + }; } // Scrubber wraps the combined dumper+uploader so debug dumps also contain scrubbed data // Oracle JDK 8 JFR format has quirks that make scrubbing unreliable — skip it to avoid @@ -164,9 +162,8 @@ public static synchronized boolean run(final boolean earlyStart, Instrumentation && !isOracleJDK8()) { List excludeEventTypes = configProvider.getList(ProfilingConfig.PROFILING_SCRUB_EXCLUDE_EVENTS); - boolean failOpen = - configProvider.getBoolean( - PROFILING_SCRUB_FAIL_OPEN, PROFILING_SCRUB_FAIL_OPEN_DEFAULT); + boolean failOpen = configProvider.getBoolean( + PROFILING_SCRUB_FAIL_OPEN, PROFILING_SCRUB_FAIL_OPEN_DEFAULT); listener = wrapWithScrubber(listener, excludeEventTypes, failOpen); } @@ -177,16 +174,15 @@ public static synchronized boolean run(final boolean earlyStart, Instrumentation // this in the future final Duration startupDelayRandomRange = uploadPeriod; - profiler = - new ProfilingSystem( - configProvider, - controller, - context.snapshot(), - listener, - startupDelay, - startupDelayRandomRange, - uploadPeriod, - startForceFirst); + profiler = new ProfilingSystem( + configProvider, + controller, + context.snapshot(), + listener, + startupDelay, + startupDelayRandomRange, + uploadPeriod, + startForceFirst); profiler.start(); log.debug("Profiling has started"); diff --git a/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/CompositeControllerTest.java b/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/CompositeControllerTest.java index 2be200296ab..ab1b24c2ecc 100644 --- a/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/CompositeControllerTest.java +++ b/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/CompositeControllerTest.java @@ -23,14 +23,13 @@ public void smokeTest() { final String javaVendor = System.getProperty("java.vendor"); final String javaRuntimeName = System.getProperty("java.runtime.name"); final String javaVersion = System.getProperty("java.version"); - String expected = - "Not enabling profiling for vendor=" - + javaVendor - + ", version=" - + javaVersion - + ", runtimeName=" - + javaRuntimeName - + "; it requires "; + String expected = "Not enabling profiling for vendor=" + + javaVendor + + ", version=" + + javaVersion + + ", runtimeName=" + + javaRuntimeName + + "; it requires "; if (javaVendor.equals("Azul Systems, Inc.")) { expected += "Zulu Java 8 (1.8.0_212+)."; } else if (javaVendor.equals("Oracle Corporation") && !javaRuntimeName.startsWith("OpenJDK")) { diff --git a/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/ScrubRecordingDataListenerTest.java b/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/ScrubRecordingDataListenerTest.java index 8c054dc217e..5052121af1f 100644 --- a/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/ScrubRecordingDataListenerTest.java +++ b/dd-java-agent/agent-profiling/src/test/java/com/datadog/profiling/agent/ScrubRecordingDataListenerTest.java @@ -29,7 +29,8 @@ class ScrubRecordingDataListenerTest { - @TempDir Path tempDir; + @TempDir + Path tempDir; private RecordingDataListener delegate; private JfrScrubber scrubber; @@ -122,7 +123,8 @@ void cleansTempFilesOnSuccess() throws Exception { listener.onNewData(RecordingType.CONTINUOUS, mockData, false); // After success, temp input should be cleaned up, only scrubbed output remains - long jfrCount = Files.list(tempDir).filter(p -> p.toString().contains("dd-scrub-in-")).count(); + long jfrCount = + Files.list(tempDir).filter(p -> p.toString().contains("dd-scrub-in-")).count(); assertEquals(0L, jfrCount, "Temp input files should be cleaned up"); } } diff --git a/dd-java-agent/agent-tooling/src/jmh/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteBenchmarkInstrumentation.java b/dd-java-agent/agent-tooling/src/jmh/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteBenchmarkInstrumentation.java index 4796b15f4eb..886ff7296d6 100644 --- a/dd-java-agent/agent-tooling/src/jmh/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteBenchmarkInstrumentation.java +++ b/dd-java-agent/agent-tooling/src/jmh/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteBenchmarkInstrumentation.java @@ -43,27 +43,24 @@ public static class BenchmarkCallSites implements CallSiteSupplier { @Override public Iterable get() { - return Collections.singletonList( - (container -> { - container.addAdvice( - AROUND, - "javax/servlet/ServletRequest", - "getParameter", - "(Ljava/lang/String;)Ljava/lang/String;", - getParameterAdvice()); - container.addHelpers( - "datadog.trace.agent.tooling.bytebuddy.csi.CallSiteBenchmarkHelper"); - })); + return Collections.singletonList((container -> { + container.addAdvice( + AROUND, + "javax/servlet/ServletRequest", + "getParameter", + "(Ljava/lang/String;)Ljava/lang/String;", + getParameterAdvice()); + container.addHelpers("datadog.trace.agent.tooling.bytebuddy.csi.CallSiteBenchmarkHelper"); + })); } public InvokeAdvice getParameterAdvice() { - return (handler, opcode, owner, name, descriptor, isInterface) -> - handler.method( - Opcodes.INVOKESTATIC, - "datadog/trace/agent/tooling/bytebuddy/csi/CallSiteBenchmarkHelper", - "adviceCallSite", - "(Ljavax/servlet/ServletRequest;Ljava/lang/String;)Ljava/lang/String;", - false); + return (handler, opcode, owner, name, descriptor, isInterface) -> handler.method( + Opcodes.INVOKESTATIC, + "datadog/trace/agent/tooling/bytebuddy/csi/CallSiteBenchmarkHelper", + "adviceCallSite", + "(Ljavax/servlet/ServletRequest;Ljava/lang/String;)Ljava/lang/String;", + false); } } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AdviceAppliesOnScanner.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AdviceAppliesOnScanner.java index 779d3c508e3..b4b53172eba 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AdviceAppliesOnScanner.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AdviceAppliesOnScanner.java @@ -40,13 +40,12 @@ public static Map> extractTargetSys // collect the advices final Set adviceClassNames = new HashSet<>(); ((Instrumenter.HasMethodAdvice) instrumenter) - .methodAdvice( - (matcher, adviceClass, additionalClasses) -> { - adviceClassNames.add(adviceClass); - if (additionalClasses != null) { - adviceClassNames.addAll(asList(additionalClasses)); - } - }); + .methodAdvice((matcher, adviceClass, additionalClasses) -> { + adviceClassNames.add(adviceClass); + if (additionalClasses != null) { + adviceClassNames.addAll(asList(additionalClasses)); + } + }); for (String adviceClassName : adviceClassNames) { // process each advice new ClassReader(adviceClassName) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/ExtensionHandler.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/ExtensionHandler.java index 3f05fe5ac82..1fd01587e9c 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/ExtensionHandler.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/ExtensionHandler.java @@ -25,15 +25,12 @@ public class ExtensionHandler { /** Provides necessary mappings to load externally built Datadog extensions */ private static final Function DATADOG_MAPPING = - cv -> - new ClassRemapper( - cv, - new Remapper() { - @Override - public String map(String internalName) { - return MAP_LOGGING.apply(internalName); - } - }); + cv -> new ClassRemapper(cv, new Remapper() { + @Override + public String map(String internalName) { + return MAP_LOGGING.apply(internalName); + } + }); /** Override this to map filenames to alternative entries in the extension. */ public JarEntry mapEntry(JarFile jar, String file) { @@ -124,21 +121,20 @@ protected byte[] doMapBytecode(String unused) { } /** Maps logging references in the extension to use the tracer's embedded logger. */ - public static final Function MAP_LOGGING = - new Function() { - // we want to keep this package unchanged so it matches against any unshaded extensions - // dropped in at runtime; use replace to stop it being transformed by the shadow plugin - private final String ORG_SLF4J = "org|slf4j|".replace('|', '/'); + public static final Function MAP_LOGGING = new Function() { + // we want to keep this package unchanged so it matches against any unshaded extensions + // dropped in at runtime; use replace to stop it being transformed by the shadow plugin + private final String ORG_SLF4J = "org|slf4j|".replace('|', '/'); - @Override - public String apply(String internalName) { - if (internalName.equals("java/util/logging/Logger")) { - return "datadog/trace/bootstrap/PatchLogger"; - } - if (internalName.startsWith(ORG_SLF4J)) { - return "datadog/slf4j/" + internalName.substring(10); - } - return internalName; - } - }; + @Override + public String apply(String internalName) { + if (internalName.equals("java/util/logging/Logger")) { + return "datadog/trace/bootstrap/PatchLogger"; + } + if (internalName.startsWith(ORG_SLF4J)) { + return "datadog/slf4j/" + internalName.substring(10); + } + return internalName; + } + }; } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterModule.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterModule.java index d2abbc265e5..3afb565aa90 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterModule.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterModule.java @@ -105,7 +105,8 @@ public static ReferenceMatcher loadStaticMuzzleReferences( try { // Muzzle class contains static references captured at build-time // see datadog.trace.agent.tooling.muzzle.MuzzleGenerator - return (ReferenceMatcher) classLoader.loadClass(muzzleClass).getMethod("create").invoke(null); + return (ReferenceMatcher) + classLoader.loadClass(muzzleClass).getMethod("create").invoke(null); } catch (Throwable e) { log.warn("Failed to load - muzzle.class={}", muzzleClass, e); return ReferenceMatcher.NO_REFERENCES; diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterState.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterState.java index d5f56ae383f..d5fc2bf6729 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterState.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/InstrumenterState.java @@ -174,12 +174,11 @@ private static void updateState(AtomicLongArray state, int bitIndex, int status) public static String summary() { StringBuilder summary = new StringBuilder(); - classLoaderStates.visit( - (loader, state) -> { - summary.append(loader != null ? loader.getClass().getName() : ""); - summarizeState(summary, state); - summary.append("\n\n"); - }); + classLoaderStates.visit((loader, state) -> { + summary.append(loader != null ? loader.getClass().getName() : ""); + summarizeState(summary, state); + summary.append("\n\n"); + }); return summary.toString(); } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/WeakMaps.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/WeakMaps.java index 90f39205b6a..0293cf5535d 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/WeakMaps.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/WeakMaps.java @@ -28,13 +28,12 @@ public static WeakMap newWeakMap() { private WeakMaps() {} public static void registerAsSupplier() { - WeakMap.Supplier.registerIfAbsent( - new WeakMap.Supplier() { - @Override - protected WeakMap get() { - return WeakMaps.newWeakMap(); - } - }); + WeakMap.Supplier.registerIfAbsent(new WeakMap.Supplier() { + @Override + protected WeakMap get() { + return WeakMaps.newWeakMap(); + } + }); } // Important to use explicit class to avoid implicit hard references to target diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ClassFileLocators.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ClassFileLocators.java index 7ddc923075f..260f64ed567 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ClassFileLocators.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ClassFileLocators.java @@ -30,27 +30,26 @@ protected DDClassFileLocator computeValue(ClassLoader cl) { } }; - private static final ClassFileLocator bootClassFileLocator = - new ClassFileLocator() { - @Override - public Resolution locate(String className) throws IOException { - String resourceName = getResourceName(className); - long fromTick = InstrumenterMetrics.tick(); - Resolution resolution = loadClassResource(Utils.getBootstrapProxy(), resourceName); - if (resolution != null) { - InstrumenterMetrics.resolveClassFile(fromTick); - return resolution; - } else { - InstrumenterMetrics.missingClassFile(fromTick); - return new Resolution.Illegal(className); - } - } + private static final ClassFileLocator bootClassFileLocator = new ClassFileLocator() { + @Override + public Resolution locate(String className) throws IOException { + String resourceName = getResourceName(className); + long fromTick = InstrumenterMetrics.tick(); + Resolution resolution = loadClassResource(Utils.getBootstrapProxy(), resourceName); + if (resolution != null) { + InstrumenterMetrics.resolveClassFile(fromTick); + return resolution; + } else { + InstrumenterMetrics.missingClassFile(fromTick); + return new Resolution.Illegal(className); + } + } - @Override - public void close() { - // nothing to close - } - }; + @Override + public void close() { + // nothing to close + } + }; public static ClassFileLocator classFileLocator(final ClassLoader classLoader) { return null != classLoader ? classFileLocators.get(classLoader) : bootClassFileLocator; diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ExceptionHandlers.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ExceptionHandlers.java index 5de9c8630ca..61a04b4e255 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ExceptionHandlers.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/ExceptionHandlers.java @@ -23,153 +23,151 @@ public class ExceptionHandlers { // Shared bytecode that turns the [throwable, adviceName] stack left by the TextConstant // prefix into a logged + optionally swallowed exception. - private static final StackManipulation EXCEPTION_STACK_MANIPULATION = - new StackManipulation() { - // Pops the throwable and the advice-name String off the stack. - // Peak growth above the pair on entry is +2 (during message-building LDCs). - private final Size size = new StackManipulation.Size(-2, 2); - private final boolean appSecEnabled = - InstrumenterConfig.get().getAppSecActivation() != ProductActivation.FULLY_DISABLED; - private final boolean detailedErrors = - InstrumenterConfig.get().isDetailedInstrumentationErrors(); - - @Override - public boolean isValid() { - return true; - } - - @Override - public Size apply(final MethodVisitor mv, final Implementation.Context context) { - final String instrumentedTypeName = context.getInstrumentedType().getName(); - final boolean exitOnFailure = InstrumenterConfig.get().isInternalExitOnFailure(); - final String logMethod = exitOnFailure ? "error" : "debug"; - - // On entry the stack is: (bottom) throwable, adviceName (top) - // — adviceName was pushed by the preceding TextConstant. - // - // Emits the following Java-equivalent code when exitOnFailure is false: - // - // BlockingExceptionHandler.rethrowIfBlockingException(t); - // try { - // InstrumentationErrors.recordError(); - // org.slf4j.LoggerFactory.getLogger((Class) ExceptionLogger.class) - // .debug("Failed to handle exception in instrumentation for (" + adviceName + - // ")", t); - // } catch (Throwable t2) { - // } - // - // and the same with .error(...) followed by System.exit(1) when exitOnFailure is true. - final Label logStart = new Label(); - final Label logEnd = new Label(); - final Label eatException = new Label(); - final Label handlerExit = new Label(); - - // Frames are only meaningful for class files in version 6 or later. - final boolean frames = context.getClassFileVersion().isAtLeast(ClassFileVersion.JAVA_V6); - - if (appSecEnabled) { - // Need throwable on top for rethrowIfBlockingException. - // stack: (top) adviceName, throwable -> top throwable - mv.visitInsn(Opcodes.SWAP); - mv.visitMethodInsn( - Opcodes.INVOKESTATIC, - "datadog/trace/bootstrap/blocking/BlockingExceptionHandler", - "rethrowIfBlockingException", - "(Ljava/lang/Throwable;)Ljava/lang/Throwable;", - false); - // restore: (top) throwable, adviceName -> top adviceName - mv.visitInsn(Opcodes.SWAP); - } - - mv.visitTryCatchBlock(logStart, logEnd, eatException, "java/lang/Throwable"); - mv.visitLabel(logStart); - // record instrumentation error - if (detailedErrors) { - // recordError(Throwable) needs throwable on top, then we restore. - mv.visitInsn(Opcodes.SWAP); - mv.visitMethodInsn( - Opcodes.INVOKESTATIC, - "datadog/trace/bootstrap/InstrumentationErrors", - "recordError", - "(Ljava/lang/Throwable;)Ljava/lang/Throwable;", - false); - mv.visitInsn(Opcodes.SWAP); - } else { - mv.visitMethodInsn( - Opcodes.INVOKESTATIC, - "datadog/trace/bootstrap/InstrumentationErrors", - "recordError", - "()V", - false); - } - - // Build the log message: - // "Failed to handle exception in instrumentation for - " + adviceName - // is a generation-time constant baked into the prefix LDC. - // stack: (top) adviceName, throwable - mv.visitLdcInsn( - "Failed to handle exception in instrumentation for " + instrumentedTypeName + " - "); - // stack: prefix (top), adviceName, throwable - mv.visitInsn(Opcodes.SWAP); - // stack: adviceName (top), prefix, throwable - mv.visitMethodInsn( - Opcodes.INVOKEVIRTUAL, - "java/lang/String", - "concat", - "(Ljava/lang/String;)Ljava/lang/String;", - false); - // stack: message (top), throwable - mv.visitInsn(Opcodes.SWAP); - // stack: throwable(top), message - - mv.visitLdcInsn(Type.getType("L" + HANDLER_NAME + ";")); - mv.visitMethodInsn( - Opcodes.INVOKESTATIC, - LOG_FACTORY_NAME, - "getLogger", - "(Ljava/lang/Class;)L" + LOGGER_NAME + ";", - false); - // stack: logger (top), throwable, message - mv.visitInsn(Opcodes.DUP_X2); - // stack: logger (top), throwable, message, logger - mv.visitInsn(Opcodes.POP); - // stack: throwable (top), message, logger - mv.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - LOGGER_NAME, - logMethod, - "(Ljava/lang/String;Ljava/lang/Throwable;)V", - true); - - if (exitOnFailure) { - mv.visitInsn(Opcodes.ICONST_1); - mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "exit", "(I)V", false); - } - mv.visitLabel(logEnd); - mv.visitJumpInsn(Opcodes.GOTO, handlerExit); - - // if the runtime can't reach our ExceptionHandler or logger, - // silently eat the exception - mv.visitLabel(eatException); - if (frames) { - mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); - } - mv.visitInsn(Opcodes.POP); - // mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", - // "printStackTrace", "()V", false); - - mv.visitLabel(handlerExit); - if (frames) { - mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - } - - return size; - } - }; + private static final StackManipulation EXCEPTION_STACK_MANIPULATION = new StackManipulation() { + // Pops the throwable and the advice-name String off the stack. + // Peak growth above the pair on entry is +2 (during message-building LDCs). + private final Size size = new StackManipulation.Size(-2, 2); + private final boolean appSecEnabled = + InstrumenterConfig.get().getAppSecActivation() != ProductActivation.FULLY_DISABLED; + private final boolean detailedErrors = + InstrumenterConfig.get().isDetailedInstrumentationErrors(); + + @Override + public boolean isValid() { + return true; + } + + @Override + public Size apply(final MethodVisitor mv, final Implementation.Context context) { + final String instrumentedTypeName = context.getInstrumentedType().getName(); + final boolean exitOnFailure = InstrumenterConfig.get().isInternalExitOnFailure(); + final String logMethod = exitOnFailure ? "error" : "debug"; + + // On entry the stack is: (bottom) throwable, adviceName (top) + // — adviceName was pushed by the preceding TextConstant. + // + // Emits the following Java-equivalent code when exitOnFailure is false: + // + // BlockingExceptionHandler.rethrowIfBlockingException(t); + // try { + // InstrumentationErrors.recordError(); + // org.slf4j.LoggerFactory.getLogger((Class) ExceptionLogger.class) + // .debug("Failed to handle exception in instrumentation for (" + adviceName + + // ")", t); + // } catch (Throwable t2) { + // } + // + // and the same with .error(...) followed by System.exit(1) when exitOnFailure is true. + final Label logStart = new Label(); + final Label logEnd = new Label(); + final Label eatException = new Label(); + final Label handlerExit = new Label(); + + // Frames are only meaningful for class files in version 6 or later. + final boolean frames = context.getClassFileVersion().isAtLeast(ClassFileVersion.JAVA_V6); + + if (appSecEnabled) { + // Need throwable on top for rethrowIfBlockingException. + // stack: (top) adviceName, throwable -> top throwable + mv.visitInsn(Opcodes.SWAP); + mv.visitMethodInsn( + Opcodes.INVOKESTATIC, + "datadog/trace/bootstrap/blocking/BlockingExceptionHandler", + "rethrowIfBlockingException", + "(Ljava/lang/Throwable;)Ljava/lang/Throwable;", + false); + // restore: (top) throwable, adviceName -> top adviceName + mv.visitInsn(Opcodes.SWAP); + } + + mv.visitTryCatchBlock(logStart, logEnd, eatException, "java/lang/Throwable"); + mv.visitLabel(logStart); + // record instrumentation error + if (detailedErrors) { + // recordError(Throwable) needs throwable on top, then we restore. + mv.visitInsn(Opcodes.SWAP); + mv.visitMethodInsn( + Opcodes.INVOKESTATIC, + "datadog/trace/bootstrap/InstrumentationErrors", + "recordError", + "(Ljava/lang/Throwable;)Ljava/lang/Throwable;", + false); + mv.visitInsn(Opcodes.SWAP); + } else { + mv.visitMethodInsn( + Opcodes.INVOKESTATIC, + "datadog/trace/bootstrap/InstrumentationErrors", + "recordError", + "()V", + false); + } + + // Build the log message: + // "Failed to handle exception in instrumentation for - " + adviceName + // is a generation-time constant baked into the prefix LDC. + // stack: (top) adviceName, throwable + mv.visitLdcInsn( + "Failed to handle exception in instrumentation for " + instrumentedTypeName + " - "); + // stack: prefix (top), adviceName, throwable + mv.visitInsn(Opcodes.SWAP); + // stack: adviceName (top), prefix, throwable + mv.visitMethodInsn( + Opcodes.INVOKEVIRTUAL, + "java/lang/String", + "concat", + "(Ljava/lang/String;)Ljava/lang/String;", + false); + // stack: message (top), throwable + mv.visitInsn(Opcodes.SWAP); + // stack: throwable(top), message + + mv.visitLdcInsn(Type.getType("L" + HANDLER_NAME + ";")); + mv.visitMethodInsn( + Opcodes.INVOKESTATIC, + LOG_FACTORY_NAME, + "getLogger", + "(Ljava/lang/Class;)L" + LOGGER_NAME + ";", + false); + // stack: logger (top), throwable, message + mv.visitInsn(Opcodes.DUP_X2); + // stack: logger (top), throwable, message, logger + mv.visitInsn(Opcodes.POP); + // stack: throwable (top), message, logger + mv.visitMethodInsn( + Opcodes.INVOKEINTERFACE, + LOGGER_NAME, + logMethod, + "(Ljava/lang/String;Ljava/lang/Throwable;)V", + true); + + if (exitOnFailure) { + mv.visitInsn(Opcodes.ICONST_1); + mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "exit", "(I)V", false); + } + mv.visitLabel(logEnd); + mv.visitJumpInsn(Opcodes.GOTO, handlerExit); + + // if the runtime can't reach our ExceptionHandler or logger, + // silently eat the exception + mv.visitLabel(eatException); + if (frames) { + mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); + } + mv.visitInsn(Opcodes.POP); + // mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Throwable", + // "printStackTrace", "()V", false); + + mv.visitLabel(handlerExit); + if (frames) { + mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + } + + return size; + } + }; public static ExceptionHandler exceptionHandlerFor(final String adviceClassName) { - return new ExceptionHandler.Simple( - new StackManipulation.Compound( - new TextConstant(adviceClassName), EXCEPTION_STACK_MANIPULATION)); + return new ExceptionHandler.Simple(new StackManipulation.Compound( + new TextConstant(adviceClassName), EXCEPTION_STACK_MANIPULATION)); } } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/NewTaskForRewritingVisitor.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/NewTaskForRewritingVisitor.java index da91f64ef79..4f364ce1d5f 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/NewTaskForRewritingVisitor.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/NewTaskForRewritingVisitor.java @@ -31,11 +31,8 @@ public final class NewTaskForRewritingVisitor implements AsmVisitorWrapper { static final String NEW_TASK_FOR_METHOD = "newTaskFor"; - static final String NEW_TASK_FOR_METHOD_DESCRIPTOR = - Type.getMethodDescriptor( - Type.getType(RunnableFuture.class), - Type.getType(Runnable.class), - Type.getType(Object.class)); + static final String NEW_TASK_FOR_METHOD_DESCRIPTOR = Type.getMethodDescriptor( + Type.getType(RunnableFuture.class), Type.getType(Runnable.class), Type.getType(Object.class)); @Override public int mergeWriter(final int flags) { diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/Advices.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/Advices.java index 58cbe2eb856..9bb98e1a839 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/Advices.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/Advices.java @@ -195,10 +195,9 @@ public void addAdvice( final CallSiteAdvice oldAdvice = methodAdvices.put(descriptor, TypedAdvice.withType(advice, type)); if (oldAdvice != null) { - throw new UnsupportedOperationException( - String.format( - "Advice %s and %s match the same pointcut, this is not yet supported", - oldAdvice, advice)); + throw new UnsupportedOperationException(String.format( + "Advice %s and %s match the same pointcut, this is not yet supported", + oldAdvice, advice)); } } } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteTransformer.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteTransformer.java index 8d4eaa72f27..0fa2a8c5fbc 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteTransformer.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/CallSiteTransformer.java @@ -52,10 +52,9 @@ public CallSiteTransformer(@Nonnull final Advices advices) { public CallSiteTransformer(@Nonnull final String name, @Nonnull final Advices advices) { this.advices = advices; final String[] helpers = advices.getHelpers(); - this.helperInjector = - helpers == null || helpers.length == 0 - ? NO_OP - : new HelperInjector(false, name, advices.getHelpers()); + this.helperInjector = helpers == null || helpers.length == 0 + ? NO_OP + : new HelperInjector(false, name, advices.getHelpers()); } @Override diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/ConstantPool.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/ConstantPool.java index ed4f74e4595..898b42b0d27 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/ConstantPool.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/csi/ConstantPool.java @@ -119,11 +119,9 @@ public String readUTF8(final int offset) { charBuffer[strLength++] = (char) (((currentByte & 0x1F) << 6) + (classBuffer[currentOffset++] & 0x3F)); } else { - charBuffer[strLength++] = - (char) - (((currentByte & 0xF) << 12) - + ((classBuffer[currentOffset++] & 0x3F) << 6) - + (classBuffer[currentOffset++] & 0x3F)); + charBuffer[strLength++] = (char) (((currentByte & 0xF) << 12) + + ((classBuffer[currentOffset++] & 0x3F) << 6) + + (classBuffer[currentOffset++] & 0x3F)); } } return new String(charBuffer, 0, strLength); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/iast/TaintableVisitor.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/iast/TaintableVisitor.java index 1d644ba7580..e644ed3c525 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/iast/TaintableVisitor.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/iast/TaintableVisitor.java @@ -134,13 +134,12 @@ private String[] addInterface(@Nullable final String[] interfaces) { } private void addField() { - final FieldVisitor fv = - cv.visitField( - Opcodes.ACC_PRIVATE | Opcodes.ACC_TRANSIENT | Opcodes.ACC_VOLATILE, - FIELD_NAME, - SOURCE_CLASS_NAME, - null, - null); + final FieldVisitor fv = cv.visitField( + Opcodes.ACC_PRIVATE | Opcodes.ACC_TRANSIENT | Opcodes.ACC_VOLATILE, + FIELD_NAME, + SOURCE_CLASS_NAME, + null, + null); fv.visitEnd(); } @@ -156,9 +155,8 @@ private void addGetter() { } private void addSetter() { - final MethodVisitor mv = - cv.visitMethod( - Opcodes.ACC_PUBLIC, SETTER_NAME, "(" + SOURCE_CLASS_NAME + ")V", null, null); + final MethodVisitor mv = cv.visitMethod( + Opcodes.ACC_PUBLIC, SETTER_NAME, "(" + SOURCE_CLASS_NAME + ")V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ALOAD, 1); @@ -169,9 +167,8 @@ private void addSetter() { } private void addSetterDebug() { - final MethodVisitor mv = - cv.visitMethod( - Opcodes.ACC_PUBLIC, SETTER_NAME, "(" + SOURCE_CLASS_NAME + ")V", null, null); + final MethodVisitor mv = cv.visitMethod( + Opcodes.ACC_PUBLIC, SETTER_NAME, "(" + SOURCE_CLASS_NAME + ")V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ALOAD, 1); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ClassLoaderMatchers.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ClassLoaderMatchers.java index 2ae8cb21921..fa560b8aa96 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ClassLoaderMatchers.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ClassLoaderMatchers.java @@ -143,13 +143,12 @@ private static boolean loadsExpectedClass( static final List hasClassResourceNames = new ArrayList<>(); /** Cache of classloader-instance -> has-class mask. */ - static final ClassLoaderValue hasClassCache = - new ClassLoaderValue() { - @Override - protected BitSet computeValue(ClassLoader cl) { - return buildHasClassMask(cl); - } - }; + static final ClassLoaderValue hasClassCache = new ClassLoaderValue() { + @Override + protected BitSet computeValue(ClassLoader cl) { + return buildHasClassMask(cl); + } + }; /** Distinct result used to mark an incompatible classloader that the tracer should skip. */ static final BitSet INCOMPATIBLE_CLASS_LOADER = new BitSet(); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/CodeSourceExcludes.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/CodeSourceExcludes.java index 50bf22f061e..93bde5eacdd 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/CodeSourceExcludes.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/CodeSourceExcludes.java @@ -35,16 +35,14 @@ public static boolean isExcluded(ProtectionDomain protectionDomain) { // avoid hashing on the URL because that can be a blocking operation URL location = codeSource.getLocation(); return null != location - && excludedCodeSources.computeIfAbsent( - location.getPath(), - path -> { - for (String name : excludes) { - if (path.contains(name)) { - return true; - } - } - return false; - }); + && excludedCodeSources.computeIfAbsent(location.getPath(), path -> { + for (String name : excludes) { + if (path.contains(name)) { + return true; + } + } + return false; + }); } } return false; diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ScalaTraitMatchers.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ScalaTraitMatchers.java index 51464848f33..3de697f049a 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ScalaTraitMatchers.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/matcher/ScalaTraitMatchers.java @@ -16,10 +16,9 @@ public class ScalaTraitMatchers { public static ElementMatcher.Junction isTraitMethod( String traitName, String name, Object... argumentTypes) { - ElementMatcher.Junction scalaOldArgs = - isStatic() - .and(takesArguments(argumentTypes.length + 1)) - .and(takesArgument(0, named(traitName))); + ElementMatcher.Junction scalaOldArgs = isStatic() + .and(takesArguments(argumentTypes.length + 1)) + .and(takesArgument(0, named(traitName))); ElementMatcher.Junction scalaNewArgs = not(isStatic()).and(takesArguments(argumentTypes.length)); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/memoize/NoMatchFilter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/memoize/NoMatchFilter.java index ca87baa876d..4c88801ea2b 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/memoize/NoMatchFilter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/memoize/NoMatchFilter.java @@ -56,12 +56,11 @@ private static Path discoverNoMatchFile() { } // use different file for each tracer + service combination - String filterKey = - DDTraceApiInfo.VERSION - + "/" - + Config.get().getServiceName() - + "/" - + Config.get().getVersion(); + String filterKey = DDTraceApiInfo.VERSION + + "/" + + Config.get().getServiceName() + + "/" + + Config.get().getVersion(); String noMatchFilterName = UUID.nameUUIDFromBytes(filterKey.getBytes(StandardCharsets.UTF_8)) + "-nomatch.filter"; diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/OutlineTypeParser.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/OutlineTypeParser.java index 3ef94925364..3de51783c86 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/OutlineTypeParser.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/OutlineTypeParser.java @@ -39,24 +39,19 @@ public TypeDescription parse(byte[] bytecode) { public TypeDescription parse(Class loadedType) { Class superClass = loadedType.getSuperclass(); - TypeOutline typeOutline = - new TypeOutline( - loadedType.getModifiers(), - loadedType.getName(), - null != superClass ? superClass.getName() : null, - extractTypeNames(loadedType.getInterfaces())); + TypeOutline typeOutline = new TypeOutline( + loadedType.getModifiers(), + loadedType.getName(), + null != superClass ? superClass.getName() : null, + extractTypeNames(loadedType.getInterfaces())); for (Annotation a : loadedType.getDeclaredAnnotations()) { typeOutline.declare(annotationOutline(Type.getInternalName(a.annotationType()))); } for (Field field : loadedType.getDeclaredFields()) { - FieldOutline fieldOutline = - new FieldOutline( - typeOutline, - field.getModifiers(), - field.getName(), - Type.getDescriptor(field.getType())); + FieldOutline fieldOutline = new FieldOutline( + typeOutline, field.getModifiers(), field.getName(), Type.getDescriptor(field.getType())); for (Annotation a : field.getDeclaredAnnotations()) { fieldOutline.declare(annotationOutline(Type.getInternalName(a.annotationType()))); } @@ -64,12 +59,8 @@ public TypeDescription parse(Class loadedType) { } for (Method method : loadedType.getDeclaredMethods()) { - MethodOutline methodOutline = - new MethodOutline( - typeOutline, - method.getModifiers(), - method.getName(), - Type.getMethodDescriptor(method)); + MethodOutline methodOutline = new MethodOutline( + typeOutline, method.getModifiers(), method.getName(), Type.getMethodDescriptor(method)); for (Annotation a : method.getDeclaredAnnotations()) { methodOutline.declare(annotationOutline(Type.getInternalName(a.annotationType()))); } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/TypeFactory.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/TypeFactory.java index 51650b3d2b2..b33d2d65fe4 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/TypeFactory.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/outline/TypeFactory.java @@ -51,18 +51,17 @@ final class TypeFactory { private static final Map primitiveTypes = new HashMap<>(); static { - for (Class primitive : - new Class[] { - boolean.class, - byte.class, - short.class, - char.class, - int.class, - long.class, - float.class, - double.class, - void.class - }) { + for (Class primitive : new Class[] { + boolean.class, + byte.class, + short.class, + char.class, + int.class, + long.class, + float.class, + double.class, + void.class + }) { TypeDescription primitiveType = TypeDescription.ForLoadedType.of(primitive); primitiveDescriptorTypes.put(primitiveType.getDescriptor().charAt(0), primitiveType); primitiveTypes.put(primitive.getName(), primitiveType); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/reqctx/InjectRequestContextVisitor.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/reqctx/InjectRequestContextVisitor.java index 305a44a3546..aac86839c25 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/reqctx/InjectRequestContextVisitor.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/reqctx/InjectRequestContextVisitor.java @@ -107,10 +107,9 @@ public MethodVisitor visitMethod( String newSignature = signature; if (!hasActiveReqCtxParam) { int posClosingBracket = descriptor.indexOf(')'); - newDescriptor = - descriptor.substring(0, posClosingBracket) - + REQUEST_CONTEXT_DESCRIPTOR - + descriptor.substring(posClosingBracket); + newDescriptor = descriptor.substring(0, posClosingBracket) + + REQUEST_CONTEXT_DESCRIPTOR + + descriptor.substring(posClosingBracket); if (signature != null) { newSignature = newMethodSignature(signature); } @@ -125,15 +124,14 @@ public MethodVisitor visitMethod( private String newMethodSignature(String originalSignature) { SignatureReader signatureReader = new SignatureReader(originalSignature); - SignatureWriter signatureWriter = - new SignatureWriter() { - @Override - public SignatureVisitor visitReturnType() { - visitParameterType().visitClassType(Type.getInternalName(RequestContext.class)); - visitEnd(); - return super.visitReturnType(); - } - }; + SignatureWriter signatureWriter = new SignatureWriter() { + @Override + public SignatureVisitor visitReturnType() { + visitParameterType().visitClassType(Type.getInternalName(RequestContext.class)); + visitEnd(); + return super.visitReturnType(); + } + }; signatureReader.accept(signatureWriter); return signatureWriter.toString(); } @@ -239,13 +237,12 @@ private void annotateReqCtxParam(int parameter) { @Override public void visitCode() { if (this.addReqCtxParam) { - suppressSorter( - new Runnable() { - @Override - public void run() { - AdviceMethodVisitor.this.annotateReqCtxParam(AdviceMethodVisitor.this.reqCtxParamIdx); - } - }); + suppressSorter(new Runnable() { + @Override + public void run() { + AdviceMethodVisitor.this.annotateReqCtxParam(AdviceMethodVisitor.this.reqCtxParamIdx); + } + }); } super.visitCode(); @@ -281,23 +278,21 @@ public void run() { "(" + Type.getDescriptor(RequestContextSlot.class) + ")Ljava/lang/Object;", true); super.visitJumpInsn(Opcodes.IFNULL, this.popBeforeEpilogue); - suppressSorter( - new Runnable() { - @Override - public void run() { - AdviceMethodVisitor.super.visitVarInsn( - Opcodes.ASTORE, AdviceMethodVisitor.this.reqCtxParamIdx); - } - }); + suppressSorter(new Runnable() { + @Override + public void run() { + AdviceMethodVisitor.super.visitVarInsn( + Opcodes.ASTORE, AdviceMethodVisitor.this.reqCtxParamIdx); + } + }); } else { - suppressSorter( - new Runnable() { - @Override - public void run() { - AdviceMethodVisitor.super.visitVarInsn( - Opcodes.ALOAD, AdviceMethodVisitor.this.reqCtxParamIdx); - } - }); + suppressSorter(new Runnable() { + @Override + public void run() { + AdviceMethodVisitor.super.visitVarInsn( + Opcodes.ALOAD, AdviceMethodVisitor.this.reqCtxParamIdx); + } + }); super.visitJumpInsn(Opcodes.IFNULL, this.epilogueLabel); } } @@ -319,13 +314,12 @@ public void visitLocalVariable( public void visitEnd() { if (shouldFetchReqContext()) { super.visitLabel(this.popBeforeEpilogue); - suppressSorter( - new Runnable() { - @Override - public void run() { - buildParameterFrame(new Object[] {Type.getInternalName(Object.class)}); - } - }); + suppressSorter(new Runnable() { + @Override + public void run() { + buildParameterFrame(new Object[] {Type.getInternalName(Object.class)}); + } + }); super.visitInsn(Opcodes.POP); } @@ -333,13 +327,12 @@ public void run() { TypeDescription.Generic returnType = methodDescription.getReturnType(); // add a frame with nothing in the stack and only the parameters as locals - suppressSorter( - new Runnable() { - @Override - public void run() { - buildParameterFrame(new Object[0]); - } - }); + suppressSorter(new Runnable() { + @Override + public void run() { + buildParameterFrame(new Object[0]); + } + }); addDefaultReturn(returnType); @@ -351,19 +344,18 @@ public void run() { p.name, p.descriptor, p.signature, this.beginLabel, endLabel, p.index); } if (this.addReqCtxParam) { - suppressSorter( - new Runnable() { - @Override - public void run() { - AdviceMethodVisitor.super.visitLocalVariable( - "reqCtx", - Type.getType(RequestContext.class).getDescriptor(), - null, - AdviceMethodVisitor.this.beginLabel, - endLabel, - AdviceMethodVisitor.this.reqCtxParamIdx); - } - }); + suppressSorter(new Runnable() { + @Override + public void run() { + AdviceMethodVisitor.super.visitLocalVariable( + "reqCtx", + Type.getType(RequestContext.class).getDescriptor(), + null, + AdviceMethodVisitor.this.beginLabel, + endLabel, + AdviceMethodVisitor.this.reqCtxParamIdx); + } + }); } super.visitEnd(); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextInjector.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextInjector.java index 9f3b0a51dce..b13d72495cf 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextInjector.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextInjector.java @@ -50,19 +50,16 @@ public final class FieldBackedContextInjector implements AsmVisitorWrapper { Type.getMethodDescriptor(Type.VOID_TYPE, Type.INT_TYPE, Type.getType(Object.class)); static final String WEAK_REDIRECT_CLASS = - getInternalName( - (InstrumenterConfig.get().isRuntimeContextMapPerStore() - ? WeakMapPerStore.class - : GlobalObjectStore.class) - .getName()); + getInternalName((InstrumenterConfig.get().isRuntimeContextMapPerStore() + ? WeakMapPerStore.class + : GlobalObjectStore.class) + .getName()); - static final String WEAK_GET_METHOD_DESCRIPTOR = - Type.getMethodDescriptor( - Type.getType(Object.class), Type.getType(Object.class), Type.INT_TYPE); + static final String WEAK_GET_METHOD_DESCRIPTOR = Type.getMethodDescriptor( + Type.getType(Object.class), Type.getType(Object.class), Type.INT_TYPE); - static final String WEAK_PUT_METHOD_DESCRIPTOR = - Type.getMethodDescriptor( - Type.VOID_TYPE, Type.getType(Object.class), Type.INT_TYPE, Type.getType(Object.class)); + static final String WEAK_PUT_METHOD_DESCRIPTOR = Type.getMethodDescriptor( + Type.VOID_TYPE, Type.getType(Object.class), Type.INT_TYPE, Type.getType(Object.class)); static final String IS_ASSIGNABLE_FROM_METHOD = "isAssignableFrom"; static final String IS_ASSIGNABLE_FROM_METHOD_DESCRIPTOR = @@ -218,9 +215,8 @@ public void visitEnd() { if (isMemoizingEnabled) { hasSuperStores = MemoizedMatchers.hasSuperStores(instrumentedType, weakStoreIds); } else { - hasSuperStores = - ShouldInjectFieldsState.hasInjectedField( - instrumentedType.getSuperClass(), weakStoreIds); + hasSuperStores = ShouldInjectFieldsState.hasInjectedField( + instrumentedType.getSuperClass(), weakStoreIds); } if (!foundGetter) { diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextRequestRewriter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextRequestRewriter.java index 08d52f9bd57..085f627400d 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextRequestRewriter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/FieldBackedContextRequestRewriter.java @@ -39,12 +39,10 @@ public final class FieldBackedContextRequestRewriter implements AsmVisitorWrappe getInternalName(FieldBackedContextStores.class.getName()); static final String GET_METHOD = "get"; - static final String GET_METHOD_DESCRIPTOR = - Type.getMethodDescriptor( - Type.getType(ContextStore.class), Type.getType(Class.class), Type.getType(Class.class)); - static final String GET_METHOD_DESCRIPTOR_2 = - Type.getMethodDescriptor( - Type.getType(ContextStore.class), Type.getType(String.class), Type.getType(String.class)); + static final String GET_METHOD_DESCRIPTOR = Type.getMethodDescriptor( + Type.getType(ContextStore.class), Type.getType(Class.class), Type.getType(Class.class)); + static final String GET_METHOD_DESCRIPTOR_2 = Type.getMethodDescriptor( + Type.getType(ContextStore.class), Type.getType(String.class), Type.getType(String.class)); static final String GET_CONTENT_STORE_METHOD = "getContextStore"; static final String GET_CONTENT_STORE_METHOD_DESCRIPTOR = @@ -141,10 +139,9 @@ public void visitMethodInsn( contextClassName); } if (!contextClassName.equals(contextStore.get(keyClassName))) { - throw new IllegalStateException( - String.format( - "Incorrect Context Api Usage detected. Incorrect context class %s, expected %s for instrumentation %s", - contextClassName, contextStore.get(keyClassName), instrumenterClassName)); + throw new IllegalStateException(String.format( + "Incorrect Context Api Usage detected. Incorrect context class %s, expected %s for instrumentation %s", + contextClassName, contextStore.get(keyClassName), instrumenterClassName)); } // discard original parameters so we can use numeric id instead mv.visitInsn(Opcodes.POP2); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/asm/SerialVersionUIDAdder.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/asm/SerialVersionUIDAdder.java index 037d3770407..e2bf734348f 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/asm/SerialVersionUIDAdder.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/context/asm/SerialVersionUIDAdder.java @@ -211,17 +211,16 @@ public MethodVisitor visitMethod( // Collect the non private constructors and methods. Only the ACC_PUBLIC, ACC_PRIVATE, // ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT and // ACC_STRICT flags are used. - int mods = - access - & (Opcodes.ACC_PUBLIC - | Opcodes.ACC_PRIVATE - | Opcodes.ACC_PROTECTED - | Opcodes.ACC_STATIC - | Opcodes.ACC_FINAL - | Opcodes.ACC_SYNCHRONIZED - | Opcodes.ACC_NATIVE - | Opcodes.ACC_ABSTRACT - | Opcodes.ACC_STRICT); + int mods = access + & (Opcodes.ACC_PUBLIC + | Opcodes.ACC_PRIVATE + | Opcodes.ACC_PROTECTED + | Opcodes.ACC_STATIC + | Opcodes.ACC_FINAL + | Opcodes.ACC_SYNCHRONIZED + | Opcodes.ACC_NATIVE + | Opcodes.ACC_ABSTRACT + | Opcodes.ACC_STRICT); if ((access & Opcodes.ACC_PRIVATE) == 0) { if ("".equals(name)) { @@ -255,15 +254,14 @@ public FieldVisitor visitField( // serialVersionUID values. if ((access & Opcodes.ACC_PRIVATE) == 0 || (access & (Opcodes.ACC_STATIC | Opcodes.ACC_TRANSIENT)) == 0) { - int mods = - access - & (Opcodes.ACC_PUBLIC - | Opcodes.ACC_PRIVATE - | Opcodes.ACC_PROTECTED - | Opcodes.ACC_STATIC - | Opcodes.ACC_FINAL - | Opcodes.ACC_VOLATILE - | Opcodes.ACC_TRANSIENT); + int mods = access + & (Opcodes.ACC_PUBLIC + | Opcodes.ACC_PRIVATE + | Opcodes.ACC_PROTECTED + | Opcodes.ACC_STATIC + | Opcodes.ACC_FINAL + | Opcodes.ACC_VOLATILE + | Opcodes.ACC_TRANSIENT); svuidFields.add(new Item(name, mods, desc)); } } @@ -323,9 +321,8 @@ public boolean hasSVUID() { */ // DontCheck(AbbreviationAsWordInName): can't be renamed (for backward binary compatibility). protected void addSVUID(final long svuid) { - FieldVisitor fieldVisitor = - super.visitField( - Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "serialVersionUID", "J", null, svuid); + FieldVisitor fieldVisitor = super.visitField( + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "serialVersionUID", "J", null, svuid); if (fieldVisitor != null) { fieldVisitor.visitEnd(); } @@ -353,12 +350,11 @@ protected long computeSVUID() throws IOException { mods = svuidMethods.isEmpty() ? (mods & ~Opcodes.ACC_ABSTRACT) : (mods | Opcodes.ACC_ABSTRACT); } - dataOutputStream.writeInt( - mods - & (Opcodes.ACC_PUBLIC - | Opcodes.ACC_FINAL - | Opcodes.ACC_INTERFACE - | Opcodes.ACC_ABSTRACT)); + dataOutputStream.writeInt(mods + & (Opcodes.ACC_PUBLIC + | Opcodes.ACC_FINAL + | Opcodes.ACC_INTERFACE + | Opcodes.ACC_ABSTRACT)); // 3. The name of each interface sorted by name written using UTF encoding. Arrays.sort(interfaces); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleCheck.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleCheck.java index 2544e2732c8..9c2c2ffc881 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleCheck.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleCheck.java @@ -54,10 +54,9 @@ public boolean matches(ClassLoader classLoader) { private ReferenceMatcher muzzle() { if (null == muzzle) { - muzzle = - InstrumenterModule.loadStaticMuzzleReferences( - Utils.getExtendedClassLoader(), instrumentationClass) - .withReferenceProvider(runtimeMuzzleReferences); + muzzle = InstrumenterModule.loadStaticMuzzleReferences( + Utils.getExtendedClassLoader(), instrumentationClass) + .withReferenceProvider(runtimeMuzzleReferences); } return muzzle; } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleGenerator.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleGenerator.java index 69421f6d16a..8497627ad65 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleGenerator.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleGenerator.java @@ -59,13 +59,11 @@ public ClassVisitor wrap( InstrumenterModule module; try { - module = - (InstrumenterModule) - Thread.currentThread() - .getContextClassLoader() - .loadClass(moduleDefinition.getName()) - .getConstructor() - .newInstance(); + module = (InstrumenterModule) Thread.currentThread() + .getContextClassLoader() + .loadClass(moduleDefinition.getName()) + .getConstructor() + .newInstance(); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } @@ -86,19 +84,18 @@ private static Reference[] generateReferences( final Set referenceSources = new HashSet<>(); final Map references = new LinkedHashMap<>(); final Set adviceClasses = new HashSet<>(); - instrumenter.methodAdvice( - (matcher, adviceClass, additionalClasses) -> { - adviceClasses.add(adviceClass); - if (additionalClasses != null) { - adviceClasses.addAll(asList(additionalClasses)); - } - }); + instrumenter.methodAdvice((matcher, adviceClass, additionalClasses) -> { + adviceClasses.add(adviceClass); + if (additionalClasses != null) { + adviceClasses.addAll(asList(additionalClasses)); + } + }); ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); for (String adviceClass : adviceClasses) { if (referenceSources.add(adviceClass)) { - for (Map.Entry entry : - ReferenceCreator.createReferencesFrom(adviceClass, adviceShader, contextClassLoader) - .entrySet()) { + for (Map.Entry entry : ReferenceCreator.createReferencesFrom( + adviceClass, adviceShader, contextClassLoader) + .entrySet()) { Reference toMerge = references.get(entry.getKey()); if (null == toMerge) { references.put(entry.getKey(), entry.getValue()); @@ -143,13 +140,12 @@ private static byte[] generateMuzzleClass(InstrumenterModule module) { "java/lang/Object", null); - MethodVisitor mv = - cw.visitMethod( - Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, - "create", - "()Ldatadog/trace/agent/tooling/muzzle/ReferenceMatcher;", - null, - null); + MethodVisitor mv = cw.visitMethod( + Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, + "create", + "()Ldatadog/trace/agent/tooling/muzzle/ReferenceMatcher;", + null, + null); mv.visitCode(); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleVersionScanPlugin.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleVersionScanPlugin.java index 9ecbb4f40cb..26c023b0778 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleVersionScanPlugin.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/MuzzleVersionScanPlugin.java @@ -96,9 +96,8 @@ public static void assertInstrumentationMuzzled( private static BiConsumer injectClassHelper(ClassLoader cl) { try { Method findLoadedClass = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class); - Method defineClass = - ClassLoader.class.getDeclaredMethod( - "defineClass", String.class, byte[].class, int.class, int.class); + Method defineClass = ClassLoader.class.getDeclaredMethod( + "defineClass", String.class, byte[].class, int.class, int.class); findLoadedClass.setAccessible(true); defineClass.setAccessible(true); return (name, bytes) -> { @@ -160,12 +159,11 @@ private static Map createHelperMap(final InstrumenterModule modu } final String parent = helperName.substring(0, nestedClassIndex); if (!helperClassNames.contains(parent)) { - throw new IllegalArgumentException( - "Nested helper " - + helperName - + " must have the parent class " - + parent - + " also defined as a helper"); + throw new IllegalArgumentException("Nested helper " + + helperName + + " must have the parent class " + + parent + + " also defined as a helper"); } } final ClassFileLocator locator = diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java index 5fdc4d3f827..b953a2259ae 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java @@ -214,13 +214,11 @@ public void visit( // Add references to each of the interfaces. for (String iface : interfaces) { if (!ignoreReference(iface)) { - addReference( - new Reference.Builder(iface) - .withSource( - refSourceClassName, - UNDEFINED_LINE) // We don't have a specific line number to use. - .withFlag(Reference.EXPECTS_PUBLIC) - .build()); + addReference(new Reference.Builder(iface) + .withSource( + refSourceClassName, UNDEFINED_LINE) // We don't have a specific line number to use. + .withFlag(Reference.EXPECTS_PUBLIC) + .build()); } } // the super type is handled by the method visitor to the constructor. @@ -285,43 +283,38 @@ public void visitFieldInsn( // * DONE field-source class (descriptor) // * DONE field-source visibility from this point (PRIVATE?) - final Type ownerType = - owner.startsWith("[") - ? underlyingType(Type.getType(owner)) - : Type.getType("L" + owner + ";"); + final Type ownerType = owner.startsWith("[") + ? underlyingType(Type.getType(owner)) + : Type.getType("L" + owner + ";"); final Type fieldType = Type.getType(descriptor); String ownerTypeInternalName = ownerType.getInternalName(); int fieldFlags = 0; fieldFlags |= computeMinimumFieldAccess(refSourceTypeInternalName, ownerTypeInternalName); - fieldFlags |= - opcode == Opcodes.GETSTATIC || opcode == Opcodes.PUTSTATIC - ? Reference.EXPECTS_STATIC - : Reference.EXPECTS_NON_STATIC; - - addReference( - new Reference.Builder(ownerTypeInternalName) - .withSource(refSourceClassName, currentLineNumber) - .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, ownerTypeInternalName)) - .withField( - new String[] {refSourceClassName + ":" + currentLineNumber}, - fieldFlags, - name, - fieldType) - .build()); + fieldFlags |= opcode == Opcodes.GETSTATIC || opcode == Opcodes.PUTSTATIC + ? Reference.EXPECTS_STATIC + : Reference.EXPECTS_NON_STATIC; + + addReference(new Reference.Builder(ownerTypeInternalName) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, ownerTypeInternalName)) + .withField( + new String[] {refSourceClassName + ":" + currentLineNumber}, + fieldFlags, + name, + fieldType) + .build()); final Type underlyingFieldType = underlyingType(fieldType); String underlyingFieldTypeInternalName = underlyingFieldType.getInternalName(); if (underlyingFieldType.getSort() == Type.OBJECT && !ignoreReference(underlyingFieldTypeInternalName)) { - addReference( - new Reference.Builder(underlyingFieldTypeInternalName) - .withSource(refSourceClassName, currentLineNumber) - .withFlag( - computeMinimumClassAccess( - refSourceTypeInternalName, underlyingFieldTypeInternalName)) - .build()); + addReference(new Reference.Builder(underlyingFieldTypeInternalName) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess( + refSourceTypeInternalName, underlyingFieldTypeInternalName)) + .build()); } super.visitFieldInsn(opcode, owner, name, descriptor); } @@ -352,12 +345,11 @@ public void visitMethodInsn( final Type returnType = underlyingType(methodType.getReturnType()); String returnTypeInternalName = returnType.getInternalName(); if (returnType.getSort() == Type.OBJECT && !ignoreReference(returnTypeInternalName)) { - addReference( - new Reference.Builder(returnTypeInternalName) - .withSource(refSourceClassName, currentLineNumber) - .withFlag( - computeMinimumClassAccess(refSourceTypeInternalName, returnTypeInternalName)) - .build()); + addReference(new Reference.Builder(returnTypeInternalName) + .withSource(refSourceClassName, currentLineNumber) + .withFlag( + computeMinimumClassAccess(refSourceTypeInternalName, returnTypeInternalName)) + .build()); } } // refs for method param types @@ -365,19 +357,16 @@ public void visitMethodInsn( paramType = underlyingType(paramType); String paramTypeInternalName = paramType.getInternalName(); if (paramType.getSort() == Type.OBJECT && !ignoreReference(paramTypeInternalName)) { - addReference( - new Reference.Builder(paramTypeInternalName) - .withSource(refSourceClassName, currentLineNumber) - .withFlag( - computeMinimumClassAccess(refSourceTypeInternalName, paramTypeInternalName)) - .build()); + addReference(new Reference.Builder(paramTypeInternalName) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, paramTypeInternalName)) + .build()); } } - final Type ownerType = - owner.startsWith("[") - ? underlyingType(Type.getType(owner)) - : Type.getType("L" + owner + ";"); + final Type ownerType = owner.startsWith("[") + ? underlyingType(Type.getType(owner)) + : Type.getType("L" + owner + ";"); String ownerTypeInternalName = ownerType.getInternalName(); int methodFlags = 0; @@ -385,18 +374,17 @@ public void visitMethodInsn( opcode == Opcodes.INVOKESTATIC ? Reference.EXPECTS_STATIC : Reference.EXPECTS_NON_STATIC; methodFlags |= computeMinimumMethodAccess(refSourceTypeInternalName, ownerTypeInternalName); - addReference( - new Reference.Builder(ownerTypeInternalName) - .withSource(refSourceClassName, currentLineNumber) - .withFlag(isInterface ? Reference.EXPECTS_INTERFACE : Reference.EXPECTS_NON_INTERFACE) - .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, ownerTypeInternalName)) - .withMethod( - new String[] {refSourceClassName + ":" + currentLineNumber}, - methodFlags, - name, - methodType.getReturnType(), - methodType.getArgumentTypes()) - .build()); + addReference(new Reference.Builder(ownerTypeInternalName) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(isInterface ? Reference.EXPECTS_INTERFACE : Reference.EXPECTS_NON_INTERFACE) + .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, ownerTypeInternalName)) + .withMethod( + new String[] {refSourceClassName + ":" + currentLineNumber}, + methodFlags, + name, + methodType.getReturnType(), + methodType.getArgumentTypes()) + .build()); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); } @@ -411,12 +399,10 @@ public void visitTypeInsn(final int opcode, final String stype) { return; } - addReference( - new Reference.Builder(type.getInternalName()) - .withSource(refSourceClassName, currentLineNumber) - .withFlag( - computeMinimumClassAccess(refSourceTypeInternalName, type.getInternalName())) - .build()); + addReference(new Reference.Builder(type.getInternalName()) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, type.getInternalName())) + .build()); super.visitTypeInsn(opcode, stype); } @@ -427,25 +413,21 @@ public void visitInvokeDynamicInsn( Handle bootstrapMethodHandle, Object... bootstrapMethodArguments) { // This part might be unnecessary... - addReference( - new Reference.Builder(bootstrapMethodHandle.getOwner()) - .withSource(refSourceClassName, currentLineNumber) - .withFlag( - computeMinimumClassAccess( - refSourceTypeInternalName, - Type.getObjectType(bootstrapMethodHandle.getOwner()).getInternalName())) - .build()); + addReference(new Reference.Builder(bootstrapMethodHandle.getOwner()) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess( + refSourceTypeInternalName, + Type.getObjectType(bootstrapMethodHandle.getOwner()).getInternalName())) + .build()); for (Object arg : bootstrapMethodArguments) { if (arg instanceof Handle) { Handle handle = (Handle) arg; - addReference( - new Reference.Builder(handle.getOwner()) - .withSource(refSourceClassName, currentLineNumber) - .withFlag( - computeMinimumClassAccess( - refSourceTypeInternalName, - Type.getObjectType(handle.getOwner()).getInternalName())) - .build()); + addReference(new Reference.Builder(handle.getOwner()) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess( + refSourceTypeInternalName, + Type.getObjectType(handle.getOwner()).getInternalName())) + .build()); } } super.visitInvokeDynamicInsn( @@ -458,11 +440,10 @@ public void visitLdcInsn(final Object value) { final Type type = underlyingType((Type) value); String typeInternalName = type.getInternalName(); if (type.getSort() == Type.OBJECT && !ignoreReference(typeInternalName)) { - addReference( - new Reference.Builder(typeInternalName) - .withSource(refSourceClassName, currentLineNumber) - .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, typeInternalName)) - .build()); + addReference(new Reference.Builder(typeInternalName) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess(refSourceTypeInternalName, typeInternalName)) + .build()); } } super.visitLdcInsn(value); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java index beb32415609..f8c964ac9d9 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceMatcher.java @@ -124,9 +124,8 @@ private static boolean checkMatch( mismatches.add(new Mismatch.MissingClass(reference.sources, className)); } else { // Shouldn't happen. Fail the reference check and add a mismatch for debug logging. - mismatches.add( - new Mismatch.ReferenceCheckError( - e, reference, null != loader ? loader.toString() : "")); + mismatches.add(new Mismatch.ReferenceCheckError( + e, reference, null != loader ? loader.toString() : "")); } return false; } @@ -140,9 +139,8 @@ public static boolean checkMatch( if (!Reference.matches(reference.flags, typeOnClasspath.getModifiers())) { final String desc = reference.className; - mismatches.add( - new Mismatch.MissingFlag( - reference.sources, desc, reference.flags, typeOnClasspath.getModifiers())); + mismatches.add(new Mismatch.MissingFlag( + reference.sources, desc, reference.flags, typeOnClasspath.getModifiers())); } // we match the fields and methods we are looking for by name, type or descriptor, and flags. @@ -171,20 +169,15 @@ public static boolean checkMatch( } for (Reference.Field missingField : indexedFields.values()) { - mismatches.add( - new Reference.Mismatch.MissingField( - missingField.sources, - reference.className, - missingField.name, - missingField.fieldType)); + mismatches.add(new Reference.Mismatch.MissingField( + missingField.sources, reference.className, missingField.name, missingField.fieldType)); } for (Reference.Method missingMethod : indexedMethods.values()) { - mismatches.add( - new Reference.Mismatch.MissingMethod( - missingMethod.sources, - reference.className, - missingMethod.name, - missingMethod.methodType)); + mismatches.add(new Reference.Mismatch.MissingMethod( + missingMethod.sources, + reference.className, + missingMethod.name, + missingMethod.methodType)); } return previousMismatchCount == mismatches.size(); @@ -238,9 +231,8 @@ private static void findFieldsForType( if (null != found) { if (!Reference.matches(found.flags, fieldType.getModifiers())) { final String desc = reference.className + "#" + found.name + found.fieldType; - flagMismatches.add( - new Mismatch.MissingFlag( - found.sources, desc, found.flags, fieldType.getModifiers())); + flagMismatches.add(new Mismatch.MissingFlag( + found.sources, desc, found.flags, fieldType.getModifiers())); break; } } @@ -287,9 +279,8 @@ private static void findMethodsForType( // will stop looking for this one now, but check it has the right flags if (!Reference.matches(found.flags, methodDescription.getModifiers())) { final String desc = reference.className + "#" + found.name + found.methodType; - flagMismatches.add( - new Mismatch.MissingFlag( - found.sources, desc, found.flags, methodDescription.getModifiers())); + flagMismatches.add(new Mismatch.MissingFlag( + found.sources, desc, found.flags, methodDescription.getModifiers())); break; } } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/stratum/Resolver.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/stratum/Resolver.java index b5e2092105b..38907d9abb9 100755 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/stratum/Resolver.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/stratum/Resolver.java @@ -45,58 +45,52 @@ private static void resolve(final Context context, final LineInfo eli) { int completeCount = Math.min(available / eli.getOutputLineIncrement(), eli.getRepeatCount()); - FileInfo fileInfo = - getByPath( - context.resolvedStratum.getFileInfo(), eli.getFileInfo().getInputFilePath()); + FileInfo fileInfo = getByPath( + context.resolvedStratum.getFileInfo(), eli.getFileInfo().getInputFilePath()); if (fileInfo == null) { fileInfo = eli.getFileInfo(); context.resolvedStratum.getFileInfo().add(fileInfo); } if (completeCount > 0) { - LineInfo rli = - new LineInfo( - fileInfo, - eli.getInputStartLine(), - completeCount, - oli.getOutputStartLine() + difference * oli.getOutputLineIncrement(), - eli.getOutputLineIncrement() * oli.getOutputLineIncrement()); + LineInfo rli = new LineInfo( + fileInfo, + eli.getInputStartLine(), + completeCount, + oli.getOutputStartLine() + difference * oli.getOutputLineIncrement(), + eli.getOutputLineIncrement() * oli.getOutputLineIncrement()); context.resolvedStratum.addLineInfo(rli); - LineInfo neli = - new LineInfo( - fileInfo, - eli.getInputStartLine() + completeCount, - eli.getRepeatCount() - completeCount, - eli.getOutputStartLine() + completeCount * eli.getOutputLineIncrement(), - eli.getOutputLineIncrement()); + LineInfo neli = new LineInfo( + fileInfo, + eli.getInputStartLine() + completeCount, + eli.getRepeatCount() - completeCount, + eli.getOutputStartLine() + completeCount * eli.getOutputLineIncrement(), + eli.getOutputLineIncrement()); resolve(context, neli); } else { - LineInfo rli = - new LineInfo( - fileInfo, - eli.getInputStartLine(), - 1, - oli.getOutputStartLine() + difference * oli.getOutputLineIncrement(), - available); + LineInfo rli = new LineInfo( + fileInfo, + eli.getInputStartLine(), + 1, + oli.getOutputStartLine() + difference * oli.getOutputLineIncrement(), + available); context.resolvedStratum.addLineInfo(rli); - LineInfo neli = - new LineInfo( - fileInfo, - eli.getInputStartLine(), - 1, - eli.getOutputStartLine() + available, - eli.getOutputLineIncrement() - available); + LineInfo neli = new LineInfo( + fileInfo, + eli.getInputStartLine(), + 1, + eli.getOutputStartLine() + available, + eli.getOutputLineIncrement() - available); resolve(context, neli); - neli = - new LineInfo( - fileInfo, - eli.getInputStartLine() + 1, - eli.getRepeatCount() - 1, - eli.getOutputStartLine() + eli.getOutputLineIncrement(), - eli.getOutputLineIncrement()); + neli = new LineInfo( + fileInfo, + eli.getInputStartLine() + 1, + eli.getRepeatCount() - 1, + eli.getOutputStartLine() + eli.getOutputLineIncrement(), + eli.getOutputLineIncrement()); resolve(context, neli); } @@ -162,10 +156,9 @@ public Location resolve(final SourceMap sourceMap, final String stratumName, fin bestFitLineNum = lineInfo.getInputStartLine() + i; bfOutputStartLine = bestFitLineInfo.getOutputStartLine() + i * bestFitLineInfo.getOutputLineIncrement(); - bfOutputEndLine = - Math.max( - bfOutputStartLine, - bfOutputStartLine + bestFitLineInfo.getOutputLineIncrement() - 1); + bfOutputEndLine = Math.max( + bfOutputStartLine, + bfOutputStartLine + bestFitLineInfo.getOutputLineIncrement() - 1); } } } diff --git a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/EnclosedClasses.java b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/EnclosedClasses.java index f316d669e4b..f3762b962a5 100644 --- a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/EnclosedClasses.java +++ b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/EnclosedClasses.java @@ -5,13 +5,12 @@ public class EnclosedClasses { static { - String id = - new Supplier() { - @Override - public String get() { - return Long.toString(System.currentTimeMillis()); - } - }.get(); + String id = new Supplier() { + @Override + public String get() { + return Long.toString(System.currentTimeMillis()); + } + }.get(); assert id != null; } diff --git a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/MuzzleWeakReferenceTest.java b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/MuzzleWeakReferenceTest.java index 4f7400df19e..0e7cd0fd880 100644 --- a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/MuzzleWeakReferenceTest.java +++ b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/MuzzleWeakReferenceTest.java @@ -14,12 +14,11 @@ public class MuzzleWeakReferenceTest { public static boolean classLoaderRefIsGarbageCollected() throws InterruptedException { ClassLoader loader = new URLClassLoader(new URL[0], null); final WeakReference clRef = new WeakReference<>(loader); - final Reference[] refs = - ReferenceCreator.createReferencesFrom( - TestAdviceClasses.MethodBodyAdvice.class.getName(), - MuzzleWeakReferenceTest.class.getClassLoader()) - .values() - .toArray(new Reference[0]); + final Reference[] refs = ReferenceCreator.createReferencesFrom( + TestAdviceClasses.MethodBodyAdvice.class.getName(), + MuzzleWeakReferenceTest.class.getClassLoader()) + .values() + .toArray(new Reference[0]); final ReferenceMatcher refMatcher = new ReferenceMatcher(refs); refMatcher.getMismatchedReferenceSources(loader); loader = null; diff --git a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/TestInstrumentationClasses.java b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/TestInstrumentationClasses.java index e5b5a28a3a6..0e65b68b344 100644 --- a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/TestInstrumentationClasses.java +++ b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/tooling/muzzle/TestInstrumentationClasses.java @@ -8,9 +8,8 @@ public abstract class TestInstrumentationClasses { static final Reference[] SOME_ADVICE_REFS; static { - Map references = - ReferenceCreator.createReferencesFrom( - SomeAdvice.class.getName(), SomeAdvice.class.getClassLoader()); + Map references = ReferenceCreator.createReferencesFrom( + SomeAdvice.class.getName(), SomeAdvice.class.getClassLoader()); SOME_ADVICE_REFS = references.values().toArray(new Reference[0]); } diff --git a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java index 3238723bf51..05c23fc1b05 100644 --- a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java +++ b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/AppSecBenchmark.java @@ -128,13 +128,12 @@ public void normalRequestNoWafMetrics() { static class StubOkHttpClient extends OkHttpClient { @Override public Call newCall(final Request request) { - final Response response = - new Response.Builder() - .request(request) - .protocol(Protocol.HTTP_1_0) - .code(200) - .message("OK") - .build(); + final Response response = new Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_0) + .code(200) + .message("OK") + .build(); return new Call() { @Override @@ -150,14 +149,13 @@ public Response execute() throws IOException { @Override public void enqueue(Callback responseCallback) { final Call thiz = this; - new Thread( - () -> { - try { - responseCallback.onResponse(thiz, response); - } catch (IOException e) { - throw new UndeclaredThrowableException(e); - } - }) + new Thread(() -> { + try { + responseCallback.onResponse(thiz, response); + } catch (IOException e) { + throw new UndeclaredThrowableException(e); + } + }) .start(); } diff --git a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/EventDispatcherBenchmark.java b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/EventDispatcherBenchmark.java index 2375c3fb1f4..12fc42a5751 100644 --- a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/EventDispatcherBenchmark.java +++ b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/EventDispatcherBenchmark.java @@ -43,12 +43,9 @@ public static class DispatcherState { @Param({"5", "5000"}) int numUnusedSubscribers; - Address[] usedAddresses = - new Address[] { - KnownAddresses.REQUEST_BODY_RAW, - KnownAddresses.REQUEST_COOKIES, - KnownAddresses.REQUEST_QUERY - }; + Address[] usedAddresses = new Address[] { + KnownAddresses.REQUEST_BODY_RAW, KnownAddresses.REQUEST_COOKIES, KnownAddresses.REQUEST_QUERY + }; Address unusedAddress = KnownAddresses.HEADERS_NO_COOKIES; @@ -80,21 +77,19 @@ public void create() { private void doSubscribe( EventDispatcher.DataSubscriptionSet subsSet, Address address, int i) { final OrderedCallback.Priority priority = PRIORITY_VALUES[i % 4]; - subsSet.addSubscription( - Collections.singletonList(address), - new DataListener() { - @Override - public void onDataAvailable( - ChangeableFlow flow, - AppSecRequestContext context, - DataBundle dataBundle, - GatewayContext gatewayContext) {} - - @Override - public Priority getPriority() { - return priority; - } - }); + subsSet.addSubscription(Collections.singletonList(address), new DataListener() { + @Override + public void onDataAvailable( + ChangeableFlow flow, + AppSecRequestContext context, + DataBundle dataBundle, + GatewayContext gatewayContext) {} + + @Override + public Priority getPriority() { + return priority; + } + }); } void run() { diff --git a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/WafBenchmark.java b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/WafBenchmark.java index df43839203e..07ef8b714ff 100644 --- a/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/WafBenchmark.java +++ b/dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/WafBenchmark.java @@ -41,10 +41,9 @@ @OutputTimeUnit(MICROSECONDS) @Fork(value = 3) public class WafBenchmark { - private static final JsonAdapter> ADAPTER = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + private static final JsonAdapter> ADAPTER = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); static { BenchmarkUtil.disableLogging(); diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java index 7258637b5bd..f263d5490bc 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java @@ -73,20 +73,18 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s ConfigurationPoller configurationPoller = sco.configurationPoller(config); // may throw and abort startup - APP_SEC_CONFIG_SERVICE = - new AppSecConfigServiceImpl( - config, configurationPoller, () -> reloadSubscriptions(REPLACEABLE_EVENT_PRODUCER)); + APP_SEC_CONFIG_SERVICE = new AppSecConfigServiceImpl( + config, configurationPoller, () -> reloadSubscriptions(REPLACEABLE_EVENT_PRODUCER)); if (appSecEnabledConfig == ProductActivation.FULLY_ENABLED) { APP_SEC_CONFIG_SERVICE.init(); } sco.createRemaining(config); - GatewayBridge gatewayBridge = - new GatewayBridge( - gw, - REPLACEABLE_EVENT_PRODUCER, - () -> API_SECURITY_SAMPLER, - APP_SEC_CONFIG_SERVICE.getTraceSegmentPostProcessors()); + GatewayBridge gatewayBridge = new GatewayBridge( + gw, + REPLACEABLE_EVENT_PRODUCER, + () -> API_SECURITY_SAMPLER, + APP_SEC_CONFIG_SERVICE.getTraceSegmentPostProcessors()); loadModules( eventDispatcher, sco.monitoring, appSecEnabledConfig == ProductActivation.FULLY_ENABLED); @@ -120,7 +118,8 @@ public static void setActive(boolean status) { // Report to the product change via telemetry log.debug("AppSec is now {}", status ? "active" : "inactive"); ProductChangeCollector.get() - .update(new ProductChange().productType(ProductChange.ProductType.APPSEC).enabled(status)); + .update( + new ProductChange().productType(ProductChange.ProductType.APPSEC).enabled(status)); if (status) { maybeInitializeApiSecurity(); } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/api/security/AppSecSpanPostProcessor.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/api/security/AppSecSpanPostProcessor.java index c78b779c3ee..f9eafece442 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/api/security/AppSecSpanPostProcessor.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/api/security/AppSecSpanPostProcessor.java @@ -81,9 +81,8 @@ private void extractSchemas( return; } - final DataBundle bundle = - new SingletonDataBundle<>( - KnownAddresses.WAF_CONTEXT_PROCESSOR, Collections.singletonMap("extract-schema", true)); + final DataBundle bundle = new SingletonDataBundle<>( + KnownAddresses.WAF_CONTEXT_PROCESSOR, Collections.singletonMap("extract-schema", true)); try { GatewayContext gwCtx = new GatewayContext(false); producerService.publishDataEvent(sub, ctx, bundle, gwCtx); diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/blocking/BlockingServiceImpl.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/blocking/BlockingServiceImpl.java index 827e436b6c8..8ae39736fc3 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/blocking/BlockingServiceImpl.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/blocking/BlockingServiceImpl.java @@ -87,9 +87,8 @@ public boolean tryCommitBlockingResponse( } log.debug("About to call block response function: {}", blockResponseFunction); - boolean res = - blockResponseFunction.tryCommitBlockingResponse( - reqCtx.getTraceSegment(), statusCode, templateType, extraHeaders, null); + boolean res = blockResponseFunction.tryCommitBlockingResponse( + reqCtx.getTraceSegment(), statusCode, templateType, extraHeaders, null); if (res) { TraceSegment traceSegment = reqCtx.getTraceSegment(); if (traceSegment != null) { diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java index dc450baeff1..07a76bf0ccd 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java @@ -96,10 +96,9 @@ public class AppSecConfigServiceImpl implements AppSecConfigService { new WAFInitializationResultReporter(); private final WAFStatsReporter statsReporter = new WAFStatsReporter(); - private static final JsonAdapter> ADAPTER = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + private static final JsonAdapter> ADAPTER = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); @SuppressFBWarnings( value = "AT_STALE_THREAD_WRITE_OF_PRIMITIVE", @@ -149,25 +148,24 @@ private void subscribeConfigurationPoller() { } private long getRulesAndDataCapabilities() { - long capabilities = - CAPABILITY_ASM_DD_RULES - | CAPABILITY_ASM_DD_MULTICONFIG - | CAPABILITY_ASM_IP_BLOCKING - | CAPABILITY_ASM_EXCLUSIONS - | CAPABILITY_ASM_EXCLUSION_DATA - | CAPABILITY_ASM_REQUEST_BLOCKING - | CAPABILITY_ASM_USER_BLOCKING - | CAPABILITY_ASM_CUSTOM_RULES - | CAPABILITY_ASM_CUSTOM_BLOCKING_RESPONSE - | CAPABILITY_ASM_TRUSTED_IPS - | CAPABILITY_ASM_PROCESSOR_OVERRIDES - | CAPABILITY_ASM_CUSTOM_DATA_SCANNERS - | CAPABILITY_ENDPOINT_FINGERPRINT - | CAPABILITY_ASM_SESSION_FINGERPRINT - | CAPABILITY_ASM_NETWORK_FINGERPRINT - | CAPABILITY_ASM_HEADER_FINGERPRINT - | CAPABILITY_ASM_TRACE_TAGGING_RULES - | CAPABILITY_ASM_EXTENDED_DATA_COLLECTION; + long capabilities = CAPABILITY_ASM_DD_RULES + | CAPABILITY_ASM_DD_MULTICONFIG + | CAPABILITY_ASM_IP_BLOCKING + | CAPABILITY_ASM_EXCLUSIONS + | CAPABILITY_ASM_EXCLUSION_DATA + | CAPABILITY_ASM_REQUEST_BLOCKING + | CAPABILITY_ASM_USER_BLOCKING + | CAPABILITY_ASM_CUSTOM_RULES + | CAPABILITY_ASM_CUSTOM_BLOCKING_RESPONSE + | CAPABILITY_ASM_TRUSTED_IPS + | CAPABILITY_ASM_PROCESSOR_OVERRIDES + | CAPABILITY_ASM_CUSTOM_DATA_SCANNERS + | CAPABILITY_ENDPOINT_FINGERPRINT + | CAPABILITY_ASM_SESSION_FINGERPRINT + | CAPABILITY_ASM_NETWORK_FINGERPRINT + | CAPABILITY_ASM_HEADER_FINGERPRINT + | CAPABILITY_ASM_TRACE_TAGGING_RULES + | CAPABILITY_ASM_EXTENDED_DATA_COLLECTION; if (tracerConfig.isAppSecRaspEnabled()) { capabilities |= CAPABILITY_ASM_RASP_SQLI; capabilities |= CAPABILITY_ASM_RASP_SSRF; @@ -228,9 +226,8 @@ public void accept(ConfigKey configKey, byte[] content, PollingRateHinter pollin return; } final String key = configKey.toString(); - Map contentMap = - (Map) - ADAPTER.fromJson(Okio.buffer(Okio.source(new ByteArrayInputStream(content)))); + Map contentMap = (Map) + ADAPTER.fromJson(Okio.buffer(Okio.source(new ByteArrayInputStream(content)))); if (contentMap == null || contentMap.isEmpty()) { ignoredConfigKeys.add(key); } else { @@ -426,9 +423,8 @@ public void maybeSubscribeConfigPolling() { } if (this.configurationPoller != null) { if (hasUserWafConfig && appSecActivation == ProductActivation.FULLY_ENABLED) { - log.info( - "AppSec will not use remote config because " - + "there is a custom user configuration and AppSec is explicitly enabled"); + log.info("AppSec will not use remote config because " + + "there is a custom user configuration and AppSec is explicitly enabled"); } else { subscribeConfigurationPoller(); } @@ -487,10 +483,9 @@ public TransactionalAppSecModuleConfigurer createAppSecModuleConfigurer() { private static Map loadDefaultWafConfig() throws IOException { log.debug("Loading default waf config"); - try (InputStream is = - AppSecConfigServiceImpl.class - .getClassLoader() - .getResourceAsStream(DEFAULT_CONFIG_LOCATION)) { + try (InputStream is = AppSecConfigServiceImpl.class + .getClassLoader() + .getResourceAsStream(DEFAULT_CONFIG_LOCATION)) { if (is == null) { throw new IOException("Resource " + DEFAULT_CONFIG_LOCATION + " not found"); } @@ -538,32 +533,31 @@ public void close() { if (this.configurationPoller == null) { return; } - this.configurationPoller.removeCapabilities( - CAPABILITY_ASM_ACTIVATION - | CAPABILITY_ASM_DD_RULES - | CAPABILITY_ASM_DD_MULTICONFIG - | CAPABILITY_ASM_IP_BLOCKING - | CAPABILITY_ASM_EXCLUSIONS - | CAPABILITY_ASM_EXCLUSION_DATA - | CAPABILITY_ASM_REQUEST_BLOCKING - | CAPABILITY_ASM_USER_BLOCKING - | CAPABILITY_ASM_CUSTOM_RULES - | CAPABILITY_ASM_CUSTOM_BLOCKING_RESPONSE - | CAPABILITY_ASM_TRUSTED_IPS - | CAPABILITY_ASM_PROCESSOR_OVERRIDES - | CAPABILITY_ASM_CUSTOM_DATA_SCANNERS - | CAPABILITY_ASM_RASP_SQLI - | CAPABILITY_ASM_RASP_SSRF - | CAPABILITY_ASM_RASP_LFI - | CAPABILITY_ASM_RASP_CMDI - | CAPABILITY_ASM_RASP_SHI - | CAPABILITY_ASM_AUTO_USER_INSTRUM_MODE - | CAPABILITY_ENDPOINT_FINGERPRINT - | CAPABILITY_ASM_SESSION_FINGERPRINT - | CAPABILITY_ASM_NETWORK_FINGERPRINT - | CAPABILITY_ASM_HEADER_FINGERPRINT - | CAPABILITY_ASM_TRACE_TAGGING_RULES - | CAPABILITY_ASM_EXTENDED_DATA_COLLECTION); + this.configurationPoller.removeCapabilities(CAPABILITY_ASM_ACTIVATION + | CAPABILITY_ASM_DD_RULES + | CAPABILITY_ASM_DD_MULTICONFIG + | CAPABILITY_ASM_IP_BLOCKING + | CAPABILITY_ASM_EXCLUSIONS + | CAPABILITY_ASM_EXCLUSION_DATA + | CAPABILITY_ASM_REQUEST_BLOCKING + | CAPABILITY_ASM_USER_BLOCKING + | CAPABILITY_ASM_CUSTOM_RULES + | CAPABILITY_ASM_CUSTOM_BLOCKING_RESPONSE + | CAPABILITY_ASM_TRUSTED_IPS + | CAPABILITY_ASM_PROCESSOR_OVERRIDES + | CAPABILITY_ASM_CUSTOM_DATA_SCANNERS + | CAPABILITY_ASM_RASP_SQLI + | CAPABILITY_ASM_RASP_SSRF + | CAPABILITY_ASM_RASP_LFI + | CAPABILITY_ASM_RASP_CMDI + | CAPABILITY_ASM_RASP_SHI + | CAPABILITY_ASM_AUTO_USER_INSTRUM_MODE + | CAPABILITY_ENDPOINT_FINGERPRINT + | CAPABILITY_ASM_SESSION_FINGERPRINT + | CAPABILITY_ASM_NETWORK_FINGERPRINT + | CAPABILITY_ASM_HEADER_FINGERPRINT + | CAPABILITY_ASM_TRACE_TAGGING_RULES + | CAPABILITY_ASM_EXTENDED_DATA_COLLECTION); this.configurationPoller.removeListeners(Product.ASM_DD); this.configurationPoller.removeListeners(Product.ASM_DATA); this.configurationPoller.removeListeners(Product.ASM); diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFInitializationResultReporter.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFInitializationResultReporter.java index c6587d167c6..34a620e2df8 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFInitializationResultReporter.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFInitializationResultReporter.java @@ -24,9 +24,8 @@ public class WAFInitializationResultReporter implements TraceSegmentPostProcesso private static final JsonAdapter>> RULES_ERRORS_ADAPTER = new Moshi.Builder() .build() - .adapter( - Types.newParameterizedType( - Map.class, String.class, Types.newParameterizedType(List.class, String.class))); + .adapter(Types.newParameterizedType( + Map.class, String.class, Types.newParameterizedType(List.class, String.class))); private final AtomicReference pendingReportRef = new AtomicReference<>(); public void setReportForPublication(WafDiagnostics report) { diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java index 4c07c1e5a7a..8beb67a3746 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java @@ -118,15 +118,14 @@ private CtxAndAddresses(Collection> addressesOfInterest, WafHandle ct // used in testing static void createLimitsObject() { - LIMITS = - new Waf.Limits( - MAX_DEPTH, - MAX_ELEMENTS, - MAX_STRING_SIZE, - /* set effectively infinite budgets. Don't use Long.MAX_VALUE, because - * traditionally ddwaf has had problems with too large budgets */ - ((long) Integer.MAX_VALUE) * 1000, - Config.get().getAppSecWafTimeout()); + LIMITS = new Waf.Limits( + MAX_DEPTH, + MAX_ELEMENTS, + MAX_STRING_SIZE, + /* set effectively infinite budgets. Don't use Long.MAX_VALUE, because + * traditionally ddwaf has had problems with too large budgets */ + ((long) Integer.MAX_VALUE) * 1000, + Config.get().getAppSecWafTimeout()); } private final boolean wafMetricsEnabled = @@ -222,9 +221,8 @@ private static RateLimiter getRateLimiter(Monitoring monitoring) { int appSecTraceRateLimit = Config.get().getAppSecTraceRateLimit(); if (appSecTraceRateLimit > 0) { Counter counter = monitoring.newCounter("_dd.java.appsec.rate_limit.dropped_traces"); - rateLimiter = - new RateLimiter( - appSecTraceRateLimit, SystemTimeSource.INSTANCE, () -> counter.increment(1)); + rateLimiter = new RateLimiter( + appSecTraceRateLimit, SystemTimeSource.INSTANCE, () -> counter.increment(1)); } return rateLimiter; } @@ -412,10 +410,9 @@ public void onDataAvailable( // Handle max_collected_headers parameter which can come as Number or String // representation of a number int maxHeaders = AppSecRequestContext.DEFAULT_EXTENDED_DATA_COLLECTION_MAX_HEADERS; - Object maxHeadersParam = - actionInfo.parameters.getOrDefault( - "max_collected_headers", - AppSecRequestContext.DEFAULT_EXTENDED_DATA_COLLECTION_MAX_HEADERS); + Object maxHeadersParam = actionInfo.parameters.getOrDefault( + "max_collected_headers", + AppSecRequestContext.DEFAULT_EXTENDED_DATA_COLLECTION_MAX_HEADERS); if (maxHeadersParam instanceof Number) { maxHeaders = ((Number) maxHeadersParam).intValue(); } else if (maxHeadersParam instanceof String) { diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java index 4784aa03980..abb29582577 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java @@ -54,61 +54,54 @@ public class AppSecRequestContext implements DataBundle, Closeable, AppSecContex // Values MUST be lowercase! Lookup with Ignore Case // was removed due performance reason // request headers that will always be set when appsec is enabled - public static final Set DEFAULT_REQUEST_HEADERS_ALLOW_LIST = - new TreeSet<>( - Arrays.asList( - "content-type", - "user-agent", - "accept", - "x-amzn-trace-id", - "cloudfront-viewer-ja3-fingerprint", - "cf-ray", - "x-cloud-trace-context", - "x-appgw-trace-id", - "x-sigsci-requestid", - "x-sigsci-tags", - "akamai-user-risk")); + public static final Set DEFAULT_REQUEST_HEADERS_ALLOW_LIST = new TreeSet<>(Arrays.asList( + "content-type", + "user-agent", + "accept", + "x-amzn-trace-id", + "cloudfront-viewer-ja3-fingerprint", + "cf-ray", + "x-cloud-trace-context", + "x-appgw-trace-id", + "x-sigsci-requestid", + "x-sigsci-tags", + "akamai-user-risk")); // request headers when there are security events - public static final Set REQUEST_HEADERS_ALLOW_LIST = - new TreeSet<>( - Arrays.asList( - "x-forwarded-for", - "x-real-ip", - "true-client-ip", - "x-client-ip", - "x-forwarded", - "forwarded-for", - "x-cluster-client-ip", - "fastly-client-ip", - "cf-connecting-ip", - "cf-connecting-ipv6", - "forwarded", - "via", - "content-length", - "content-encoding", - "content-language", - "host", - "accept-encoding", - "accept-language")); + public static final Set REQUEST_HEADERS_ALLOW_LIST = new TreeSet<>(Arrays.asList( + "x-forwarded-for", + "x-real-ip", + "true-client-ip", + "x-client-ip", + "x-forwarded", + "forwarded-for", + "x-cluster-client-ip", + "fastly-client-ip", + "cf-connecting-ip", + "cf-connecting-ipv6", + "forwarded", + "via", + "content-length", + "content-encoding", + "content-language", + "host", + "accept-encoding", + "accept-language")); // response headers when there are security events - public static final Set RESPONSE_HEADERS_ALLOW_LIST = - new TreeSet<>( - Arrays.asList("content-length", "content-type", "content-encoding", "content-language")); + public static final Set RESPONSE_HEADERS_ALLOW_LIST = new TreeSet<>( + Arrays.asList("content-length", "content-type", "content-encoding", "content-language")); // headers related with authorization - public static final Set AUTHORIZATION_HEADERS = - new TreeSet<>( - Arrays.asList( - "authorization", - "proxy-authorization", - "www-authenticate", - "proxy-authenticate", - "authentication-info", - "proxy-authentication-info", - "cookie", - "set-cookie")); + public static final Set AUTHORIZATION_HEADERS = new TreeSet<>(Arrays.asList( + "authorization", + "proxy-authorization", + "www-authenticate", + "proxy-authenticate", + "authentication-info", + "proxy-authentication-info", + "cookie", + "set-cookie")); static { REQUEST_HEADERS_ALLOW_LIST.addAll(DEFAULT_REQUEST_HEADERS_ALLOW_LIST); @@ -835,56 +828,55 @@ public void reportDerivatives(Map data) { if (data == null || data.isEmpty()) return; // Initialize or update derivatives atomically - derivatives.updateAndGet( - current -> { - Map updated = current != null ? new HashMap<>(current) : new HashMap<>(); - - // Process each attribute according to the specification - for (Map.Entry entry : data.entrySet()) { - String attributeKey = entry.getKey(); - Object attributeConfig = entry.getValue(); - - if (attributeConfig instanceof Map) { - @SuppressWarnings("unchecked") - Map config = (Map) attributeConfig; - - // Check if it's a literal value schema - if (config.containsKey("value")) { - Object literalValue = config.get("value"); - if (literalValue != null) { - // Preserve the original type - don't convert to string - updated.put(attributeKey, literalValue); - log.debug( - "Added literal attribute: {} = {} (type: {})", - attributeKey, - literalValue, - literalValue.getClass().getSimpleName()); - } - } - // Check if it's a request data schema - else if (config.containsKey("address")) { - String address = (String) config.get("address"); - @SuppressWarnings("unchecked") - List keyPath = (List) config.get("key_path"); - @SuppressWarnings("unchecked") - List transformers = (List) config.get("transformers"); - - Object extractedValue = extractValueFromRequestData(address, keyPath, transformers); - if (extractedValue != null) { - // For extracted values, convert to string as they come from request data - updated.put(attributeKey, extractedValue.toString()); - log.debug("Added extracted attribute: {} = {}", attributeKey, extractedValue); - } - } - } else { - // Handle plain string/numeric values - updated.put(attributeKey, attributeConfig); - log.debug("Added direct attribute: {} = {}", attributeKey, attributeConfig); + derivatives.updateAndGet(current -> { + Map updated = current != null ? new HashMap<>(current) : new HashMap<>(); + + // Process each attribute according to the specification + for (Map.Entry entry : data.entrySet()) { + String attributeKey = entry.getKey(); + Object attributeConfig = entry.getValue(); + + if (attributeConfig instanceof Map) { + @SuppressWarnings("unchecked") + Map config = (Map) attributeConfig; + + // Check if it's a literal value schema + if (config.containsKey("value")) { + Object literalValue = config.get("value"); + if (literalValue != null) { + // Preserve the original type - don't convert to string + updated.put(attributeKey, literalValue); + log.debug( + "Added literal attribute: {} = {} (type: {})", + attributeKey, + literalValue, + literalValue.getClass().getSimpleName()); + } + } + // Check if it's a request data schema + else if (config.containsKey("address")) { + String address = (String) config.get("address"); + @SuppressWarnings("unchecked") + List keyPath = (List) config.get("key_path"); + @SuppressWarnings("unchecked") + List transformers = (List) config.get("transformers"); + + Object extractedValue = extractValueFromRequestData(address, keyPath, transformers); + if (extractedValue != null) { + // For extracted values, convert to string as they come from request data + updated.put(attributeKey, extractedValue.toString()); + log.debug("Added extracted attribute: {} = {}", attributeKey, extractedValue); } } + } else { + // Handle plain string/numeric values + updated.put(attributeKey, attributeConfig); + log.debug("Added direct attribute: {} = {}", attributeKey, attributeConfig); + } + } - return updated; - }); + return updated; + }); } /** diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java index e02f759e55f..e9b395041c8 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java @@ -264,8 +264,9 @@ private Flow onUser(final RequestContext ctx_, final String user) { if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - DataBundle bundle = - new MapDataBundle.Builder(CAPACITY_0_2).add(KnownAddresses.USER_ID, user).build(); + DataBundle bundle = new MapDataBundle.Builder(CAPACITY_0_2) + .add(KnownAddresses.USER_ID, user) + .build(); try { GatewayContext gwCtx = new GatewayContext(false); return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx); @@ -312,10 +313,8 @@ private Flow onLoginEvent( final String subInfoKey = addresses.stream().map(Address::getKey).collect(Collectors.joining("|")); while (true) { - DataSubscriberInfo subInfo = - loginEventSubInfo.computeIfAbsent( - subInfoKey, - t -> producerService.getDataSubscribers(addresses.toArray(new Address[0]))); + DataSubscriberInfo subInfo = loginEventSubInfo.computeIfAbsent( + subInfoKey, t -> producerService.getDataSubscribers(addresses.toArray(new Address[0]))); if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } @@ -347,8 +346,9 @@ private Flow onRequestSession(final RequestContext ctx_, final String sess if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - DataBundle bundle = - new MapDataBundle.Builder(CAPACITY_0_2).add(KnownAddresses.SESSION_ID, sessionId).build(); + DataBundle bundle = new MapDataBundle.Builder(CAPACITY_0_2) + .add(KnownAddresses.SESSION_ID, sessionId) + .build(); try { GatewayContext gwCtx = new GatewayContext(false); return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx); @@ -372,11 +372,10 @@ private Flow onHttpClientRequest(RequestContext ctx_, HttpClientRequest re return NoopFlow.INSTANCE; } - final MapDataBundle.Builder bundleBuilder = - new MapDataBundle.Builder(CAPACITY_3_4) - .add(KnownAddresses.IO_NET_URL, request.getUrl()) - .add(KnownAddresses.IO_NET_REQUEST_METHOD, request.getMethod()) - .add(KnownAddresses.IO_NET_REQUEST_HEADERS, toLowerCaseHeaders(request.getHeaders())); + final MapDataBundle.Builder bundleBuilder = new MapDataBundle.Builder(CAPACITY_3_4) + .add(KnownAddresses.IO_NET_URL, request.getUrl()) + .add(KnownAddresses.IO_NET_REQUEST_METHOD, request.getMethod()) + .add(KnownAddresses.IO_NET_REQUEST_HEADERS, toLowerCaseHeaders(request.getHeaders())); if (downstreamSampler().isSampled(ctx, request.getRequestId())) { final Object body = parseHttpClientBody(ctx, request); @@ -389,12 +388,11 @@ private Flow onHttpClientRequest(RequestContext ctx_, HttpClientRequest re while (true) { DataSubscriberInfo subInfo = httpClientRequestSubInfo; if (subInfo == null) { - subInfo = - producerService.getDataSubscribers( - KnownAddresses.IO_NET_URL, - KnownAddresses.IO_NET_REQUEST_METHOD, - KnownAddresses.IO_NET_REQUEST_HEADERS, - KnownAddresses.IO_NET_REQUEST_BODY); + subInfo = producerService.getDataSubscribers( + KnownAddresses.IO_NET_URL, + KnownAddresses.IO_NET_REQUEST_METHOD, + KnownAddresses.IO_NET_REQUEST_HEADERS, + KnownAddresses.IO_NET_REQUEST_BODY); httpClientRequestSubInfo = subInfo; } try { @@ -413,10 +411,9 @@ private Flow onHttpClientResponse(RequestContext ctx_, HttpClientResponse return NoopFlow.INSTANCE; } - final MapDataBundle.Builder bundleBuilder = - new MapDataBundle.Builder(CAPACITY_3_4) - .add(KnownAddresses.IO_NET_RESPONSE_STATUS, Integer.toString(response.getStatus())) - .add(KnownAddresses.IO_NET_RESPONSE_HEADERS, toLowerCaseHeaders(response.getHeaders())); + final MapDataBundle.Builder bundleBuilder = new MapDataBundle.Builder(CAPACITY_3_4) + .add(KnownAddresses.IO_NET_RESPONSE_STATUS, Integer.toString(response.getStatus())) + .add(KnownAddresses.IO_NET_RESPONSE_HEADERS, toLowerCaseHeaders(response.getHeaders())); // ignore the response if not sampled if (downstreamSampler().isSampled(ctx, response.getRequestId())) { final Object body = parseHttpClientBody(ctx, response); @@ -430,11 +427,10 @@ private Flow onHttpClientResponse(RequestContext ctx_, HttpClientResponse while (true) { DataSubscriberInfo subInfo = httpClientResponseSubInfo; if (subInfo == null) { - subInfo = - producerService.getDataSubscribers( - KnownAddresses.IO_NET_RESPONSE_STATUS, - KnownAddresses.IO_NET_RESPONSE_HEADERS, - KnownAddresses.IO_NET_RESPONSE_BODY); + subInfo = producerService.getDataSubscribers( + KnownAddresses.IO_NET_RESPONSE_STATUS, + KnownAddresses.IO_NET_RESPONSE_HEADERS, + KnownAddresses.IO_NET_RESPONSE_BODY); httpClientResponseSubInfo = subInfo; } try { @@ -495,8 +491,9 @@ private Flow onExecCmd(RequestContext ctx_, String[] command) { if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - DataBundle bundle = - new MapDataBundle.Builder(CAPACITY_0_2).add(KnownAddresses.EXEC_CMD, command).build(); + DataBundle bundle = new MapDataBundle.Builder(CAPACITY_0_2) + .add(KnownAddresses.EXEC_CMD, command) + .build(); try { GatewayContext gwCtx = new GatewayContext(true, RuleType.COMMAND_INJECTION); return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx); @@ -520,8 +517,9 @@ private Flow onShellCmd(RequestContext ctx_, String command) { if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - DataBundle bundle = - new MapDataBundle.Builder(CAPACITY_0_2).add(KnownAddresses.SHELL_CMD, command).build(); + DataBundle bundle = new MapDataBundle.Builder(CAPACITY_0_2) + .add(KnownAddresses.SHELL_CMD, command) + .build(); try { GatewayContext gwCtx = new GatewayContext(true, RuleType.SHELL_INJECTION); return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx); @@ -545,8 +543,9 @@ private Flow onFileLoaded(RequestContext ctx_, String path) { if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - DataBundle bundle = - new MapDataBundle.Builder(CAPACITY_0_2).add(KnownAddresses.IO_FS_FILE, path).build(); + DataBundle bundle = new MapDataBundle.Builder(CAPACITY_0_2) + .add(KnownAddresses.IO_FS_FILE, path) + .build(); try { GatewayContext gwCtx = new GatewayContext(true, RuleType.LFI); return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx); @@ -564,19 +563,17 @@ private Flow onFileWritten(RequestContext ctx_, String path) { while (true) { DataSubscriberInfo subInfo = ioFileWriteSubInfo; if (subInfo == null) { - subInfo = - producerService.getDataSubscribers( - KnownAddresses.IO_FS_FILE, KnownAddresses.IO_FS_FILE_WRITE); + subInfo = producerService.getDataSubscribers( + KnownAddresses.IO_FS_FILE, KnownAddresses.IO_FS_FILE_WRITE); ioFileWriteSubInfo = subInfo; } if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - DataBundle bundle = - new MapDataBundle.Builder(CAPACITY_0_2) - .add(KnownAddresses.IO_FS_FILE, path) - .add(KnownAddresses.IO_FS_FILE_WRITE, path) - .build(); + DataBundle bundle = new MapDataBundle.Builder(CAPACITY_0_2) + .add(KnownAddresses.IO_FS_FILE, path) + .add(KnownAddresses.IO_FS_FILE_WRITE, path) + .build(); try { GatewayContext gwCtx = new GatewayContext(true, RuleType.LFI); return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx); @@ -651,11 +648,10 @@ private Flow onDatabaseSqlQuery(RequestContext ctx_, String sql) { if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - DataBundle bundle = - new MapDataBundle.Builder(CAPACITY_0_2) - .add(KnownAddresses.DB_TYPE, ctx.getDbType()) - .add(KnownAddresses.DB_SQL_QUERY, sql) - .build(); + DataBundle bundle = new MapDataBundle.Builder(CAPACITY_0_2) + .add(KnownAddresses.DB_TYPE, ctx.getDbType()) + .add(KnownAddresses.DB_SQL_QUERY, sql) + .build(); try { GatewayContext gwCtx = new GatewayContext(true, RuleType.SQL_INJECTION); return producerService.publishDataEvent(subInfo, ctx, bundle, gwCtx); @@ -812,13 +808,9 @@ private Flow onRequestBodyProcessed(RequestContext ctx_, Object obj) { if (subInfo == null || subInfo.isEmpty()) { return NoopFlow.INSTANCE; } - Object converted = - ObjectIntrospection.convert( - obj, - ctx, - () -> { - ctx.setProcessedResponseBodySizeExceeded(true); - }); + Object converted = ObjectIntrospection.convert(obj, ctx, () -> { + ctx.setProcessedResponseBodySizeExceeded(true); + }); ctx.setProcessedRequestBody(converted); DataBundle bundle = new SingletonDataBundle<>(KnownAddresses.REQUEST_BODY_OBJECT, converted); try { @@ -1315,33 +1307,31 @@ private Flow maybePublishRequestData(AppSecRequestContext ctx) { ctx.setReqDataPublished(true); - MapDataBundle bundle = - new MapDataBundle.Builder(CAPACITY_6_10) - .add(KnownAddresses.HEADERS_NO_COOKIES, ctx.getRequestHeaders()) - .add(KnownAddresses.REQUEST_COOKIES, ctx.getCookies()) - .add(KnownAddresses.REQUEST_SCHEME, scheme) - .add(KnownAddresses.REQUEST_METHOD, ctx.getMethod()) - .add(KnownAddresses.REQUEST_URI_RAW, savedRawURI) - .add(KnownAddresses.REQUEST_QUERY, queryParams) - .add(KnownAddresses.REQUEST_CLIENT_IP, ctx.getPeerAddress()) - .add(KnownAddresses.REQUEST_CLIENT_PORT, ctx.getPeerPort()) - .add(KnownAddresses.REQUEST_INFERRED_CLIENT_IP, ctx.getInferredClientIp()) - .build(); + MapDataBundle bundle = new MapDataBundle.Builder(CAPACITY_6_10) + .add(KnownAddresses.HEADERS_NO_COOKIES, ctx.getRequestHeaders()) + .add(KnownAddresses.REQUEST_COOKIES, ctx.getCookies()) + .add(KnownAddresses.REQUEST_SCHEME, scheme) + .add(KnownAddresses.REQUEST_METHOD, ctx.getMethod()) + .add(KnownAddresses.REQUEST_URI_RAW, savedRawURI) + .add(KnownAddresses.REQUEST_QUERY, queryParams) + .add(KnownAddresses.REQUEST_CLIENT_IP, ctx.getPeerAddress()) + .add(KnownAddresses.REQUEST_CLIENT_PORT, ctx.getPeerPort()) + .add(KnownAddresses.REQUEST_INFERRED_CLIENT_IP, ctx.getInferredClientIp()) + .build(); while (true) { DataSubscriberInfo subInfo = this.initialReqDataSubInfo; if (subInfo == null) { - subInfo = - producerService.getDataSubscribers( - KnownAddresses.HEADERS_NO_COOKIES, - KnownAddresses.REQUEST_COOKIES, - KnownAddresses.REQUEST_SCHEME, - KnownAddresses.REQUEST_METHOD, - KnownAddresses.REQUEST_URI_RAW, - KnownAddresses.REQUEST_QUERY, - KnownAddresses.REQUEST_CLIENT_IP, - KnownAddresses.REQUEST_CLIENT_PORT, - KnownAddresses.REQUEST_INFERRED_CLIENT_IP); + subInfo = producerService.getDataSubscribers( + KnownAddresses.HEADERS_NO_COOKIES, + KnownAddresses.REQUEST_COOKIES, + KnownAddresses.REQUEST_SCHEME, + KnownAddresses.REQUEST_METHOD, + KnownAddresses.REQUEST_URI_RAW, + KnownAddresses.REQUEST_QUERY, + KnownAddresses.REQUEST_CLIENT_IP, + KnownAddresses.REQUEST_CLIENT_PORT, + KnownAddresses.REQUEST_INFERRED_CLIENT_IP); initialReqDataSubInfo = subInfo; } @@ -1366,17 +1356,15 @@ private Flow maybePublishResponseData(AppSecRequestContext ctx) { ctx.setRespDataPublished(true); - MapDataBundle bundle = - MapDataBundle.of( - KnownAddresses.RESPONSE_STATUS, String.valueOf(ctx.getResponseStatus()), - KnownAddresses.RESPONSE_HEADERS_NO_COOKIES, ctx.getResponseHeaders()); + MapDataBundle bundle = MapDataBundle.of( + KnownAddresses.RESPONSE_STATUS, String.valueOf(ctx.getResponseStatus()), + KnownAddresses.RESPONSE_HEADERS_NO_COOKIES, ctx.getResponseHeaders()); while (true) { DataSubscriberInfo subInfo = respDataSubInfo; if (subInfo == null) { - subInfo = - producerService.getDataSubscribers( - KnownAddresses.RESPONSE_STATUS, KnownAddresses.RESPONSE_HEADERS_NO_COOKIES); + subInfo = producerService.getDataSubscribers( + KnownAddresses.RESPONSE_STATUS, KnownAddresses.RESPONSE_HEADERS_NO_COOKIES); respDataSubInfo = subInfo; } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/RateLimiter.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/RateLimiter.java index a04b9c162f2..82163ea81b3 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/RateLimiter.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/RateLimiter.java @@ -62,48 +62,41 @@ public boolean isThrottled() { int diff = (curSec24 - storedCurSec24) & TIME_RING_MASK; while (true) { switch (diff) { - case 0: - { - int count = - storedCurCount - + (int) - (storedPrevCount - * (1.0f - (float) (curSec % 1000000000L) / 1000000000.0f)); - if (count >= limitPerSec) { - this.throttledCb.onThrottled(); - return true; - } - newState = storedState + 1; - break; + case 0: { + int count = storedCurCount + + (int) (storedPrevCount * (1.0f - (float) (curSec % 1000000000L) / 1000000000.0f)); + if (count >= limitPerSec) { + this.throttledCb.onThrottled(); + return true; } - case 1: - { - int count = - (int) (storedCurCount * (1.0f - (float) (curSec % 1000000000L) / 1000000000.0f)); - if (count >= limitPerSec) { - // this is very unlikely to happen because the 2nd factor above must be 1 - // (we effectively round down when we cast to int) - this.throttledCb.onThrottled(); - return true; - } - newState = - ((long) curSec24 << SHIFT_CUR_SEC) - | (((long) storedCurCount) << SHIFT_COUNT_PREV_SEC) - | 1L; - break; + newState = storedState + 1; + break; + } + case 1: { + int count = + (int) (storedCurCount * (1.0f - (float) (curSec % 1000000000L) / 1000000000.0f)); + if (count >= limitPerSec) { + // this is very unlikely to happen because the 2nd factor above must be 1 + // (we effectively round down when we cast to int) + this.throttledCb.onThrottled(); + return true; } - case 0xFFFFFF: - { - // we fell 1 second behind the current second (mod 0x1000000) - curSec = this.timeSource.getNanoTicks(); - curSec24 = curSecond24bit(curSec); - diff = (curSec24 - storedCurSec24) & TIME_RING_MASK; - if (diff != 0xFFFFFF) { - continue; // reevaluate switch - } - // else we're still behind, so we likely wrapped around since the last write - // in that case, fall to default case + newState = ((long) curSec24 << SHIFT_CUR_SEC) + | (((long) storedCurCount) << SHIFT_COUNT_PREV_SEC) + | 1L; + break; + } + case 0xFFFFFF: { + // we fell 1 second behind the current second (mod 0x1000000) + curSec = this.timeSource.getNanoTicks(); + curSec24 = curSecond24bit(curSec); + diff = (curSec24 - storedCurSec24) & TIME_RING_MASK; + if (diff != 0xFFFFFF) { + continue; // reevaluate switch } + // else we're still behind, so we likely wrapped around since the last write + // in that case, fall to default case + } default: newState = ((long) curSec24 << SHIFT_CUR_SEC) | 1L; } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEvent.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEvent.java index 51e36d2d191..c1a5e4d845d 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEvent.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEvent.java @@ -84,9 +84,8 @@ public int hashCode() { result = ((result * 31) + ((this.ruleMatches == null) ? 0 : this.ruleMatches.hashCode())); result = ((result * 31) + ((this.spanId == null) ? 0 : this.spanId.hashCode())); result = ((result * 31) + ((this.stackId == null) ? 0 : this.stackId.hashCode())); - result = - ((result * 31) - + ((this.securityResponseId == null) ? 0 : this.securityResponseId.hashCode())); + result = ((result * 31) + + ((this.securityResponseId == null) ? 0 : this.securityResponseId.hashCode())); return result; } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEventWrapper.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEventWrapper.java index a1ed1cb55ae..b52387e0b8f 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEventWrapper.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/report/AppSecEventWrapper.java @@ -10,11 +10,10 @@ public class AppSecEventWrapper { - private static final JsonAdapter ADAPTER = - new Moshi.Builder() - .add(Double.class, new IntegralDoubleJsonAdapter()) - .build() - .adapter(AppSecEventWrapper.class); + private static final JsonAdapter ADAPTER = new Moshi.Builder() + .add(Double.class, new IntegralDoubleJsonAdapter()) + .build() + .adapter(AppSecEventWrapper.class); // Writes whole-number Doubles (e.g. key_path array indices) without a trailing ".0". diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaCveDatabase.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaCveDatabase.java index 2c0446e888d..b14f3d8f7aa 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaCveDatabase.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaCveDatabase.java @@ -159,7 +159,9 @@ private static String readAll(Reader reader) throws IOException { static final class DatabaseJson { int version; - @Nullable List entries; + + @Nullable + List entries; } static final class EntryJson { @@ -167,13 +169,15 @@ static final class EntryJson { @Nullable String vulnId; - @Nullable String artifact; + @Nullable + String artifact; @Json(name = "version_ranges") @Nullable List versionRanges; - @Nullable List symbols; + @Nullable + List symbols; } static final class SymbolJson { @@ -181,6 +185,7 @@ static final class SymbolJson { @Nullable String className; - @Nullable String method; + @Nullable + String method; } } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilitySystem.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilitySystem.java index 28a7fe176e6..eef39de411f 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilitySystem.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilitySystem.java @@ -127,22 +127,21 @@ private static StackTraceElement findCallsiteInStream( String vulnerableClass, Stream stream) { boolean[] pastVulnerableClass = {false}; return stream - .filter( - frame -> { - String cls = frame.getClassName(); - if (!pastVulnerableClass[0]) { - if (cls.equals(vulnerableClass)) { - pastVulnerableClass[0] = true; - } - return false; - } - // Skip remaining frames from the vulnerable class itself - if (cls.equals(vulnerableClass)) { - return false; - } - // Skip intermediate library frames so we report client code, not a wrapper library - return ScaStackExclusionTrie.apply(cls) < 1; - }) + .filter(frame -> { + String cls = frame.getClassName(); + if (!pastVulnerableClass[0]) { + if (cls.equals(vulnerableClass)) { + pastVulnerableClass[0] = true; + } + return false; + } + // Skip remaining frames from the vulnerable class itself + if (cls.equals(vulnerableClass)) { + return false; + } + // Skip intermediate library frames so we report client code, not a wrapper library + return ScaStackExclusionTrie.apply(cls) < 1; + }) .findFirst() .orElse(null); } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilityTransformer.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilityTransformer.java index 397bd9f3027..6d444c2fb0b 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilityTransformer.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/sca/ScaReachabilityTransformer.java @@ -61,7 +61,8 @@ public final class ScaReachabilityTransformer implements ClassFileTransformer { * artifact (e.g. embedded Tomcat) cannot re-queue itself forever and cause unbounded {@link * Instrumentation#retransformClasses} calls. See APPSEC-69734. */ - @VisibleForTesting static final int MAX_UNRESOLVED_RETRIES = 5; + @VisibleForTesting + static final int MAX_UNRESOLVED_RETRIES = 5; private final ScaCveDatabase database; private final Instrumentation instrumentation; @@ -102,7 +103,8 @@ public final class ScaReachabilityTransformer implements ClassFileTransformer { final ConcurrentLinkedQueue>> pendingRetransform = new ConcurrentLinkedQueue<>(); /** Class names (internal format) queued for deferred retransformation by name lookup. */ - @VisibleForTesting final Set pendingRetransformNames = ConcurrentHashMap.newKeySet(); + @VisibleForTesting + final Set pendingRetransformNames = ConcurrentHashMap.newKeySet(); /** * Class name (internal format) → number of retransform attempts already spent on a class whose @@ -131,7 +133,8 @@ public final class ScaReachabilityTransformer implements ClassFileTransformer { * concurrently with itself, and {@code processClass()} is invoked synchronously from within its * {@code retransformClasses()} calls. */ - @VisibleForTesting final Set countedThisHeartbeat = new HashSet<>(); + @VisibleForTesting + final Set countedThisHeartbeat = new HashSet<>(); public ScaReachabilityTransformer(ScaCveDatabase database, Instrumentation instrumentation) { this.database = database; @@ -250,9 +253,8 @@ private byte[] processClass( } methodCallbacks .computeIfAbsent(symbol.method(), k -> new ArrayList<>()) - .add( - new MethodCallbackSpec( - entry.vulnId(), depName, version, dotClassName, symbol.method())); + .add(new MethodCallbackSpec( + entry.vulnId(), depName, version, dotClassName, symbol.method())); } } diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java index 8e2b9577014..8655809b3cb 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/util/AppSecVersion.java @@ -17,10 +17,8 @@ public class AppSecVersion { static { String v; - try (final BufferedReader br = - new BufferedReader( - new InputStreamReader( - AppSecVersion.class.getResourceAsStream("/appsec.version"), UTF_8))) { + try (final BufferedReader br = new BufferedReader( + new InputStreamReader(AppSecVersion.class.getResourceAsStream("/appsec.version"), UTF_8))) { final StringBuilder sb = new StringBuilder(); for (int c = br.read(); c != -1; c = br.read()) { diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleContextClosedRaceTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleContextClosedRaceTest.java index 458781f339c..4f5a957f4f1 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleContextClosedRaceTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/ddwaf/WAFModuleContextClosedRaceTest.java @@ -39,10 +39,9 @@ */ class WAFModuleContextClosedRaceTest { - private static final JsonAdapter> ADAPTER = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + private static final JsonAdapter> ADAPTER = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); private WafBuilder wafBuilder; private WAFModule wafModule; @@ -62,17 +61,16 @@ void setup() throws Exception { wafModule.setWafBuilder(wafBuilder); AppSecModuleConfigurer.SubconfigListener[] captured = new AppSecModuleConfigurer.SubconfigListener[1]; - wafModule.config( - new AppSecModuleConfigurer() { - @Override - public void addSubConfigListener( - String key, AppSecModuleConfigurer.SubconfigListener listener) { - captured[0] = listener; - } - - @Override - public void addTraceSegmentPostProcessor(TraceSegmentPostProcessor interceptor) {} - }); + wafModule.config(new AppSecModuleConfigurer() { + @Override + public void addSubConfigListener( + String key, AppSecModuleConfigurer.SubconfigListener listener) { + captured[0] = listener; + } + + @Override + public void addTraceSegmentPostProcessor(TraceSegmentPostProcessor interceptor) {} + }); captured[0].onNewSubconfig(null, AppSecModuleConfigurer.Reconfiguration.NOOP); dataListener = wafModule.getDataSubscriptions().iterator().next(); } @@ -98,9 +96,8 @@ void skipsAndIncrementsCounterWhenContextClosedConcurrently() { assertFalse(flow.isBlocking()); WafMetricCollector.get().prepareMetrics(); - boolean sawContextClosedRace = - WafMetricCollector.get().drain().stream() - .anyMatch(m -> "waf.context_closed_race".equals(m.metricName)); + boolean sawContextClosedRace = WafMetricCollector.get().drain().stream() + .anyMatch(m -> "waf.context_closed_race".equals(m.metricName)); assertTrue(sawContextClosedRace, "expected waf.context_closed_race to be reported"); } diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/gateway/AppSecRequestContextWafContextRaceTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/gateway/AppSecRequestContextWafContextRaceTest.java index f9c3e78ddf2..a617bc6bacf 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/gateway/AppSecRequestContextWafContextRaceTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/gateway/AppSecRequestContextWafContextRaceTest.java @@ -34,10 +34,9 @@ */ class AppSecRequestContextWafContextRaceTest { - private static final JsonAdapter> ADAPTER = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + private static final JsonAdapter> ADAPTER = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); private WafBuilder wafBuilder; private WafHandle wafHandle; @@ -164,19 +163,15 @@ void concurrentCloseNeverCreatesOrphan() throws Exception { observed.add(original); final CyclicBarrier barrier = new CyclicBarrier(2); - Future closer = - pool.submit( - () -> { - barrier.await(); - ctx.closeWafContext(); - return null; - }); - Future creator = - pool.submit( - () -> { - barrier.await(); - return ctx.getOrCreateWafContext(wafHandle, false, false); - }); + Future closer = pool.submit(() -> { + barrier.await(); + ctx.closeWafContext(); + return null; + }); + Future creator = pool.submit(() -> { + barrier.await(); + return ctx.getOrCreateWafContext(wafHandle, false, false); + }); closer.get(); WafContext late = creator.get(); diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/report/AppSecEventWrapperTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/report/AppSecEventWrapperTest.java index 1eb6f9031d7..2715b0fcbb9 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/report/AppSecEventWrapperTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/report/AppSecEventWrapperTest.java @@ -15,19 +15,17 @@ class AppSecEventWrapperTest { @Test void validateJsonSerializationForAppSecEvent() { - Parameter parameter = - new Parameter( - "parameter_address", - singletonList("parameter_key_path"), - "parameter_value", - singletonList("parameter_highlight")); + Parameter parameter = new Parameter( + "parameter_address", + singletonList("parameter_key_path"), + "parameter_value", + singletonList("parameter_highlight")); RuleMatch ruleMatch = new RuleMatch("rule_match_operator", "rule_match_operator_value", singletonList(parameter)); - AppSecEvent event = - new AppSecEvent.Builder() - .withRule(new Rule("rule_id", "rule_name", singletonMap("tag", "value"))) - .withRuleMatches(singletonList(ruleMatch)) - .build(); + AppSecEvent event = new AppSecEvent.Builder() + .withRule(new Rule("rule_id", "rule_name", singletonMap("tag", "value"))) + .withRuleMatches(singletonList(ruleMatch)) + .build(); String json = new AppSecEventWrapper(singletonList(event)).toString(); @@ -46,11 +44,10 @@ void validateJsonSerializationForNumericKeyPath() { Parameter parameter = new Parameter("server.request.body", Arrays.asList("items", 0.0, "name"), "value", null); RuleMatch ruleMatch = new RuleMatch("operator", "operator_value", singletonList(parameter)); - AppSecEvent event = - new AppSecEvent.Builder() - .withRule(new Rule("rule_id", "rule_name", singletonMap("tag", "value"))) - .withRuleMatches(singletonList(ruleMatch)) - .build(); + AppSecEvent event = new AppSecEvent.Builder() + .withRule(new Rule("rule_id", "rule_name", singletonMap("tag", "value"))) + .withRuleMatches(singletonList(ruleMatch)) + .build(); String json = new AppSecEventWrapper(singletonList(event)).toString(); @@ -64,11 +61,10 @@ void validateJsonSerializationForNonIntegralKeyPath() { Parameter parameter = new Parameter("server.request.body", Arrays.asList("items", 1.5, "name"), "value", null); RuleMatch ruleMatch = new RuleMatch("operator", "operator_value", singletonList(parameter)); - AppSecEvent event = - new AppSecEvent.Builder() - .withRule(new Rule("rule_id", "rule_name", singletonMap("tag", "value"))) - .withRuleMatches(singletonList(ruleMatch)) - .build(); + AppSecEvent event = new AppSecEvent.Builder() + .withRule(new Rule("rule_id", "rule_name", singletonMap("tag", "value"))) + .withRuleMatches(singletonList(ruleMatch)) + .build(); String json = new AppSecEventWrapper(singletonList(event)).toString(); diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaCveDatabaseTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaCveDatabaseTest.java index 5fe9efdbcad..be4d3d8d5c8 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaCveDatabaseTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaCveDatabaseTest.java @@ -14,15 +14,14 @@ class ScaCveDatabaseTest { - private static final String MINIMAL_JSON = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":\"GHSA-test-1234-5678\"," - + "\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 2.0.0\"]," - + "\"symbols\":[" - + "{\"class\":\"com/example/Foo\",\"method\":\"dangerousOp\"}," - + "{\"class\":\"com/example/Bar\",\"method\":\"dangerousOp\"}" - + "]}]}"; + private static final String MINIMAL_JSON = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":\"GHSA-test-1234-5678\"," + + "\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 2.0.0\"]," + + "\"symbols\":[" + + "{\"class\":\"com/example/Foo\",\"method\":\"dangerousOp\"}," + + "{\"class\":\"com/example/Bar\",\"method\":\"dangerousOp\"}" + + "]}]}"; @Test void loadsFromJson() throws Exception { @@ -60,13 +59,12 @@ void emptyEntriesProducesEmptyDatabase() throws Exception { @Test void malformedEntryIsSkipped() throws Exception { - String json = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":null,\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 2.0.0\"],\"symbols\":[{\"class\":\"com/example/Foo\",\"method\":\"op\"}]}," - + "{\"vuln_id\":\"GHSA-good-0000-0000\",\"artifact\":\"com.example:other\"," - + "\"version_ranges\":[\"< 1.0.0\"],\"symbols\":[{\"class\":\"com/example/Good\",\"method\":\"op\"}]}" - + "]}"; + String json = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":null,\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 2.0.0\"],\"symbols\":[{\"class\":\"com/example/Foo\",\"method\":\"op\"}]}," + + "{\"vuln_id\":\"GHSA-good-0000-0000\",\"artifact\":\"com.example:other\"," + + "\"version_ranges\":[\"< 1.0.0\"],\"symbols\":[{\"class\":\"com/example/Good\",\"method\":\"op\"}]}" + + "]}"; ScaCveDatabase db = ScaCveDatabase.parse(new StringReader(json)); @@ -78,12 +76,11 @@ void malformedEntryIsSkipped() throws Exception { void symbolWithNullMethodIsSkipped() throws Exception { // A symbol with method=null is treated as malformed and skipped. // If all symbols in an entry are null-method, the whole entry is dropped. - String json = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":\"GHSA-null-method\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 1.0.0\"]," - + "\"symbols\":[{\"class\":\"com/example/Foo\",\"method\":null}]}" - + "]}"; + String json = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":\"GHSA-null-method\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 1.0.0\"]," + + "\"symbols\":[{\"class\":\"com/example/Foo\",\"method\":null}]}" + + "]}"; ScaCveDatabase db = ScaCveDatabase.parse(new StringReader(json)); assertTrue(db.isEmpty(), "Entry with all null-method symbols must be dropped"); @@ -92,15 +89,14 @@ void symbolWithNullMethodIsSkipped() throws Exception { @Test void symbolWithNullMethodSkippedButValidSymbolsKept() throws Exception { // When an entry has a mix of null-method and valid symbols, only the valid ones are kept. - String json = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":\"GHSA-mixed-method\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 1.0.0\"]," - + "\"symbols\":[" - + "{\"class\":\"com/example/Foo\",\"method\":null}," - + "{\"class\":\"com/example/Foo\",\"method\":\"readValue\"}" - + "]}" - + "]}"; + String json = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":\"GHSA-mixed-method\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 1.0.0\"]," + + "\"symbols\":[" + + "{\"class\":\"com/example/Foo\",\"method\":null}," + + "{\"class\":\"com/example/Foo\",\"method\":\"readValue\"}" + + "]}" + + "]}"; ScaCveDatabase db = ScaCveDatabase.parse(new StringReader(json)); List entries = db.entriesForClass("com/example/Foo"); @@ -112,13 +108,12 @@ void symbolWithNullMethodSkippedButValidSymbolsKept() throws Exception { @Test void multipleEntriesForSameClass() throws Exception { - String json = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":\"GHSA-aaaa-0001-0001\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 2.0.0\"],\"symbols\":[{\"class\":\"com/example/Shared\",\"method\":\"op\"}]}," - + "{\"vuln_id\":\"GHSA-bbbb-0002-0002\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 3.0.0\"],\"symbols\":[{\"class\":\"com/example/Shared\",\"method\":\"op\"}]}" - + "]}"; + String json = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":\"GHSA-aaaa-0001-0001\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 2.0.0\"],\"symbols\":[{\"class\":\"com/example/Shared\",\"method\":\"op\"}]}," + + "{\"vuln_id\":\"GHSA-bbbb-0002-0002\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 3.0.0\"],\"symbols\":[{\"class\":\"com/example/Shared\",\"method\":\"op\"}]}" + + "]}"; ScaCveDatabase db = ScaCveDatabase.parse(new StringReader(json)); @@ -144,7 +139,8 @@ void scaEntryExposesImmutableLists() { List symbols = singletonList(new ScaSymbol("com/example/Foo", "op")); ScaEntry entry = new ScaEntry("GHSA-entry", "com.example:lib", ranges, symbols); - assertThrows(UnsupportedOperationException.class, () -> entry.versionRanges().add("< 3.0.0")); + assertThrows( + UnsupportedOperationException.class, () -> entry.versionRanges().add("< 3.0.0")); assertThrows( UnsupportedOperationException.class, () -> entry.symbols().add(new ScaSymbol("com/example/Bar", "op"))); @@ -155,13 +151,12 @@ void entryWithMultipleSymbolsInSameClassIndexedOnce() throws Exception { // An entry with two symbols for the same class (e.g. Yaml.load + Yaml.loadAll) must appear // only once in the index. Duplicate entries cause the same bytecode callback to be injected // twice into each method, producing redundant bootstrap calls on every invocation. - String json = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":\"GHSA-mjmj-j48q-9wg2\",\"artifact\":\"org.yaml:snakeyaml\"," - + "\"version_ranges\":[\"<= 1.33\"],\"symbols\":[" - + "{\"class\":\"org/yaml/snakeyaml/Yaml\",\"method\":\"load\"}," - + "{\"class\":\"org/yaml/snakeyaml/Yaml\",\"method\":\"loadAll\"}" - + "]}]}"; + String json = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":\"GHSA-mjmj-j48q-9wg2\",\"artifact\":\"org.yaml:snakeyaml\"," + + "\"version_ranges\":[\"<= 1.33\"],\"symbols\":[" + + "{\"class\":\"org/yaml/snakeyaml/Yaml\",\"method\":\"load\"}," + + "{\"class\":\"org/yaml/snakeyaml/Yaml\",\"method\":\"loadAll\"}" + + "]}]}"; ScaCveDatabase db = ScaCveDatabase.parse(new StringReader(json)); diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityMethodLevelTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityMethodLevelTest.java index a708bd49384..8afe6ee1140 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityMethodLevelTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityMethodLevelTest.java @@ -76,10 +76,9 @@ public static String callToString(Object value) { void setUp() throws Exception { ScaReachabilityDependencyRegistry.INSTANCE.resetForTesting(); // Register the same handler as ScaReachabilitySystem.start() does in production - ScaReachabilityCallback.register( - (vulnId, artifact, version, dotClassName, methodName, line) -> - ScaReachabilityDependencyRegistry.INSTANCE.recordHit( - artifact, version, vulnId, dotClassName, methodName, line)); + ScaReachabilityCallback.register((vulnId, artifact, version, dotClassName, methodName, line) -> + ScaReachabilityDependencyRegistry.INSTANCE.recordHit( + artifact, version, vulnId, dotClassName, methodName, line)); db = ScaCveDatabase.parse(new StringReader("{\"version\":1,\"entries\":[]}")); transformer = new ScaReachabilityTransformer(db, null); } @@ -243,25 +242,15 @@ void inject_sameMethodNameInDifferentClassesProduceIndependentHits() throws Exce new HashMap<>(); callbacksClassA.put( "vulnerableMethod", - Collections.singletonList( - spec( - "GHSA-shared", - "com.example:lib", - "1.0.0", - "com.example.ClassA", - "vulnerableMethod"))); + Collections.singletonList(spec( + "GHSA-shared", "com.example:lib", "1.0.0", "com.example.ClassA", "vulnerableMethod"))); Map> callbacksClassB = new HashMap<>(); callbacksClassB.put( "vulnerableMethod", - Collections.singletonList( - spec( - "GHSA-shared", - "com.example:lib", - "1.0.0", - "com.example.ClassB", - "vulnerableMethod"))); + Collections.singletonList(spec( + "GHSA-shared", "com.example:lib", "1.0.0", "com.example.ClassB", "vulnerableMethod"))); byte[] original = bytecodeOf(TargetClass.class); Class clsA = loadModified(ScaMethodCallbackInjector.inject(original, callbacksClassA)); @@ -325,13 +314,12 @@ private void assertCallbackIsFirstInstruction(String methodName) throws Exceptio Map> callbacks = new HashMap<>(); callbacks.put( methodName, - Collections.singletonList( - spec( - "GHSA-first-instruction", - "com.example:lib", - "1.0.0", - UnhandledFirstOpcodeMethods.class.getName(), - methodName))); + Collections.singletonList(spec( + "GHSA-first-instruction", + "com.example:lib", + "1.0.0", + UnhandledFirstOpcodeMethods.class.getName(), + methodName))); byte[] modified = ScaMethodCallbackInjector.inject(original, callbacks); assertEquals( @@ -449,15 +437,9 @@ void inject_preservesBehaviorForAllInstructionKinds() throws Exception { // once the entry callback is spliced in. byte[] original = bytecodeOf(OpcodeCoverageMethods.class); Map> callbacks = new HashMap<>(); - for (String methodName : - new String[] { - "intInsn", - "jumpInsn", - "iincInsn", - "tableSwitchInsn", - "lookupSwitchInsn", - "multiANewArrayInsn" - }) { + for (String methodName : new String[] { + "intInsn", "jumpInsn", "iincInsn", "tableSwitchInsn", "lookupSwitchInsn", "multiANewArrayInsn" + }) { callbacks.put( methodName, Collections.singletonList( @@ -483,24 +465,22 @@ void inject_preservesBehaviorForAllInstructionKinds() throws Exception { @Test void transform_firstLoad_schedulesRetransformAndReturnsNull() throws Exception { - String json = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-cls\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + TargetClass.class.getName().replace('.', '/') - + "\",\"method\":\"vulnerableMethod\"}]" - + "}]}"; + String json = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-cls\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + TargetClass.class.getName().replace('.', '/') + + "\",\"method\":\"vulnerableMethod\"}]" + + "}]}"; ScaCveDatabase classDb = ScaCveDatabase.parse(new StringReader(json)); ScaReachabilityTransformer t = new ScaReachabilityTransformer(classDb, null); - byte[] result = - t.transform( - null, - TargetClass.class.getName().replace('.', '/'), - null, // classBeingRedefined == null → first load path - TargetClass.class.getProtectionDomain(), - bytecodeOf(TargetClass.class)); + byte[] result = t.transform( + null, + TargetClass.class.getName().replace('.', '/'), + null, // classBeingRedefined == null → first load path + TargetClass.class.getProtectionDomain(), + bytecodeOf(TargetClass.class)); assertNull(result, "First load must return null (JAR I/O deferred to periodic task)"); assertFalse( @@ -518,14 +498,13 @@ void transform_retransform_processesInlineAndDoesNotReSchedule() throws Exceptio // is exhausted, which transform_retransform_stopsReQueueingAfterMaxUnresolvedRetries covers. // The invariant asserted here is that the retransform path reaches processClass() rather than // the first-load fast-path. - String json = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-mth\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + TargetClass.class.getName().replace('.', '/') - + "\",\"method\":\"vulnerableMethod\"}]" - + "}]}"; + String json = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-mth\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + TargetClass.class.getName().replace('.', '/') + + "\",\"method\":\"vulnerableMethod\"}]" + + "}]}"; ScaCveDatabase methodDb = ScaCveDatabase.parse(new StringReader(json)); ScaReachabilityTransformer t = new ScaReachabilityTransformer(methodDb, null); @@ -554,14 +533,13 @@ void transform_retransform_stopsReQueueingAfterMaxUnresolvedRetries() throws Exc // pom.properties anywhere in the test classpath, just like an embedded-Tomcat app never // resolving "tomcat"/"tomcat-coyote") must not re-queue itself into pendingRetransformNames // forever — every heartbeat would otherwise cost a stop-the-world retransformClasses() call. - String json = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-cap\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + TargetClass.class.getName().replace('.', '/') - + "\",\"method\":\"vulnerableMethod\"}]" - + "}]}"; + String json = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-cap\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + TargetClass.class.getName().replace('.', '/') + + "\",\"method\":\"vulnerableMethod\"}]" + + "}]}"; ScaCveDatabase methodDb = ScaCveDatabase.parse(new StringReader(json)); ScaReachabilityTransformer t = new ScaReachabilityTransformer(methodDb, null); @@ -597,14 +575,13 @@ void transform_retransform_resolvingBeforeTheCapStillInjectsTheCallback() throws // artifact that stays unresolved for a few heartbeats and then finally resolves (e.g. its JAR // is only scanned successfully on a later pass) must behave exactly as before the cap existed: // the method-level callback is injected on that attempt, and nothing is given up on early. - String json = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-late\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + TargetClass.class.getName().replace('.', '/') - + "\",\"method\":\"vulnerableMethod\"}]" - + "}]}"; + String json = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-late\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + TargetClass.class.getName().replace('.', '/') + + "\",\"method\":\"vulnerableMethod\"}]" + + "}]}"; ScaCveDatabase methodDb = ScaCveDatabase.parse(new StringReader(json)); ScaReachabilityTransformer t = new ScaReachabilityTransformer(methodDb, null); @@ -687,13 +664,12 @@ private static Map> s Map> m = new HashMap<>(); m.put( methodName, - Collections.singletonList( - spec( - "GHSA-method-0001", - "com.example:test-lib", - "1.2.3", - TargetClass.class.getName(), - methodName))); + Collections.singletonList(spec( + "GHSA-method-0001", + "com.example:test-lib", + "1.2.3", + TargetClass.class.getName(), + methodName))); return m; } diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityRetransformTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityRetransformTest.java index 3dabdfebb6f..0fc3aca8c16 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityRetransformTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityRetransformTest.java @@ -138,17 +138,16 @@ void performPendingRetransforms_isolatesHealthyClassFromPermanentlyFailingBatchM Instrumentation instr = mock(Instrumentation.class); when(instr.isModifiableClass(poison)).thenReturn(true); when(instr.isModifiableClass(healthy)).thenReturn(true); - doAnswer( - invocation -> { - // Mockito flattens the varargs invocation, so getArguments() yields the individual - // Class elements rather than the backing array. - for (Object arg : invocation.getArguments()) { - if (arg == poison) { - throw new RuntimeException("retransform failed"); - } - } - return null; - }) + doAnswer(invocation -> { + // Mockito flattens the varargs invocation, so getArguments() yields the individual + // Class elements rather than the backing array. + for (Object arg : invocation.getArguments()) { + if (arg == poison) { + throw new RuntimeException("retransform failed"); + } + } + return null; + }) .when(instr) .retransformClasses(any()); @@ -203,14 +202,13 @@ void performPendingRetransforms_countsOneUnresolvedAttemptPerHeartbeatAcrossClas String internalName = Target.class.getName().replace('.', '/'); // com.example:lib never resolves as a dependency in the test classpath, so processClass() // always takes the hasUnresolvedMethodLevelSymbols branch where the cap logic lives. - String json = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-dedup\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + internalName - + "\",\"method\":\"method\"}]" - + "}]}"; + String json = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-dedup\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + internalName + + "\",\"method\":\"method\"}]" + + "}]}"; ScaCveDatabase db = ScaCveDatabase.parse(new StringReader(json)); Instrumentation instr = mock(Instrumentation.class); @@ -223,19 +221,18 @@ void performPendingRetransforms_countsOneUnresolvedAttemptPerHeartbeatAcrossClas // The mocked Instrumentation does not run the JVM retransform machinery, so it never calls // back into transform(). Do it by hand, once per retransformed Class, exactly as the real // JVM would within a single retransformClasses() call. - doAnswer( - invocation -> { - for (Object arg : invocation.getArguments()) { - Class c = (Class) arg; - t.transform( - null, - c.getName().replace('.', '/'), - c, // classBeingRedefined != null → retransform path → processClass() - c.getProtectionDomain(), - ScaBytecodeTestUtils.bytecodeOf(c)); - } - return null; - }) + doAnswer(invocation -> { + for (Object arg : invocation.getArguments()) { + Class c = (Class) arg; + t.transform( + null, + c.getName().replace('.', '/'), + c, // classBeingRedefined != null → retransform path → processClass() + c.getProtectionDomain(), + ScaBytecodeTestUtils.bytecodeOf(c)); + } + return null; + }) .when(instr) .retransformClasses(any()); diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityTransformerJava9Test.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityTransformerJava9Test.java index 573424432ad..b4457e17163 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityTransformerJava9Test.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaReachabilityTransformerJava9Test.java @@ -57,13 +57,12 @@ public static class SecondTargetClass { public void method() {} } - private static final String JACKSON_JSON = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-test-jackson\"," - + "\"artifact\":\"com.fasterxml.jackson.core:jackson-databind\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"com/fasterxml/jackson/databind/ObjectMapper\",\"method\":\"readValue\"}]" - + "}]}"; + private static final String JACKSON_JSON = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-test-jackson\"," + + "\"artifact\":\"com.fasterxml.jackson.core:jackson-databind\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"com/fasterxml/jackson/databind/ObjectMapper\",\"method\":\"readValue\"}]" + + "}]}"; @AfterEach void resetRegistry() { @@ -215,13 +214,12 @@ void performPendingRetransforms_prewarms_classpathArtifactCache_for_aggregator_a throws Exception { // Entry artifact is jackson-core, but ObjectMapper is in jackson-databind.jar. // matchVersion() returns null on classJarDeps → triggers findArtifactVersionInClasspath(). - String crossJarJson = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-test-cross-jar\"," - + "\"artifact\":\"com.fasterxml.jackson.core:jackson-core\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"com/fasterxml/jackson/databind/ObjectMapper\"," - + "\"method\":\"readValue\"}]}]}"; + String crossJarJson = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-test-cross-jar\"," + + "\"artifact\":\"com.fasterxml.jackson.core:jackson-core\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"com/fasterxml/jackson/databind/ObjectMapper\"," + + "\"method\":\"readValue\"}]}]}"; Instrumentation mockInstr = mock(Instrumentation.class); when(mockInstr.isModifiableClass(any())).thenReturn(true); @@ -248,15 +246,14 @@ void performPendingRetransforms_prewarms_classpathArtifactCache_for_aggregator_a void transform_retransform_injectsCallbacksWhenVersionResolvedFromCache() throws Exception { String internalName = ScaReachabilityMethodLevelTest.TargetClass.class.getName().replace('.', '/'); - String json = - "{\"version\":1,\"entries\":[{" - + "\"vuln_id\":\"GHSA-transform\"," - + "\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + internalName - + "\",\"method\":\"vulnerableMethod\"}]" - + "}]}"; + String json = "{\"version\":1,\"entries\":[{" + + "\"vuln_id\":\"GHSA-transform\"," + + "\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + internalName + + "\",\"method\":\"vulnerableMethod\"}]" + + "}]}"; ScaCveDatabase db = ScaCveDatabase.parse(new StringReader(json)); ScaReachabilityTransformer transformer = new ScaReachabilityTransformer(db, null); transformer.jarCache.put( @@ -267,13 +264,12 @@ void transform_retransform_injectsCallbacksWhenVersionResolvedFromCache() throws .toURI(), singletonList(new Dependency("com.example:lib", "1.2.3", "test.jar", null))); - byte[] transformed = - transformer.transform( - null, - internalName, - ScaReachabilityMethodLevelTest.TargetClass.class, - ScaReachabilityMethodLevelTest.TargetClass.class.getProtectionDomain(), - bytecodeOf(ScaReachabilityMethodLevelTest.TargetClass.class)); + byte[] transformed = transformer.transform( + null, + internalName, + ScaReachabilityMethodLevelTest.TargetClass.class, + ScaReachabilityMethodLevelTest.TargetClass.class.getProtectionDomain(), + bytecodeOf(ScaReachabilityMethodLevelTest.TargetClass.class)); assertNotNull(transformed); assertTrue(transformer.pendingRetransformNames.isEmpty()); @@ -290,24 +286,21 @@ void transform_retransform_injectsCallbacksWhenVersionResolvedFromCache() throws void checkAlreadyLoadedClassesSchedulesOnlyMatchingNonBootstrapClasses() throws Exception { String internalName = ScaReachabilityMethodLevelTest.TargetClass.class.getName().replace('.', '/'); - String json = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":\"GHSA-target\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + internalName - + "\",\"method\":\"vulnerableMethod\"}]}," - + "{\"vuln_id\":\"GHSA-jdk\",\"artifact\":\"com.example:jdk\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"java/lang/String\",\"method\":\"substring\"}]}" - + "]}"; + String json = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":\"GHSA-target\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + internalName + + "\",\"method\":\"vulnerableMethod\"}]}," + + "{\"vuln_id\":\"GHSA-jdk\",\"artifact\":\"com.example:jdk\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"java/lang/String\",\"method\":\"substring\"}]}" + + "]}"; Instrumentation mockInstr = mock(Instrumentation.class); - when(mockInstr.getAllLoadedClasses()) - .thenReturn( - new Class[] { - null, String[].class, String.class, ScaReachabilityMethodLevelTest.TargetClass.class, - }); + when(mockInstr.getAllLoadedClasses()).thenReturn(new Class[] { + null, String[].class, String.class, ScaReachabilityMethodLevelTest.TargetClass.class, + }); ScaReachabilityTransformer transformer = new ScaReachabilityTransformer(ScaCveDatabase.parse(new StringReader(json)), mockInstr); @@ -328,26 +321,23 @@ void checkAlreadyLoadedClasses_queuesAllMatchingClassesAsOneSharedBatch() throws String targetName = ScaReachabilityMethodLevelTest.TargetClass.class.getName().replace('.', '/'); String secondName = SecondTargetClass.class.getName().replace('.', '/'); - String json = - "{\"version\":1,\"entries\":[" - + "{\"vuln_id\":\"GHSA-target\",\"artifact\":\"com.example:lib\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + targetName - + "\",\"method\":\"vulnerableMethod\"}]}," - + "{\"vuln_id\":\"GHSA-second\",\"artifact\":\"com.example:lib2\"," - + "\"version_ranges\":[\"< 999.0.0\"]," - + "\"symbols\":[{\"class\":\"" - + secondName - + "\",\"method\":\"method\"}]}" - + "]}"; + String json = "{\"version\":1,\"entries\":[" + + "{\"vuln_id\":\"GHSA-target\",\"artifact\":\"com.example:lib\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + targetName + + "\",\"method\":\"vulnerableMethod\"}]}," + + "{\"vuln_id\":\"GHSA-second\",\"artifact\":\"com.example:lib2\"," + + "\"version_ranges\":[\"< 999.0.0\"]," + + "\"symbols\":[{\"class\":\"" + + secondName + + "\",\"method\":\"method\"}]}" + + "]}"; Instrumentation mockInstr = mock(Instrumentation.class); - when(mockInstr.getAllLoadedClasses()) - .thenReturn( - new Class[] { - ScaReachabilityMethodLevelTest.TargetClass.class, SecondTargetClass.class, - }); + when(mockInstr.getAllLoadedClasses()).thenReturn(new Class[] { + ScaReachabilityMethodLevelTest.TargetClass.class, SecondTargetClass.class, + }); ScaReachabilityTransformer transformer = new ScaReachabilityTransformer(ScaCveDatabase.parse(new StringReader(json)), mockInstr); @@ -361,9 +351,8 @@ void checkAlreadyLoadedClasses_queuesAllMatchingClassesAsOneSharedBatch() throws @Test void performPendingRetransforms_noopsWithoutInstrumentation() throws Exception { - ScaReachabilityTransformer transformer = - new ScaReachabilityTransformer( - ScaCveDatabase.parse(new StringReader("{\"version\":1,\"entries\":[]}")), null); + ScaReachabilityTransformer transformer = new ScaReachabilityTransformer( + ScaCveDatabase.parse(new StringReader("{\"version\":1,\"entries\":[]}")), null); transformer.pendingRetransform.add( singletonList(ScaReachabilityMethodLevelTest.TargetClass.class)); @@ -412,9 +401,8 @@ void resolveArtifactDep_noPomJar_returnsArtifactIdOnlyName() throws Exception { Dependency noPomDep = new Dependency("jackson-databind", "2.9.0", "jackson-databind-2.9.0.jar", null); - Dependency resolved = - transformer.resolveArtifactDep( - "com.fasterxml.jackson.core:jackson-databind", singletonList(noPomDep)); + Dependency resolved = transformer.resolveArtifactDep( + "com.fasterxml.jackson.core:jackson-databind", singletonList(noPomDep)); assertNotNull(resolved, "should resolve via artifactId-only fallback"); assertEquals( diff --git a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaRealLibraryBytecodeTest.java b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaRealLibraryBytecodeTest.java index 40303c46bf2..51525487a39 100644 --- a/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaRealLibraryBytecodeTest.java +++ b/dd-java-agent/appsec/src/test/java/com/datadog/appsec/sca/ScaRealLibraryBytecodeTest.java @@ -43,10 +43,9 @@ class ScaRealLibraryBytecodeTest { @BeforeEach void setUp() { ScaReachabilityDependencyRegistry.INSTANCE.resetForTesting(); - ScaReachabilityCallback.register( - (vulnId, artifact, version, dotClassName, methodName, line) -> - ScaReachabilityDependencyRegistry.INSTANCE.recordHit( - artifact, version, vulnId, dotClassName, methodName, line)); + ScaReachabilityCallback.register((vulnId, artifact, version, dotClassName, methodName, line) -> + ScaReachabilityDependencyRegistry.INSTANCE.recordHit( + artifact, version, vulnId, dotClassName, methodName, line)); } @AfterEach @@ -66,13 +65,12 @@ void junrar_createDirectory_injectionProducesBytecodeChange() throws Exception { Map> callbacks = new HashMap<>(); callbacks.put( "createDirectory", - Collections.singletonList( - spec( - "GHSA-hf5p-q87m-crj7", - "com.github.junrar:junrar", - "7.5.5", - "com.github.junrar.LocalFolderExtractor", - "createDirectory"))); + Collections.singletonList(spec( + "GHSA-hf5p-q87m-crj7", + "com.github.junrar:junrar", + "7.5.5", + "com.github.junrar.LocalFolderExtractor", + "createDirectory"))); byte[] modified = ScaMethodCallbackInjector.inject(original, callbacks); @@ -89,13 +87,12 @@ void zserio_array_read_injectionProducesBytecodeChange() throws Exception { Map> callbacks = new HashMap<>(); callbacks.put( "read", - Collections.singletonList( - spec( - "GHSA-cwq5-8pvq-j65j", - "io.github.ndsev:zserio-runtime", - "2.16.1", - "zserio.runtime.array.Array", - "read"))); + Collections.singletonList(spec( + "GHSA-cwq5-8pvq-j65j", + "io.github.ndsev:zserio-runtime", + "2.16.1", + "zserio.runtime.array.Array", + "read"))); byte[] modified = ScaMethodCallbackInjector.inject(original, callbacks); @@ -113,13 +110,12 @@ void tomcat_chunkedInputFilter_parseChunkHeader_injectionProducesBytecodeChange( Map> callbacks = new HashMap<>(); callbacks.put( "parseChunkHeader", - Collections.singletonList( - spec( - "GHSA-563x-q5rq-57qp", - "org.apache.tomcat.embed:tomcat-embed-core", - "9.0.115", - "org.apache.coyote.http11.filters.ChunkedInputFilter", - "parseChunkHeader"))); + Collections.singletonList(spec( + "GHSA-563x-q5rq-57qp", + "org.apache.tomcat.embed:tomcat-embed-core", + "9.0.115", + "org.apache.coyote.http11.filters.ChunkedInputFilter", + "parseChunkHeader"))); byte[] modified = ScaMethodCallbackInjector.inject(original, callbacks); @@ -140,13 +136,12 @@ void junrar_createDirectory_callbackFiresWhenMethodCalled() throws Exception { Map> callbacks = new HashMap<>(); callbacks.put( "createDirectory", - Collections.singletonList( - spec( - "GHSA-hf5p-q87m-crj7", - "com.github.junrar:junrar", - "7.5.5", - "com.github.junrar.LocalFolderExtractor", - "createDirectory"))); + Collections.singletonList(spec( + "GHSA-hf5p-q87m-crj7", + "com.github.junrar:junrar", + "7.5.5", + "com.github.junrar.LocalFolderExtractor", + "createDirectory"))); byte[] modified = ScaMethodCallbackInjector.inject(original, callbacks); Class cls = loadModified(modified); diff --git a/dd-java-agent/benchmark-integration/jetty-perftest/src/main/java/datadog/perftest/jetty/JettyPerftest.java b/dd-java-agent/benchmark-integration/jetty-perftest/src/main/java/datadog/perftest/jetty/JettyPerftest.java index 7af06019df8..cabd09d0b95 100644 --- a/dd-java-agent/benchmark-integration/jetty-perftest/src/main/java/datadog/perftest/jetty/JettyPerftest.java +++ b/dd-java-agent/benchmark-integration/jetty-perftest/src/main/java/datadog/perftest/jetty/JettyPerftest.java @@ -24,19 +24,17 @@ public static void main(final String[] args) throws Exception { jettyServer.setHandler(servletContext); jettyServer.start(); - Runtime.getRuntime() - .addShutdownHook( - new Thread() { - @Override - public void run() { - try { - jettyServer.stop(); - jettyServer.destroy(); - } catch (final Exception e) { - throw new IllegalStateException(e); - } - } - }); + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + try { + jettyServer.stop(); + jettyServer.destroy(); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + }); } @WebServlet diff --git a/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java b/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java index 68fc1a1626e..d0ff49954f1 100644 --- a/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java +++ b/dd-java-agent/cws-tls/src/main/java/datadog/cws/tls/ErpcTls.java @@ -66,7 +66,8 @@ static boolean isSupported() { private int getTID() { Integer thread = threadLocal.get(); if (thread == null && this.gettidSyscallId > 0) { - int threadId = CLibrary.Instance.syscall(new NativeLong(this.gettidSyscallId)).intValue(); + int threadId = + CLibrary.Instance.syscall(new NativeLong(this.gettidSyscallId)).intValue(); threadLocal.set(threadId); } return thread; @@ -83,30 +84,27 @@ public ErpcTls(int maxThreads, int refresh) { registerTls(); - final Thread thread = - newAgentThread( - CWS_TLS, - new Runnable() { - @Override - public void run() { - try { - Thread.sleep(refresh); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - return; - } - - while (!Thread.interrupted()) { - try { - registerTls(); - Thread.sleep(refresh); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - break; - } - } - } - }); + final Thread thread = newAgentThread(CWS_TLS, new Runnable() { + @Override + public void run() { + try { + Thread.sleep(refresh); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return; + } + + while (!Thread.interrupted()) { + try { + registerTls(); + Thread.sleep(refresh); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + break; + } + } + } + }); thread.start(); } diff --git a/dd-java-agent/ddprof-lib/src/main/java/datadog/libs/ddprof/DdprofLibraryLoader.java b/dd-java-agent/ddprof-lib/src/main/java/datadog/libs/ddprof/DdprofLibraryLoader.java index b637dc69309..9bb64022f8e 100644 --- a/dd-java-agent/ddprof-lib/src/main/java/datadog/libs/ddprof/DdprofLibraryLoader.java +++ b/dd-java-agent/ddprof-lib/src/main/java/datadog/libs/ddprof/DdprofLibraryLoader.java @@ -129,10 +129,8 @@ private static JavaProfilerHolder initJavaProfiler() { try { ConfigProvider configProvider = ConfigProvider.getInstance(); String scratch = getScratchDir(configProvider); - profiler = - JavaProfiler.getInstance( - configProvider.getString(ProfilingConfig.PROFILING_DATADOG_PROFILER_LIBPATH), - scratch); + profiler = JavaProfiler.getInstance( + configProvider.getString(ProfilingConfig.PROFILING_DATADOG_PROFILER_LIBPATH), scratch); // sanity test - force load Datadog profiler to catch it not being available early profiler.execute("status"); } catch (Throwable t) { diff --git a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/AbstractInstrumentationTest.java b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/AbstractInstrumentationTest.java index e8fe97f00de..d30ec81d78f 100644 --- a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/AbstractInstrumentationTest.java +++ b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/AbstractInstrumentationTest.java @@ -82,12 +82,11 @@ static void initAll() { // Create shared test writer and tracer writer = new ListWriter(); - CoreTracer coreTracer = - CoreTracer.builder() - .writer(writer) - .idGenerationStrategy(IdGenerationStrategy.fromName(testConfig.idGenerationStrategy)) - .strictTraceWrites(testConfig.strictTraceWrites) - .build(); + CoreTracer coreTracer = CoreTracer.builder() + .writer(writer) + .idGenerationStrategy(IdGenerationStrategy.fromName(testConfig.idGenerationStrategy)) + .strictTraceWrites(testConfig.strictTraceWrites) + .build(); TracerInstaller.forceInstallGlobalTracer(coreTracer); tracer = coreTracer; @@ -104,9 +103,8 @@ static void initAll() { .hasNext(), "No instrumentation found"); transformerListener = new ClassFileTransformerListener(); - activeTransformer = - AgentInstaller.installBytebuddyAgent( - INSTRUMENTATION, true, AgentInstaller.getEnabledSystems(), transformerListener); + activeTransformer = AgentInstaller.installBytebuddyAgent( + INSTRUMENTATION, true, AgentInstaller.getEnabledSystems(), transformerListener); // check for instrumentation issues during installation assertTrue(InstrumentationErrors.noErrors(), InstrumentationErrors::describeErrors); @@ -203,8 +201,8 @@ static void blockUntilChildSpansFinished(AgentSpan span, int numberOfSpans) { if (span instanceof DDSpan) { TraceCollector traceCollector = ((DDSpan) span).spanContext().getTraceCollector(); if (!(traceCollector instanceof PendingTrace)) { - throw new IllegalStateException( - "Expected PendingTrace trace collector, got " + traceCollector.getClass().getName()); + throw new IllegalStateException("Expected PendingTrace trace collector, got " + + traceCollector.getClass().getName()); } PendingTrace pendingTrace = (PendingTrace) traceCollector; @@ -212,9 +210,8 @@ static void blockUntilChildSpansFinished(AgentSpan span, int numberOfSpans) { while (pendingTrace.size() < numberOfSpans) { if (System.currentTimeMillis() > deadline) { - throw new RuntimeException( - new TimeoutException( - "Timed out waiting for child spans. Received: " + pendingTrace.size())); + throw new RuntimeException(new TimeoutException( + "Timed out waiting for child spans. Received: " + pendingTrace.size())); } try { Thread.sleep(10); diff --git a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/BootstrapClasspathSetupListener.java b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/BootstrapClasspathSetupListener.java index b0efe12e855..e416f356789 100644 --- a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/BootstrapClasspathSetupListener.java +++ b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/BootstrapClasspathSetupListener.java @@ -147,10 +147,9 @@ && isBootstrapClass(clazz) } } if (!prematureBootstrapClasses.isEmpty()) { - throw new AssertionError( - prematureBootstrapClasses.size() - + " classes were loaded before bootstrap classpath was initialized: " - + prematureBootstrapClasses); + throw new AssertionError(prematureBootstrapClasses.size() + + " classes were loaded before bootstrap classpath was initialized: " + + prematureBootstrapClasses); } try { final File bootstrapJar = createBootstrapJar(); @@ -169,10 +168,9 @@ private static File createBootstrapJar() throws IOException { bootstrapClasses.add(info.getResourceName()); } } - URL jar = - ClasspathUtils.createJarWithClasses( - TestClassShadowingExtension.class.getClassLoader(), - bootstrapClasses.toArray(new String[0])); + URL jar = ClasspathUtils.createJarWithClasses( + TestClassShadowingExtension.class.getClassLoader(), + bootstrapClasses.toArray(new String[0])); return new File(jar.getFile()); } diff --git a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/TestClassShadowingExtension.java b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/TestClassShadowingExtension.java index 30564a0fe08..da936acc549 100644 --- a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/TestClassShadowingExtension.java +++ b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/TestClassShadowingExtension.java @@ -55,10 +55,9 @@ private static void assertNoBootstrapClassesInTestClass(final Class testClass private static void assertNotBootstrapClass(final Class testClass, final Class clazz) { if (BootstrapClasspathSetupListener.isBootstrapClass(clazz)) { - throw new IllegalStateException( - testClass.getName() - + ": Bootstrap classes are not allowed in test class field or method signatures. Offending class: " - + clazz.getName()); + throw new IllegalStateException(testClass.getName() + + ": Bootstrap classes are not allowed in test class field or method signatures. Offending class: " + + clazz.getName()); } } diff --git a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java index f74168dd7f0..dbde5d6200c 100644 --- a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java +++ b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java @@ -414,15 +414,14 @@ private void assertSpanTags(TagMap tags) { } // Assert all tags List uncheckedTagNames = new ArrayList<>(); - tags.forEach( - (key, value) -> { - Matcher matcher = (Matcher) matchers.remove(key); - if (matcher == null) { - uncheckedTagNames.add(key); - } else { - assertValue(matcher, value, "Unexpected " + key + " tag value"); - } - }); + tags.forEach((key, value) -> { + Matcher matcher = (Matcher) matchers.remove(key); + if (matcher == null) { + uncheckedTagNames.add(key); + } else { + assertValue(matcher, value, "Unexpected " + key + " tag value"); + } + }); // Remove matchers that accept missing tags Collection> values = matchers.values(); values.removeIf(matcher -> matcher instanceof Any); diff --git a/dd-java-agent/instrumentation-testing/src/test/java/context/FieldInjectionTestInstrumentation.java b/dd-java-agent/instrumentation-testing/src/test/java/context/FieldInjectionTestInstrumentation.java index 2a8dcb46fe3..504da901fd8 100644 --- a/dd-java-agent/instrumentation-testing/src/test/java/context/FieldInjectionTestInstrumentation.java +++ b/dd-java-agent/instrumentation-testing/src/test/java/context/FieldInjectionTestInstrumentation.java @@ -124,10 +124,9 @@ public static class GetApiUsageAdvice2 { @Advice.OnMethodExit public static void methodExit( @Advice.This final Object thiz, @Advice.Return(readOnly = false) int contextCount) { - final ContextStore contextStore = - InstrumentationContext.get( - "context.FieldInjectionTestInstrumentation$KeyClass", - "context.FieldInjectionTestInstrumentation$Context"); + final ContextStore contextStore = InstrumentationContext.get( + "context.FieldInjectionTestInstrumentation$KeyClass", + "context.FieldInjectionTestInstrumentation$Context"); contextCount = contextStore.get(thiz).count; } } @@ -136,10 +135,9 @@ public static class PutApiUsageAdvice2 { @Advice.OnMethodExit public static void methodExit( @Advice.This final Object thiz, @Advice.Argument(0) final int value) { - final ContextStore contextStore = - InstrumentationContext.get( - "context.FieldInjectionTestInstrumentation$KeyClass", - "context.FieldInjectionTestInstrumentation$Context"); + final ContextStore contextStore = InstrumentationContext.get( + "context.FieldInjectionTestInstrumentation$KeyClass", + "context.FieldInjectionTestInstrumentation$Context"); final Context context = new Context(); context.count = value; contextStore.put(thiz, context); diff --git a/dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTransformer.java b/dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTransformer.java index fa0a1fc50df..1897c117dea 100644 --- a/dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTransformer.java +++ b/dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTransformer.java @@ -41,14 +41,13 @@ public static AgentBuilder instrument(AgentBuilder agentBuilder) { public static void injectInterfaceNamed(String binaryName, ClassLoader classLoader) { MethodHandles.Lookup myLookup = MethodHandles.lookup(); try { - Method m = - ClassLoader.class.getDeclaredMethod( - "defineClass", - String.class, - byte[].class, - Integer.TYPE, - Integer.TYPE, - ProtectionDomain.class); + Method m = ClassLoader.class.getDeclaredMethod( + "defineClass", + String.class, + byte[].class, + Integer.TYPE, + Integer.TYPE, + ProtectionDomain.class); m.setAccessible(true); MethodHandle defineMethod = myLookup.unreflect(m); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java index 4343ae0bd47..8f53027669e 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java @@ -62,9 +62,8 @@ public static Context enter( @Advice.Local("taskScope") ContextScope taskScope) { // do this before checkpointing, as the envelope's task scope may already be active - taskScope = - AdviceUtils.startTaskScope( - InstrumentationContext.get(Envelope.class, State.class), envelope); + taskScope = AdviceUtils.startTaskScope( + InstrumentationContext.get(Envelope.class, State.class), envelope); if (InstrumenterConfig.get().isLegacyContextManagerEnabled()) { // remember the currently active scope so we can roll back to this point diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/lagomTest/java/ServiceTestModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/lagomTest/java/ServiceTestModule.java index ff0af8c1f66..915a09653f0 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/lagomTest/java/ServiceTestModule.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/lagomTest/java/ServiceTestModule.java @@ -56,12 +56,11 @@ public void bindServices(ServiceBinding... serviceBindings) { // Bind the service info for the first one passed in binder .bind(ServiceInfo.class) - .toProvider( - new ServiceInfoProvider( - primaryServiceBinding.serviceInterface(), - Arrays.stream(serviceBindings) - .map(ServiceBinding::serviceInterface) - .toArray(Class[]::new))); + .toProvider(new ServiceInfoProvider( + primaryServiceBinding.serviceInterface(), + Arrays.stream(serviceBindings) + .map(ServiceBinding::serviceInterface) + .toArray(Class[]::new))); // Bind the metrics ServiceBinding metricsServiceBinding = diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java index 91850d3621f..58e032a4ac5 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java @@ -52,35 +52,33 @@ public Future apply(final HttpRequest request) { throw t; } - final Future wrapped = - futureResponse - .recoverWith( - RecoverFromBlockedExceptionPF.INSTANCE_FUTURE, materializer.executionContext()) - .transform( - new AbstractFunction1() { - @Override - public HttpResponse apply(HttpResponse response) { - // handle blocking at the middle/end of the request - HttpResponse newResponse = - BlockingResponseHelper.handleFinishForWaf(span, response); - if (newResponse != response) { - span.getRequestContext().getTraceSegment().effectivelyBlocked(); - response.entity().discardBytes(materializer); - response = newResponse; - } + final Future wrapped = futureResponse + .recoverWith(RecoverFromBlockedExceptionPF.INSTANCE_FUTURE, materializer.executionContext()) + .transform( + new AbstractFunction1() { + @Override + public HttpResponse apply(HttpResponse response) { + // handle blocking at the middle/end of the request + HttpResponse newResponse = + BlockingResponseHelper.handleFinishForWaf(span, response); + if (newResponse != response) { + span.getRequestContext().getTraceSegment().effectivelyBlocked(); + response.entity().discardBytes(materializer); + response = newResponse; + } - DatadogWrapperHelper.finishSpan(context, response); - return response; - } - }, - new AbstractFunction1() { - @Override - public Throwable apply(final Throwable t) { - DatadogWrapperHelper.finishSpan(context, t); - return t; - } - }, - materializer.executionContext()); + DatadogWrapperHelper.finishSpan(context, response); + return response; + } + }, + new AbstractFunction1() { + @Override + public Throwable apply(final Throwable t) { + DatadogWrapperHelper.finishSpan(context, t); + return t; + } + }, + materializer.executionContext()); scope.close(); return wrapped; } diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java index e35593c27e0..5406fe7240e 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java @@ -61,156 +61,147 @@ public GraphStageLogic createLogic(final Attributes inheritedAttributes) throws boolean[] skipNextPull = new boolean[] {false}; // This is where the request comes in from the server and TCP layer - setHandler( - requestInlet, - new AbstractInHandler() { - @Override - public void onPush() throws Exception { - final HttpRequest request = grab(requestInlet); - final ContextScope scope = DatadogWrapperHelper.createSpan(request); - final AgentSpan span = fromContext(scope.context()); - RequestContext requestContext = span.getRequestContext(); - if (requestContext != null) { - HttpResponse response = - BlockingResponseHelper.maybeCreateBlockingResponse(span, request); - if (response != null) { - request.discardEntityBytes(materializer()); - skipNextPull[0] = true; - requestContext.getTraceSegment().effectivelyBlocked(); - emit(responseOutlet, response); - DatadogWrapperHelper.finishSpan(scope.context(), response); - pull(requestInlet); - scope.close(); - return; - } - } - - scopes.add(scope); - push(requestOutlet, request); - // Since we haven't instrumented the akka stream state machine, we can't rely - // on spans and scopes being propagated during the push and pull of the - // element. Instead we let the scope leak intentionally here and clean it - // up when the user response comes back, or in the actor message processing - // instrumentation that drives this state machine. - } - - @Override - public void onUpstreamFinish() throws Exception { - // We will not receive any more requests from the server and TCP layer so stop - // sending them - complete(requestOutlet); - } - - @Override - public void onUpstreamFailure(final Throwable ex) throws Exception { - // We will not receive any more requests from the server and TCP layer so stop - // sending them - fail(requestOutlet, ex); - } - }); - - // This is where demand comes in from the user code - setHandler( - requestOutlet, - new AbstractOutHandler() { - @Override - public void onPull() throws Exception { + setHandler(requestInlet, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + final HttpRequest request = grab(requestInlet); + final ContextScope scope = DatadogWrapperHelper.createSpan(request); + final AgentSpan span = fromContext(scope.context()); + RequestContext requestContext = span.getRequestContext(); + if (requestContext != null) { + HttpResponse response = + BlockingResponseHelper.maybeCreateBlockingResponse(span, request); + if (response != null) { + request.discardEntityBytes(materializer()); + skipNextPull[0] = true; + requestContext.getTraceSegment().effectivelyBlocked(); + emit(responseOutlet, response); + DatadogWrapperHelper.finishSpan(scope.context(), response); pull(requestInlet); + scope.close(); + return; } + } + + scopes.add(scope); + push(requestOutlet, request); + // Since we haven't instrumented the akka stream state machine, we can't rely + // on spans and scopes being propagated during the push and pull of the + // element. Instead we let the scope leak intentionally here and clean it + // up when the user response comes back, or in the actor message processing + // instrumentation that drives this state machine. + } + + @Override + public void onUpstreamFinish() throws Exception { + // We will not receive any more requests from the server and TCP layer so stop + // sending them + complete(requestOutlet); + } + + @Override + public void onUpstreamFailure(final Throwable ex) throws Exception { + // We will not receive any more requests from the server and TCP layer so stop + // sending them + fail(requestOutlet, ex); + } + }); - @Override - public void onDownstreamFinish() throws Exception { - // We can not send out any more requests to the user code so stop receiving them - cancel(requestInlet); - } - }); + // This is where demand comes in from the user code + setHandler(requestOutlet, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + pull(requestInlet); + } + + @Override + public void onDownstreamFinish() throws Exception { + // We can not send out any more requests to the user code so stop receiving them + cancel(requestInlet); + } + }); // This is where the response comes back from the user code - setHandler( - responseInlet, - new AbstractInHandler() { - @Override - public void onPush() throws Exception { - HttpResponse response = grab(responseInlet); - final ContextScope scope = scopes.poll(); - if (scope != null) { - AgentSpan span = fromContext(scope.context()); - HttpResponse newResponse = - BlockingResponseHelper.handleFinishForWaf(span, response); - if (newResponse != response) { - span.getRequestContext().getTraceSegment().effectivelyBlocked(); - response.discardEntityBytes(materializer()); - response = newResponse; - } - DatadogWrapperHelper.finishSpan(scope.context(), response); - // Check if the active span matches the scope from when the request came in, - // and close it. If it's not, then it will be cleaned up actor message - // processing instrumentation that drives this state machine - AgentSpan activeSpan = activeSpan(); - if (activeSpan == span) { - scope.close(); - } - } - push(responseOutlet, response); - } - - @Override - public void onUpstreamFinish() throws Exception { - // We will not receive any more responses from the user code, so clean up any - // remaining spans - ContextScope scope = scopes.poll(); - while (scope != null) { - fromContext(scope.context()).finish(); - scope = scopes.poll(); - } - completeStage(); + setHandler(responseInlet, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + HttpResponse response = grab(responseInlet); + final ContextScope scope = scopes.poll(); + if (scope != null) { + AgentSpan span = fromContext(scope.context()); + HttpResponse newResponse = BlockingResponseHelper.handleFinishForWaf(span, response); + if (newResponse != response) { + span.getRequestContext().getTraceSegment().effectivelyBlocked(); + response.discardEntityBytes(materializer()); + response = newResponse; } - - @Override - public void onUpstreamFailure(final Throwable ex) throws Exception { - ContextScope scope = scopes.poll(); - if (scope != null) { - // Mark the span as failed - AgentSpan span = fromContext(scope.context()); - DatadogWrapperHelper.finishSpan(scope.context(), ex); - } - // We will not receive any more responses from the user code, so clean up any - // remaining spans - scope = scopes.poll(); - while (scope != null) { - fromContext(scope.context()).finish(); - scope = scopes.poll(); - } - fail(responseOutlet, ex); + DatadogWrapperHelper.finishSpan(scope.context(), response); + // Check if the active span matches the scope from when the request came in, + // and close it. If it's not, then it will be cleaned up actor message + // processing instrumentation that drives this state machine + AgentSpan activeSpan = activeSpan(); + if (activeSpan == span) { + scope.close(); } - }); + } + push(responseOutlet, response); + } + + @Override + public void onUpstreamFinish() throws Exception { + // We will not receive any more responses from the user code, so clean up any + // remaining spans + ContextScope scope = scopes.poll(); + while (scope != null) { + fromContext(scope.context()).finish(); + scope = scopes.poll(); + } + completeStage(); + } + + @Override + public void onUpstreamFailure(final Throwable ex) throws Exception { + ContextScope scope = scopes.poll(); + if (scope != null) { + // Mark the span as failed + AgentSpan span = fromContext(scope.context()); + DatadogWrapperHelper.finishSpan(scope.context(), ex); + } + // We will not receive any more responses from the user code, so clean up any + // remaining spans + scope = scopes.poll(); + while (scope != null) { + fromContext(scope.context()).finish(); + scope = scopes.poll(); + } + fail(responseOutlet, ex); + } + }); // This is where demand comes in from the server and TCP layer - setHandler( - responseOutlet, - new AbstractOutHandler() { - @Override - public void onPull() throws Exception { - if (isClosed(responseInlet)) { - fail(responseOutlet, new RuntimeException("Failed earlier")); - } - // condition is needed when we emit() directly to the outlet - // The value was not pushed through the response inlet, so we need not - // request more data through the inlet - if (skipNextPull[0]) { - skipNextPull[0] = false; - } else { - pull(responseInlet); - } - } - - @Override - public void onDownstreamFinish() throws Exception { - // We can not send out any more responses to the server and TCP layer so stop - // receiving them - cancel(responseInlet); - } - }); + setHandler(responseOutlet, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + if (isClosed(responseInlet)) { + fail(responseOutlet, new RuntimeException("Failed earlier")); + } + // condition is needed when we emit() directly to the outlet + // The value was not pushed through the response inlet, so we need not + // request more data through the inlet + if (skipNextPull[0]) { + skipNextPull[0] = false; + } else { + pull(responseInlet); + } + } + + @Override + public void onDownstreamFinish() throws Exception { + // We can not send out any more responses to the server and TCP layer so stop + // receiving them + cancel(responseInlet); + } + }); } }; } diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaBlockResponseFunction.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaBlockResponseFunction.java index 00f20e1639b..421230816c3 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaBlockResponseFunction.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaBlockResponseFunction.java @@ -62,9 +62,8 @@ public boolean tryCommitBlockingResponse( return false; } if (rba == null) { - rba = - new Flow.Action.RequestBlockingAction( - statusCode, templateType, extraHeaders, securityResponseId); + rba = new Flow.Action.RequestBlockingAction( + statusCode, templateType, extraHeaders, securityResponseId); this.traceSegment = segment; } return true; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/BlockingResponseHelper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/BlockingResponseHelper.java index 68d6a9d84c0..77e076fa31a 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/BlockingResponseHelper.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/BlockingResponseHelper.java @@ -35,9 +35,8 @@ public static HttpResponse handleFinishForWaf(final AgentSpan span, final HttpRe return altResponse; } } - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, response, response.status().intValue(), AkkaHttpServerHeaders.responseGetter()); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, response, response.status().intValue(), AkkaHttpServerHeaders.responseGetter()); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; @@ -68,17 +67,15 @@ public static HttpResponse maybeCreateBlockingResponse( int httpCode = BlockingActionHelper.getHttpCode(rba.getStatusCode()); ResponseEntity entity; if (bct != BlockingContentType.NONE) { - BlockingActionHelper.TemplateType tt = - BlockingActionHelper.determineTemplateType(bct, accept.map(h -> h.value()).orElse(null)); + BlockingActionHelper.TemplateType tt = BlockingActionHelper.determineTemplateType( + bct, accept.map(h -> h.value()).orElse(null)); byte[] template = BlockingActionHelper.getTemplate(tt, rba.getSecurityResponseId()); if (tt == BlockingActionHelper.TemplateType.HTML) { - entity = - HttpEntity$.MODULE$.apply( - ContentTypes.text$divhtml$u0028UTF$minus8$u0029(), ByteString.fromArray(template)); + entity = HttpEntity$.MODULE$.apply( + ContentTypes.text$divhtml$u0028UTF$minus8$u0029(), ByteString.fromArray(template)); } else { // json - entity = - HttpEntity$.MODULE$.apply( - ContentTypes.application$divjson(), ByteString.fromArray(template)); + entity = HttpEntity$.MODULE$.apply( + ContentTypes.application$divjson(), ByteString.fromArray(template)); } } else { entity = HttpEntity$.MODULE$.Empty(); @@ -86,10 +83,8 @@ public static HttpResponse maybeCreateBlockingResponse( List headersList = rba.getExtraHeaders().entrySet().stream() - .map( - e -> - (akka.http.scaladsl.model.HttpHeader) - RawHeader.create(e.getKey(), e.getValue())) + .map(e -> + (akka.http.scaladsl.model.HttpHeader) RawHeader.create(e.getKey(), e.getValue())) .collect(ScalaListCollector.toScalaList()); StatusCode code; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java index dcfcfe207cb..e98492bcaa3 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java @@ -72,10 +72,9 @@ public static class MatchesOneHundredContinueStageAnonClass private MatchesOneHundredContinueStageAnonClass() {} - private static final Pattern ANON_CLASS_PATTERN = - Pattern.compile( - "akka\\.http\\.impl\\.engine\\.server\\.HttpServerBluePrint\\$ControllerStage\\$\\$anon\\$" - + "\\d+\\$OneHundredContinueStage\\$\\$anon\\$\\d+"); + private static final Pattern ANON_CLASS_PATTERN = Pattern.compile( + "akka\\.http\\.impl\\.engine\\.server\\.HttpServerBluePrint\\$ControllerStage\\$\\$anon\\$" + + "\\d+\\$OneHundredContinueStage\\$\\$anon\\$\\d+"); @Override public boolean matches(TypeDescription td) { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ScalaListCollector.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ScalaListCollector.java index 6410d125c5d..3fa0cb5a437 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ScalaListCollector.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ScalaListCollector.java @@ -29,28 +29,19 @@ public class ScalaListCollector implements Collector, List - mapf = - t -> { - if (!(t instanceof akka.http.scaladsl.model.Multipart$FormData$Strict)) { - // data not loaded yet... - // it's not practical to wrap the object - // rely on instrumentation on toStrict - return t; - } + mapf = t -> { + if (!(t instanceof akka.http.scaladsl.model.Multipart$FormData$Strict)) { + // data not loaded yet... + // it's not practical to wrap the object + // rely on instrumentation on toStrict + return t; + } - try { - handleMultipartStrictFormData( - (akka.http.scaladsl.model.Multipart$FormData$Strict) t); - } catch (Exception e) { - handleException(e, "Error in handleMultipartStrictFormData"); - } + try { + handleMultipartStrictFormData((akka.http.scaladsl.model.Multipart$FormData$Strict) t); + } catch (Exception e) { + handleException(e, "Error in handleMultipartStrictFormData"); + } - return t; - }; + return t; + }; return original.map(mapf); } @@ -170,18 +168,17 @@ public static Unmarshaller transformMultipartFormDataUnmarshaller(Unmarshaller o JFunction1< akka.http.scaladsl.model.Multipart$FormData$Strict, akka.http.scaladsl.model.Multipart$FormData$Strict> - mapf = - t -> { - try { - AgentSpan span = activeSpan(); - if (span != null && !isStrictFormOngoing(span)) { - handleMultipartStrictFormData(t); - } - } catch (Exception e) { - handleException(e, "Error in transformMultiPartFormDataToStrictFuture"); - } - return t; - }; + mapf = t -> { + try { + AgentSpan span = activeSpan(); + if (span != null && !isStrictFormOngoing(span)) { + handleMultipartStrictFormData(t); + } + } catch (Exception e) { + handleException(e, "Error in transformMultiPartFormDataToStrictFuture"); + } + return t; + }; return future.map(mapf, materializer.executionContext()); } @@ -217,11 +214,10 @@ private static void handleMultipartStrictFormData( filenames.add(filenameOpt.get()); } - boolean needsEntity = - bodyCallback != null - || (filesContent != null - && filenameOpt.isPresent() - && filesContent.size() < MAX_FILES_TO_INSPECT); + boolean needsEntity = bodyCallback != null + || (filesContent != null + && filenameOpt.isPresent() + && filesContent.size() < MAX_FILES_TO_INSPECT); if (!needsEntity) { continue; } @@ -241,11 +237,10 @@ private static void handleMultipartStrictFormData( conv.put(name, curStrings); } - String s = - sentity - .getData() - .decodeString( - Unmarshaller$.MODULE$.bestUnmarshallingCharsetFor(sentity).nioCharset()); + String s = sentity + .getData() + .decodeString( + Unmarshaller$.MODULE$.bestUnmarshallingCharsetFor(sentity).nioCharset()); curStrings.add(s); } @@ -253,9 +248,8 @@ private static void handleMultipartStrictFormData( && filenameOpt.isPresent() && filesContent.size() < MAX_FILES_TO_INSPECT) { byte[] bytes = sentity.getData().take(MAX_CONTENT_BYTES).toArray(); - filesContent.add( - MultipartContentDecoder.decodeBytes( - bytes, bytes.length, entity.getContentType().toString())); + filesContent.add(MultipartContentDecoder.decodeBytes( + bytes, bytes.length, entity.getContentType().toString())); } } @@ -264,11 +258,8 @@ private static void handleMultipartStrictFormData( Flow flow = bodyCallback.apply(reqCtx, conv); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { - pendingBlock = - tryBlock( - reqCtx, - (Flow.Action.RequestBlockingAction) action, - "multipartFormDataUnmarshaller"); + pendingBlock = tryBlock( + reqCtx, (Flow.Action.RequestBlockingAction) action, "multipartFormDataUnmarshaller"); } } @@ -287,11 +278,8 @@ private static void handleMultipartStrictFormData( Flow flow = contentCallback.apply(reqCtx, filesContent); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { - pendingBlock = - tryBlock( - reqCtx, - (Flow.Action.RequestBlockingAction) action, - "multipart file upload content"); + pendingBlock = tryBlock( + reqCtx, (Flow.Action.RequestBlockingAction) action, "multipart file upload content"); } } @@ -304,55 +292,52 @@ public static Unmarshaller transformStringUnmarshaller( Unmarshaller original) { Unmarshaller.EnhancedUnmarshaller enhancedOriginal = new Unmarshaller.EnhancedUnmarshaller<>(original); - JFunction2 f2 = - (entity, str) -> { - try { - AgentSpan agentSpan = activeSpan(); - if (agentSpan == null || isStrictFormOngoing(agentSpan)) { - return str; - } + JFunction2 f2 = (entity, str) -> { + try { + AgentSpan agentSpan = activeSpan(); + if (agentSpan == null || isStrictFormOngoing(agentSpan)) { + return str; + } - ContentType contentType = entity.getContentType(); - MediaType mediaType = contentType.mediaType(); - if (mediaType != MediaTypes.APPLICATION_JSON - && mediaType != MediaTypes.MULTIPART_FORM_DATA - && mediaType != APPLICATION_X_WWW_FORM_URLENCODED) { - handleArbitraryPostData(str, "HttpEntity -> String unmarshaller"); - } - } catch (Exception e) { - handleException(e, "Error in transformStringUnmarshaller"); - } + ContentType contentType = entity.getContentType(); + MediaType mediaType = contentType.mediaType(); + if (mediaType != MediaTypes.APPLICATION_JSON + && mediaType != MediaTypes.MULTIPART_FORM_DATA + && mediaType != APPLICATION_X_WWW_FORM_URLENCODED) { + handleArbitraryPostData(str, "HttpEntity -> String unmarshaller"); + } + } catch (Exception e) { + handleException(e, "Error in transformStringUnmarshaller"); + } - return str; - }; + return str; + }; return enhancedOriginal.mapWithInput(f2); } public static akka.http.javadsl.unmarshalling.Unmarshaller transformJacksonUnmarshaller( akka.http.javadsl.unmarshalling.Unmarshaller original) { - return original.thenApply( - ret -> { - try { - handleArbitraryPostData(ret, "jackson unmarshaller"); - } catch (Exception e) { - handleException(e, "Error in transformJacksonUnmarshaller"); - } - return ret; - }); + return original.thenApply(ret -> { + try { + handleArbitraryPostData(ret, "jackson unmarshaller"); + } catch (Exception e) { + handleException(e, "Error in transformJacksonUnmarshaller"); + } + return ret; + }); } public static Unmarshaller transformArbitrarySprayUnmarshaller(Unmarshaller original) { - JFunction1 f = - ret -> { - Object conv = tryConvertingScalaContainers(ret, MAX_CONVERSION_DEPTH); - try { - handleArbitraryPostData(conv, "spray unmarshaller"); - } catch (Exception e) { - handleException(e, "Error in transformArbitrarySprayUnmarshaller"); - } - return ret; - }; + JFunction1 f = ret -> { + Object conv = tryConvertingScalaContainers(ret, MAX_CONVERSION_DEPTH); + try { + handleArbitraryPostData(conv, "spray unmarshaller"); + } catch (Exception e) { + handleException(e, "Error in transformArbitrarySprayUnmarshaller"); + } + return ret; + }; return original.map(f); } @@ -384,18 +369,17 @@ private static boolean isStrictFormOngoing(AgentSpan agentSpan) { } } - private static JFunction1 STRICT_FORM_DATA_POST_TRANSF = - sf -> { - try { - handleStrictFormData(sf); - } catch (Exception e) { - handleException(e, "Error in transformStrictFromUnmarshaller"); - } - // we do not remove the span from STRICT_FORM_SERIALIZATION_ONGOING, - // as the string unmarshaller can still run afterwards. This way, the - // advice will still be skipped - return sf; - }; + private static JFunction1 STRICT_FORM_DATA_POST_TRANSF = sf -> { + try { + handleStrictFormData(sf); + } catch (Exception e) { + handleException(e, "Error in transformStrictFromUnmarshaller"); + } + // we do not remove the span from STRICT_FORM_SERIALIZATION_ONGOING, + // as the string unmarshaller can still run afterwards. This way, the + // advice will still be skipped + return sf; + }; public static class UnmarkStrictFormOngoingOnUnsupportedException extends JavaPartialFunction { @@ -424,26 +408,23 @@ public StrictForm apply(Throwable x, boolean isCheck) throws Exception { public static Unmarshaller transformStrictFormUnmarshaller( Unmarshaller original) { JFunction1>>> - wrappedBeforeF = - ec -> { - JFunction1>> g = - mat -> { - JFunction1> h = - entity -> { - AgentSpan agentSpan = activeSpan(); - if (agentSpan != null) { - markStrictFormOngoing(agentSpan); - } - - Future resFut = original.apply(entity, ec, mat); - return resFut - .recover(UnmarkStrictFormOngoingOnUnsupportedException.INSTANCE, ec) - .map(STRICT_FORM_DATA_POST_TRANSF, ec); - }; - return h; - }; - return g; + wrappedBeforeF = ec -> { + JFunction1>> g = mat -> { + JFunction1> h = entity -> { + AgentSpan agentSpan = activeSpan(); + if (agentSpan != null) { + markStrictFormOngoing(agentSpan); + } + + Future resFut = original.apply(entity, ec, mat); + return resFut + .recover(UnmarkStrictFormOngoingOnUnsupportedException.INSTANCE, ec) + .map(STRICT_FORM_DATA_POST_TRANSF, ec); }; + return h; + }; + return g; + }; Unmarshaller wrapped = Unmarshaller$.MODULE$.withMaterializer(wrappedBeforeF); @@ -501,16 +482,14 @@ private static void handleStrictFormData(StrictForm sf) { && filenameOpt.isPresent() && filesContent.size() < MAX_FILES_TO_INSPECT) { byte[] bytes = sentity.getData().take(MAX_CONTENT_BYTES).toArray(); - filesContent.add( - MultipartContentDecoder.decodeBytes( - bytes, bytes.length, sentity.contentType().toString())); + filesContent.add(MultipartContentDecoder.decodeBytes( + bytes, bytes.length, sentity.contentType().toString())); } if (bodyCb != null) { - String s = - sentity - .getData() - .decodeString( - Unmarshaller$.MODULE$.bestUnmarshallingCharsetFor(sentity).nioCharset()); + String s = sentity + .getData() + .decodeString( + Unmarshaller$.MODULE$.bestUnmarshallingCharsetFor(sentity).nioCharset()); strings.add(s); } } @@ -549,11 +528,8 @@ private static void handleStrictFormData(StrictForm sf) { Flow flow = contentCb.apply(reqCtx, filesContent); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { - pendingBlock = - tryBlock( - reqCtx, - (Flow.Action.RequestBlockingAction) action, - "multipart file upload content"); + pendingBlock = tryBlock( + reqCtx, (Flow.Action.RequestBlockingAction) action, "multipart file upload content"); } } diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java index 90d2587fd87..b2486bee5b6 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java @@ -72,10 +72,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(takesArguments(2)) .and( takesArgument(0, named("akka.http.scaladsl.server.directives.FormFieldDirectives"))) - .and( - takesArgument( - 1, - named("akka.http.scaladsl.server.directives.FormFieldDirectives$FieldMagnet"))), + .and(takesArgument( + 1, named("akka.http.scaladsl.server.directives.FormFieldDirectives$FieldMagnet"))), FormFieldDirectivesInstrumentation.class.getName() + "$TaintSingleFormFieldDirectiveOldScalaAdvice"); @@ -85,10 +83,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("formField").or(named("formFields"))) .and(returns(Object.class).or(returns(named("akka.http.scaladsl.server.Directive")))) .and(takesArguments(1)) - .and( - takesArgument( - 0, - named("akka.http.scaladsl.server.directives.FormFieldDirectives$FieldMagnet"))), + .and(takesArgument( + 0, named("akka.http.scaladsl.server.directives.FormFieldDirectives$FieldMagnet"))), FormFieldDirectivesInstrumentation.class.getName() + "$TaintSingleFormFieldDirectiveNewScalaAdvice"); } diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java index c76903ed185..68821dc72df 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java @@ -57,9 +57,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("entity")) .and(returns(named("akka.http.scaladsl.server.Directive"))) .and(takesArguments(2)) - .and( - takesArgument( - 0, named("akka.http.scaladsl.server.directives.MarshallingDirectives"))) + .and(takesArgument( + 0, named("akka.http.scaladsl.server.directives.MarshallingDirectives"))) .and(takesArgument(1, named("akka.http.scaladsl.unmarshalling.Unmarshaller"))), MarshallingDirectivesInstrumentation.class.getName() + "$TaintUnmarshallerInputOldScalaAdvice"); diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java index f51328e4312..41eb611d9ac 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java @@ -71,10 +71,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(takesArguments(2)) .and( takesArgument(0, named("akka.http.scaladsl.server.directives.ParameterDirectives"))) - .and( - takesArgument( - 1, - named("akka.http.scaladsl.server.directives.ParameterDirectives$ParamMagnet"))), + .and(takesArgument( + 1, named("akka.http.scaladsl.server.directives.ParameterDirectives$ParamMagnet"))), ParameterDirectivesInstrumentation.class.getName() + "$TaintSingleParameterDirectiveOldScalaAdvice"); @@ -84,10 +82,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("parameter").or(named("parameters"))) .and(returns(Object.class).or(returns(named("akka.http.scaladsl.server.Directive")))) .and(takesArguments(1)) - .and( - takesArgument( - 0, - named("akka.http.scaladsl.server.directives.ParameterDirectives$ParamMagnet"))), + .and(takesArgument( + 0, named("akka.http.scaladsl.server.directives.ParameterDirectives$ParamMagnet"))), ParameterDirectivesInstrumentation.class.getName() + "$TaintSingleParameterDirectiveNewScalaAdvice"); } @@ -134,9 +130,8 @@ static void after( } try { - retval = - ((Directive) retval) - .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); + retval = ((Directive) retval) + .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); } catch (Exception e) { throw new RuntimeException(e); // propagate so it's logged } @@ -154,9 +149,8 @@ static void after( } try { - retval = - ((Directive) retval) - .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); + retval = ((Directive) retval) + .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); } catch (Exception e) { throw new RuntimeException(e); // propagate so it's logged } diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintFutureHelper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintFutureHelper.java index b7153bef168..cbd9fbc2ea2 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintFutureHelper.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintFutureHelper.java @@ -10,14 +10,13 @@ public class TaintFutureHelper { public static Future wrapFuture( Future f, Object input, PropagationModule mod, ExecutionContext ec) { - JFunction1 mapf = - t -> { - IastContext ctx = IastContext.Provider.get(AgentTracer.activeSpan()); - if (ctx != null) { - mod.taintObjectIfTainted(ctx, t, input); - } - return t; - }; + JFunction1 mapf = t -> { + IastContext ctx = IastContext.Provider.get(AgentTracer.activeSpan()); + if (ctx != null) { + mod.taintObjectIfTainted(ctx, t, input); + } + return t; + }; return f.map(mapf, ec); } } diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java index 55ce72a8e26..9b0b479de67 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java @@ -83,9 +83,8 @@ static void after( @ActiveRequestContext RequestContext reqCtx) { try { IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - retval = - retval.tmap( - new TaintParametersFunction(ctx, paramName), Tupler$.MODULE$.forTuple(null)); + retval = retval.tmap( + new TaintParametersFunction(ctx, paramName), Tupler$.MODULE$.forTuple(null)); } catch (Exception e) { throw new RuntimeException(e); // propagate so it's logged } @@ -102,9 +101,8 @@ static void after( @ActiveRequestContext RequestContext reqCtx) { try { IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - retval = - retval.tmap( - new TaintParametersFunction(ctx, paramName), Tupler$.MODULE$.forTuple(null)); + retval = retval.tmap( + new TaintParametersFunction(ctx, paramName), Tupler$.MODULE$.forTuple(null)); } catch (Exception e) { throw new RuntimeException(e); // propagate so it's logged } diff --git a/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java b/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java index 859d45b6ab4..8497cfd818e 100644 --- a/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java +++ b/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java @@ -106,9 +106,8 @@ public static AgentSpan methodEnter( final AgentSpan clientSpan = startSpan(APACHE_HTTPASYNCCLIENT.toString(), HTTP_REQUEST); DECORATE.afterStart(clientSpan); ((DelegatingRequestProducer) requestProducer).setSpan(clientSpan); - futureCallback = - new TraceContinuedFutureCallback<>( - parentContinuation, clientSpan, context, futureCallback); + futureCallback = new TraceContinuedFutureCallback<>( + parentContinuation, clientSpan, context, futureCallback); return clientSpan; } diff --git a/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/HostAndRequestAsHttpUriRequest.java b/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/HostAndRequestAsHttpUriRequest.java index 7bf1f316b60..2a0e7f6fdc8 100644 --- a/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/HostAndRequestAsHttpUriRequest.java +++ b/dd-java-agent/instrumentation/apache-httpclient/apache-httpasyncclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/HostAndRequestAsHttpUriRequest.java @@ -25,10 +25,9 @@ public HostAndRequestAsHttpUriRequest(final HttpHost httpHost, final HttpRequest method = httpRequest.getRequestLine().getMethod(); requestLine = httpRequest.getRequestLine(); protocolVersion = requestLine.getProtocolVersion(); - uri = - legacyTracingEnabled - ? URIUtils.safeParse(requestLine.getUri()) - : URIUtils.safeConcat(httpHost.toURI(), requestLine.getUri()); + uri = legacyTracingEnabled + ? URIUtils.safeParse(requestLine.getUri()) + : URIUtils.safeConcat(httpHost.toURI(), requestLine.getUri()); actualRequest = httpRequest; } diff --git a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java index 4f70c43a034..004022a5cfc 100644 --- a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java +++ b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java @@ -26,21 +26,20 @@ public class ApacheHttpClientInstrumentation extends InstrumenterModule.Tracing implements Instrumenter.CanShortcutTypeMatching, Instrumenter.HasMethodAdvice { - static final String[] MATCHING_TYPES = - new String[] { - "org.apache.http.impl.client.AbstractHttpClient", - "software.amazon.awssdk.http.apache.internal.impl.ApacheSdkHttpClient", - "org.apache.http.impl.client.AutoRetryHttpClient", - "org.apache.http.impl.client.CloseableHttpClient", - "org.apache.http.impl.client.ContentEncodingHttpClient", - "org.apache.http.impl.client.DecompressingHttpClient", - "org.apache.http.impl.client.DefaultHttpClient", - "org.apache.http.impl.client.InternalHttpClient", - "org.apache.http.impl.client.MinimalHttpClient", - "org.apache.http.impl.client.SystemDefaultHttpClient", - "com.netflix.http4.NFHttpClient", - "com.amazonaws.http.apache.client.impl.SdkHttpClient" - }; + static final String[] MATCHING_TYPES = new String[] { + "org.apache.http.impl.client.AbstractHttpClient", + "software.amazon.awssdk.http.apache.internal.impl.ApacheSdkHttpClient", + "org.apache.http.impl.client.AutoRetryHttpClient", + "org.apache.http.impl.client.CloseableHttpClient", + "org.apache.http.impl.client.ContentEncodingHttpClient", + "org.apache.http.impl.client.DecompressingHttpClient", + "org.apache.http.impl.client.DefaultHttpClient", + "org.apache.http.impl.client.InternalHttpClient", + "org.apache.http.impl.client.MinimalHttpClient", + "org.apache.http.impl.client.SystemDefaultHttpClient", + "com.netflix.http4.NFHttpClient", + "com.amazonaws.http.apache.client.impl.SdkHttpClient" + }; public ApacheHttpClientInstrumentation() { super("httpclient", "apache-httpclient", "apache-http-client"); diff --git a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpAsyncClientInstrumentation.java b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpAsyncClientInstrumentation.java index 04ff5993c94..d5329d58d21 100644 --- a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpAsyncClientInstrumentation.java +++ b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpAsyncClientInstrumentation.java @@ -128,9 +128,8 @@ public static AgentScope methodEnter( } ((DelegatingRequestProducer) requestProducer).setSpan(clientSpan); - futureCallback = - new TraceContinuedFutureCallback<>( - parentContinuation, clientSpan, context, futureCallback); + futureCallback = new TraceContinuedFutureCallback<>( + parentContinuation, clientSpan, context, futureCallback); return clientScope; } diff --git a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpClientInstrumentation.java b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpClientInstrumentation.java index d1e1d2752a7..a2d8cfdb350 100644 --- a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpClientInstrumentation.java +++ b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-5.0/src/main/java/datadog/trace/instrumentation/apachehttpclient5/ApacheHttpClientInstrumentation.java @@ -181,9 +181,8 @@ public static AgentScope methodEnter( final AgentScope scope = HelperMethods.doMethodEnter(host, request); // Wrap the handler so we capture the status code if (null != scope && handler instanceof HttpClientResponseHandler) { - handler = - new WrappingStatusSettingResponseHandler( - scope.span(), (HttpClientResponseHandler) handler); + handler = new WrappingStatusSettingResponseHandler( + scope.span(), (HttpClientResponseHandler) handler); } return scope; } catch (BlockingException e) { diff --git a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ArmeriaMessageDeframerInstrumentation.java b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ArmeriaMessageDeframerInstrumentation.java index 189e6aa47b2..070d30ce6ee 100644 --- a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ArmeriaMessageDeframerInstrumentation.java +++ b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ArmeriaMessageDeframerInstrumentation.java @@ -34,17 +34,15 @@ public ElementMatcher hierarchyMatcher() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isConstructor() - .and( - takesArgument( - 0, - named( - "com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageDeframer$Listener"))), + .and(takesArgument( + 0, + named( + "com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageDeframer$Listener"))), getClass().getName() + "$CaptureClientCallArg0"); transformer.applyAdvice( isConstructor() - .and( - takesArgument( - 2, named("com.linecorp.armeria.internal.common.grpc.TransportStatusListener"))), + .and(takesArgument( + 2, named("com.linecorp.armeria.internal.common.grpc.TransportStatusListener"))), getClass().getName() + "$CaptureClientCallArg2"); transformer.applyAdvice( isMethod().and(named("process").or(named("deframe"))), @@ -81,9 +79,9 @@ public static final class ActivateSpan { @SuppressWarnings("rawtypes") @Advice.OnMethodEnter public static AgentScope before(@Advice.This ArmeriaMessageDeframer messageDeframer) { - ClientCall clientCall = - InstrumentationContext.get(ArmeriaMessageDeframer.class, ClientCall.class) - .get(messageDeframer); + ClientCall clientCall = InstrumentationContext.get( + ArmeriaMessageDeframer.class, ClientCall.class) + .get(messageDeframer); if (clientCall != null) { AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(clientCall); diff --git a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ClientCallImplInstrumentation.java b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ClientCallImplInstrumentation.java index 58c84f37af1..44daecbe97e 100644 --- a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ClientCallImplInstrumentation.java +++ b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/ClientCallImplInstrumentation.java @@ -147,7 +147,8 @@ public static void before(@Advice.Argument(1) Metadata headers) { public static final class ActivateSpan { @Advice.OnMethodEnter public static AgentScope before(@Advice.This ClientCall call) { - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); if (null != span) { return activateSpan(span); } @@ -166,7 +167,8 @@ public static final class SendMessage { @Advice.OnMethodEnter public static AgentScope before(@Advice.This ClientCall call) { // could create a message span here for the request - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); if (span != null) { return activateSpan(span); } @@ -185,7 +187,8 @@ public static final class Cancel { @Advice.OnMethodEnter public static void before( @Advice.This ClientCall call, @Advice.Argument(1) Throwable cause) { - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); if (null != span) { if (cause instanceof StatusRuntimeException) { DECORATE.onClose(span, ((StatusRuntimeException) cause).getStatus()); @@ -200,7 +203,8 @@ public static void before( public static final class CloseObserver { @Advice.OnMethodEnter public static AgentScope before(@Advice.This ClientCall call) { - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); if (span != null) { return activateSpan(span); } @@ -226,7 +230,8 @@ public static void closeObserver( public static final class CloseObserverWithCause { @Advice.OnMethodEnter public static AgentScope before(@Advice.This ClientCall call) { - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); if (span != null) { return activateSpan(span); } @@ -260,9 +265,8 @@ public static final class ReceiveMessages { public static AgentScope before() { AgentSpan clientSpan = activeSpan(); if (clientSpan != null && OPERATION_NAME.equals(clientSpan.getOperationName())) { - AgentSpan messageSpan = - startSpan(COMPONENT_NAME.toString(), GRPC_MESSAGE) - .setTag("message.type", clientSpan.getTag("response.type")); + AgentSpan messageSpan = startSpan(COMPONENT_NAME.toString(), GRPC_MESSAGE) + .setTag("message.type", clientSpan.getTag("response.type")); DECORATE.afterStart(messageSpan); return activateSpan(messageSpan); } diff --git a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/GrpcClientDecorator.java b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/GrpcClientDecorator.java index d7a592ee72a..2d74c57ff8a 100644 --- a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/GrpcClientDecorator.java +++ b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/GrpcClientDecorator.java @@ -28,9 +28,8 @@ import java.util.function.Function; public class GrpcClientDecorator extends ClientDecorator { - public static final CharSequence OPERATION_NAME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().client().operationForProtocol("grpc")); + public static final CharSequence OPERATION_NAME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().client().operationForProtocol("grpc")); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("armeria-grpc-client"); public static final CharSequence GRPC_MESSAGE = UTF8BytesString.create("grpc.message"); @@ -43,15 +42,14 @@ private static DataStreamsContext createDsmContext() { private static final Set IGNORED_METHODS = Config.get().getGrpcIgnoredOutboundMethods(); private static final BitSet CLIENT_ERROR_STATUSES = Config.get().getGrpcClientErrorStatuses(); - private static final ClassValue MESSAGE_TYPES = - GenericClassValue.of( - // Uses inner class for predictable name for Instrumenter.Default.helperClassNames() - new Function, UTF8BytesString>() { - @Override - public UTF8BytesString apply(Class input) { - return UTF8BytesString.create(input.getName()); - } - }); + private static final ClassValue MESSAGE_TYPES = GenericClassValue.of( + // Uses inner class for predictable name for Instrumenter.Default.helperClassNames() + new Function, UTF8BytesString>() { + @Override + public UTF8BytesString apply(Class input) { + return UTF8BytesString.create(input.getName()); + } + }); private static final DDCache RPC_SERVICE_CACHE = DDCaches.newFixedSizeCache(64); @@ -94,15 +92,14 @@ public AgentSpan startCall(MethodDescriptor method) { if (IGNORED_METHODS.contains(method.getFullMethodName())) { return AgentTracer.blackholeSpan(); } - AgentSpan span = - startSpan(COMPONENT_NAME.toString(), OPERATION_NAME) - .setTag("request.type", requestMessageType(method)) - .setTag("response.type", responseMessageType(method)) - // method.getServiceName() may not be available on some grpc versions - .setTag( - Tags.RPC_SERVICE, - RPC_SERVICE_CACHE.computeIfAbsent( - method.getFullMethodName(), MethodDescriptor::extractFullServiceName)); + AgentSpan span = startSpan(COMPONENT_NAME.toString(), OPERATION_NAME) + .setTag("request.type", requestMessageType(method)) + .setTag("response.type", responseMessageType(method)) + // method.getServiceName() may not be available on some grpc versions + .setTag( + Tags.RPC_SERVICE, + RPC_SERVICE_CACHE.computeIfAbsent( + method.getFullMethodName(), MethodDescriptor::extractFullServiceName)); span.setResourceName(method.getFullMethodName()); afterStart(span); return span; diff --git a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/GrpcServerDecorator.java b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/GrpcServerDecorator.java index 6c2a85cdff8..0d1fa8d6fe4 100644 --- a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/GrpcServerDecorator.java +++ b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/GrpcServerDecorator.java @@ -27,9 +27,8 @@ public class GrpcServerDecorator extends ServerDecorator { Config.get().isGrpcServerTrimPackageResource(); private static final BitSet SERVER_ERROR_STATUSES = Config.get().getGrpcServerErrorStatuses(); - public static final CharSequence GRPC_SERVER = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().server().operationForProtocol("grpc")); + public static final CharSequence GRPC_SERVER = UTF8BytesString.create( + SpanNaming.instance().namingSchema().server().operationForProtocol("grpc")); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("armeria-grpc-server"); public static final CharSequence GRPC_MESSAGE = UTF8BytesString.create("grpc.message"); @@ -87,9 +86,8 @@ protected void doAfterStart(@Nonnull final AgentSpan span) { public void onCall(final AgentSpan span, ServerCall call) { if (TRIM_RESOURCE_PACKAGE_NAME) { - span.setResourceName( - cachedResourceNames.computeIfAbsent( - call.getMethodDescriptor().getFullMethodName(), NORMALIZE)); + span.setResourceName(cachedResourceNames.computeIfAbsent( + call.getMethodDescriptor().getFullMethodName(), NORMALIZE)); } else { span.setResourceName(call.getMethodDescriptor().getFullMethodName()); } diff --git a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/TracingServerInterceptor.java b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/TracingServerInterceptor.java index 7acce3e37fe..e3f7375e305 100644 --- a/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/TracingServerInterceptor.java +++ b/dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/TracingServerInterceptor.java @@ -149,9 +149,9 @@ public static final class TracingServerCallListener @Override public void onMessage(final ReqT message) { - final AgentSpan msgSpan = - startSpan(DECORATE.instrumentationNames()[0], GRPC_MESSAGE, this.span.spanContext()) - .setTag("message.type", message.getClass().getName()); + final AgentSpan msgSpan = startSpan( + DECORATE.instrumentationNames()[0], GRPC_MESSAGE, this.span.spanContext()) + .setTag("message.type", message.getClass().getName()); DECORATE.afterStart(msgSpan); try (ContextScope scope = activateSpan(msgSpan)) { callIGCallbackGrpcMessage(msgSpan, message); diff --git a/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/src/main/java/datadog/trace/instrumentation/armeria/jetty/ArmeriaJettyInstrumentation.java b/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/src/main/java/datadog/trace/instrumentation/armeria/jetty/ArmeriaJettyInstrumentation.java index 89f85cdfdf3..6c3e1f9c203 100644 --- a/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/src/main/java/datadog/trace/instrumentation/armeria/jetty/ArmeriaJettyInstrumentation.java +++ b/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/src/main/java/datadog/trace/instrumentation/armeria/jetty/ArmeriaJettyInstrumentation.java @@ -37,11 +37,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("serve")) - .and( - returns(named("com.linecorp.armeria.common.HttpResponse")) - .and( - takesArgument( - 0, named("com.linecorp.armeria.server.ServiceRequestContext")))), + .and(returns(named("com.linecorp.armeria.common.HttpResponse")) + .and(takesArgument(0, named("com.linecorp.armeria.server.ServiceRequestContext")))), getClass().getName() + "$JettySpanCloserAdvice"); } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-dynamodb-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/dynamodb/DynamoDbInterceptor.java b/dd-java-agent/instrumentation/aws-java/aws-java-dynamodb-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/dynamodb/DynamoDbInterceptor.java index a192f3d38a1..4abb6ecda15 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-dynamodb-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/dynamodb/DynamoDbInterceptor.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-dynamodb-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/dynamodb/DynamoDbInterceptor.java @@ -21,9 +21,9 @@ public class DynamoDbInterceptor implements ExecutionInterceptor { private static final Logger log = LoggerFactory.getLogger(DynamoDbInterceptor.class); - public static final ExecutionAttribute CONTEXT_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); + public static final ExecutionAttribute CONTEXT_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); private static final boolean CAN_ADD_SPAN_POINTERS = Config.get().isAddSpanPointers("aws"); diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptor.java b/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptor.java index 3672b49b88d..7e4cc7ab809 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptor.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptor.java @@ -28,9 +28,9 @@ public class EventBridgeInterceptor implements ExecutionInterceptor { private static final String DEFAULT_EVENT_BUS_NAME = "default"; private static final String EVENT_BUS_ARN_PREFIX = "event-bus/"; - public static final ExecutionAttribute CONTEXT_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); + public static final ExecutionAttribute CONTEXT_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); private static final String START_TIME_KEY = "x-datadog-start-time"; private static final String RESOURCE_NAME_KEY = "x-datadog-resource-name"; @@ -43,7 +43,8 @@ public SdkRequest modifyRequest(ModifyRequest context, ExecutionAttributes execu } PutEventsRequest request = (PutEventsRequest) context.request(); - List modifiedEntries = new ArrayList<>(request.entries().size()); + List modifiedEntries = + new ArrayList<>(request.entries().size()); long startTime = System.currentTimeMillis(); for (PutEventsRequestEntry entry : request.entries()) { @@ -58,9 +59,8 @@ public SdkRequest modifyRequest(ModifyRequest context, ExecutionAttributes execu continue; } - String traceContext = - getTraceContextToInject( - executionAttributes, entry.eventBusName(), entry.detailType(), startTime); + String traceContext = getTraceContextToInject( + executionAttributes, entry.eventBusName(), entry.detailType(), startTime); detailBuilder.setLength(detailBuilder.length() - 1); // Remove the last bracket if (detailBuilder.length() > 1) { detailBuilder.append(", "); // Only add a comma if detail is not empty. @@ -74,7 +74,8 @@ public SdkRequest modifyRequest(ModifyRequest context, ExecutionAttributes execu .append('}'); String modifiedDetail = detailBuilder.toString(); - PutEventsRequestEntry modifiedEntry = entry.toBuilder().detail(modifiedDetail).build(); + PutEventsRequestEntry modifiedEntry = + entry.toBuilder().detail(modifiedDetail).build(); modifiedEntries.add(modifiedEntry); } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptorTest.java b/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptorTest.java index b30ccec011a..ef43c5491b9 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptorTest.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-eventbridge-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/eventbridge/EventBridgeInterceptorTest.java @@ -10,9 +10,8 @@ class EventBridgeInterceptorTest { @Test void buildsDataStreamsTagsFromArnAndDetailType() { - DataStreamsTags tags = - EventBridgeInterceptor.buildDataStreamsTags( - "arn:aws:events:us-east-1:123456789012:event-bus/test-bus", "order.created"); + DataStreamsTags tags = EventBridgeInterceptor.buildDataStreamsTags( + "arn:aws:events:us-east-1:123456789012:event-bus/test-bus", "order.created"); assertEquals(DataStreamsTags.DIRECTION_TAG + ":out", tags.getDirection()); assertEquals(DataStreamsTags.EXCHANGE_TAG + ":test-bus", tags.getExchange()); @@ -22,10 +21,9 @@ void buildsDataStreamsTagsFromArnAndDetailType() { @Test void keepsPartnerBusPathWhenNormalizingArn() { - DataStreamsTags tags = - EventBridgeInterceptor.buildDataStreamsTags( - "arn:aws:events:us-east-1:123456789012:event-bus/aws.partner/example.com/acct/bus-name", - "detail-type"); + DataStreamsTags tags = EventBridgeInterceptor.buildDataStreamsTags( + "arn:aws:events:us-east-1:123456789012:event-bus/aws.partner/example.com/acct/bus-name", + "detail-type"); assertEquals( DataStreamsTags.EXCHANGE_TAG + ":aws.partner/example.com/acct/bus-name", diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java index cb8d369d51e..45b1f3ddd9a 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java @@ -49,9 +49,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { - return implementsInterface( - named(hierarchyMarkerType()) - .or(named("com.amazonaws.services.lambda.runtime.RequestHandler"))); + return implementsInterface(named(hierarchyMarkerType()) + .or(named("com.amazonaws.services.lambda.runtime.RequestHandler"))); } @Override diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreaming.java b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreaming.java index 46e27447224..f5df6322529 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreaming.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreaming.java @@ -12,9 +12,8 @@ public class HandlerStreaming implements RequestStreamHandler { @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { - PrintWriter writer = - new PrintWriter( - new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))); + PrintWriter writer = new PrintWriter( + new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))); writer.write("Hello World!"); writer.close(); } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWith404Response.java b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWith404Response.java index 540b245e802..186ab24d318 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWith404Response.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWith404Response.java @@ -12,13 +12,11 @@ public class HandlerStreamingWith404Response implements RequestStreamHandler { @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { - PrintWriter writer = - new PrintWriter( - new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))); - writer.write( - "{\"statusCode\": 404, " - + "\"headers\": {\"content-type\": \"text/html\"}, " - + "\"body\": \"Not Found\"}"); + PrintWriter writer = new PrintWriter( + new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))); + writer.write("{\"statusCode\": 404, " + + "\"headers\": {\"content-type\": \"text/html\"}, " + + "\"body\": \"Not Found\"}"); writer.close(); } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWithApiGwResponse.java b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWithApiGwResponse.java index 7b91f1f3510..0b235226370 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWithApiGwResponse.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWithApiGwResponse.java @@ -12,13 +12,11 @@ public class HandlerStreamingWithApiGwResponse implements RequestStreamHandler { @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { - PrintWriter writer = - new PrintWriter( - new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))); - writer.write( - "{\"statusCode\": 200, " - + "\"headers\": {\"content-type\": \"application/json\", \"x-custom\": \"custom-val\"}, " - + "\"body\": \"{\\\"result\\\": \\\"ok\\\"}\"}"); + PrintWriter writer = new PrintWriter( + new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))); + writer.write("{\"statusCode\": 200, " + + "\"headers\": {\"content-type\": \"application/json\", \"x-custom\": \"custom-val\"}, " + + "\"body\": \"{\\\"result\\\": \\\"ok\\\"}\"}"); writer.close(); } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/LambdaHandlerInstrumentationTest.java b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/LambdaHandlerInstrumentationTest.java index 614aa40c0ff..c34a3272f92 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/LambdaHandlerInstrumentationTest.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/LambdaHandlerInstrumentationTest.java @@ -87,68 +87,50 @@ void setUpAppSec() { capturedResponseBody = null; responseHeaderDoneCalled = false; - ss.registerCallback( - EVENTS.requestStarted(), - (Supplier>) - () -> { - appSecStarted = true; - return new Flow.ResultFlow<>(new Object()); - }); + ss.registerCallback(EVENTS.requestStarted(), (Supplier>) () -> { + appSecStarted = true; + return new Flow.ResultFlow<>(new Object()); + }); ss.registerCallback( EVENTS.requestMethodUriRaw(), - (TriFunction>) - (ctx2, method2, uri) -> { - capturedMethod = method2; - capturedPath = uri.path(); - return Flow.ResultFlow.empty(); - }); - ss.registerCallback( - EVENTS.requestHeader(), - (TriConsumer) - (ctx2, name, value) -> capturedHeaders.put(name, value)); - ss.registerCallback( - EVENTS.requestHeaderDone(), - (Function>) ctx2 -> Flow.ResultFlow.empty()); + (TriFunction>) (ctx2, method2, uri) -> { + capturedMethod = method2; + capturedPath = uri.path(); + return Flow.ResultFlow.empty(); + }); + ss.registerCallback(EVENTS.requestHeader(), (TriConsumer) + (ctx2, name, value) -> capturedHeaders.put(name, value)); + ss.registerCallback(EVENTS.requestHeaderDone(), (Function>) + ctx2 -> Flow.ResultFlow.empty()); ss.registerCallback( EVENTS.requestBodyProcessed(), - (BiFunction>) - (ctx2, body) -> { - capturedBody = body; - return Flow.ResultFlow.empty(); - }); - ss.registerCallback( - EVENTS.requestEnded(), - (BiFunction>) - (ctx2, spanInfo) -> { - appSecEnded = true; - return Flow.ResultFlow.empty(); - }); - + (BiFunction>) (ctx2, body) -> { + capturedBody = body; + return Flow.ResultFlow.empty(); + }); + ss.registerCallback(EVENTS.requestEnded(), (BiFunction>) + (ctx2, spanInfo) -> { + appSecEnded = true; + return Flow.ResultFlow.empty(); + }); + + ss.registerCallback(EVENTS.responseStarted(), (BiFunction>) + (ctx2, status) -> { + capturedResponseStatus = status; + return Flow.ResultFlow.empty(); + }); + ss.registerCallback(EVENTS.responseHeader(), (TriConsumer) + (ctx2, name, value) -> capturedResponseHeaders.put(name, value)); ss.registerCallback( - EVENTS.responseStarted(), - (BiFunction>) - (ctx2, status) -> { - capturedResponseStatus = status; - return Flow.ResultFlow.empty(); - }); + EVENTS.responseHeaderDone(), (Function>) ctx2 -> { + responseHeaderDoneCalled = true; + return Flow.ResultFlow.empty(); + }); ss.registerCallback( - EVENTS.responseHeader(), - (TriConsumer) - (ctx2, name, value) -> capturedResponseHeaders.put(name, value)); - ss.registerCallback( - EVENTS.responseHeaderDone(), - (Function>) - ctx2 -> { - responseHeaderDoneCalled = true; - return Flow.ResultFlow.empty(); - }); - ss.registerCallback( - EVENTS.responseBody(), - (BiFunction>) - (ctx2, body) -> { - capturedResponseBody = body; - return Flow.ResultFlow.empty(); - }); + EVENTS.responseBody(), (BiFunction>) (ctx2, body) -> { + capturedResponseBody = body; + return Flow.ResultFlow.empty(); + }); } @AfterEach @@ -176,12 +158,10 @@ void serverlessInvocationSpanResourceResetAfterHttpFrameworkOverwrite() throws I ByteArrayOutputStream output = new ByteArrayOutputStream(); new HandlerStreamingSimulatesHttpFrameworkResource().handleRequest(input, output, newContext()); - assertTraces( - trace( - span() - .resourceName(name -> operation().equals(name.toString())) - .type(DDSpanTypes.SERVERLESS) - .error(false))); + assertTraces(trace(span() + .resourceName(name -> operation().equals(name.toString())) + .type(DDSpanTypes.SERVERLESS) + .error(false))); } @Test @@ -193,31 +173,25 @@ void testStreamingHandlerWithError() { Error.class, () -> new HandlerStreamingWithError().handleRequest(input, output, newContext())); - assertTraces( - trace( - span() - .type(DDSpanTypes.SERVERLESS) - .error(true) - .tags( - defaultTags(), - tag("request_id", is(REQUEST_ID)), - error(Error.class, "Some error")))); + assertTraces(trace(span() + .type(DDSpanTypes.SERVERLESS) + .error(true) + .tags(defaultTags(), tag("request_id", is(REQUEST_ID)), error(Error.class, "Some error")))); } @Test void appSecCallbacksAreInvokedForApiGatewayV1Event() throws IOException { - String eventJson = - "{" - + "\"path\": \"/api/users/123\"," - + "\"headers\": {\"content-type\": \"application/json\"," - + " \"x-forwarded-for\": \"203.0.113.1\"}," - + "\"body\": \"{\\\"key\\\": \\\"value\\\"}\"," - + "\"requestContext\": {" - + " \"httpMethod\": \"GET\"," - + " \"requestId\": \"req-abc\"," - + " \"identity\": {\"sourceIp\": \"203.0.113.1\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/users/123\"," + + "\"headers\": {\"content-type\": \"application/json\"," + + " \"x-forwarded-for\": \"203.0.113.1\"}," + + "\"body\": \"{\\\"key\\\": \\\"value\\\"}\"," + + "\"requestContext\": {" + + " \"httpMethod\": \"GET\"," + + " \"requestId\": \"req-abc\"," + + " \"identity\": {\"sourceIp\": \"203.0.113.1\"}" + + "}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); @@ -235,22 +209,21 @@ void appSecCallbacksAreInvokedForApiGatewayV1Event() throws IOException { @Test void appSecCallbacksAreInvokedForApiGatewayV2HttpEvent() throws IOException { - String eventJson = - "{" - + "\"version\": \"2.0\"," - + "\"headers\": {\"content-type\": \"application/json\"," - + " \"accept\": \"application/json\"}," - + "\"cookies\": [\"session=abc123\"]," - + "\"body\": \"{\\\"key\\\": \\\"value\\\"}\"," - + "\"requestContext\": {" - + " \"http\": {" - + " \"method\": \"POST\"," - + " \"path\": \"/api/items\"," - + " \"sourceIp\": \"198.51.100.1\"" - + " }," - + " \"domainName\": \"api.example.com\"" - + "}" - + "}"; + String eventJson = "{" + + "\"version\": \"2.0\"," + + "\"headers\": {\"content-type\": \"application/json\"," + + " \"accept\": \"application/json\"}," + + "\"cookies\": [\"session=abc123\"]," + + "\"body\": \"{\\\"key\\\": \\\"value\\\"}\"," + + "\"requestContext\": {" + + " \"http\": {" + + " \"method\": \"POST\"," + + " \"path\": \"/api/items\"," + + " \"sourceIp\": \"198.51.100.1\"" + + " }," + + " \"domainName\": \"api.example.com\"" + + "}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); @@ -271,11 +244,10 @@ void appSecCallbacksAreInvokedForApiGatewayV2HttpEvent() throws IOException { void appSecCallbacksAreNotInvokedWhenAppSecIsDisabled() throws IOException { ActiveSubsystems.APPSEC_ACTIVE = false; - String eventJson = - "{" - + "\"path\": \"/api/test\"," - + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-xyz\"}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/test\"," + + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-xyz\"}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); ByteArrayOutputStream output = new ByteArrayOutputStream(); @@ -305,28 +277,25 @@ void appSecIsSkippedAndReportedUnsupportedForNonHttpEvent() throws IOException { assertFalse(appSecEnded); assertNull(capturedResponseStatus); // Tag matching is exhaustive, so this also asserts the span carries no http.* tag - assertTraces( - trace( - span() - .type(DDSpanTypes.SERVERLESS) - .error(false) - .tags( - defaultTags(), - tag("request_id", is(REQUEST_ID)), - tag("_dd.appsec.unsupported_event_type", is(1))))); + assertTraces(trace(span() + .type(DDSpanTypes.SERVERLESS) + .error(false) + .tags( + defaultTags(), + tag("request_id", is(REQUEST_ID)), + tag("_dd.appsec.unsupported_event_type", is(1))))); } @Test void responseCallbacksAreInvokedForJsonEncodedResponse() throws IOException { - String eventJson = - "{" - + "\"path\": \"/api/test\"," - + "\"headers\": {\"content-type\": \"application/json\"}," - + "\"requestContext\": {" - + " \"httpMethod\": \"GET\"," - + " \"identity\": {\"sourceIp\": \"127.0.0.1\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/test\"," + + "\"headers\": {\"content-type\": \"application/json\"}," + + "\"requestContext\": {" + + " \"httpMethod\": \"GET\"," + + " \"identity\": {\"sourceIp\": \"127.0.0.1\"}" + + "}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); @@ -345,13 +314,8 @@ void responseCallbacksAreInvokedForJsonEncodedResponse() throws IOException { @Test void responseCallbacksReceiveCorrectDataFor404Response() throws IOException { - String eventJson = - "{" - + "\"path\": \"/missing\"," - + "\"requestContext\": {" - + " \"httpMethod\": \"GET\"" - + "}" - + "}"; + String eventJson = "{" + "\"path\": \"/missing\"," + "\"requestContext\": {" + + " \"httpMethod\": \"GET\"" + "}" + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); @@ -370,20 +334,19 @@ void responseCallbacksApplyFallbackForLambdaUrlWithNonApiGatewayResponse() throw // A Lambda Function URL handler returning plain JSON (no statusCode/headers/body structure) // should trigger the fallback: no responseStarted (status unknown), content-type: // application/json, full JSON as body. - String eventJson = - "{" - + "\"version\": \"2.0\"," - + "\"rawPath\": \"/\"," - + "\"headers\": {\"host\": \"example.lambda-url.us-east-1.on.aws\"}," - + "\"requestContext\": {" - + " \"domainName\": \"example.lambda-url.us-east-1.on.aws\"," - + " \"http\": {" - + " \"method\": \"GET\"," - + " \"path\": \"/\"," - + " \"sourceIp\": \"1.2.3.4\"" - + " }" - + "}" - + "}"; + String eventJson = "{" + + "\"version\": \"2.0\"," + + "\"rawPath\": \"/\"," + + "\"headers\": {\"host\": \"example.lambda-url.us-east-1.on.aws\"}," + + "\"requestContext\": {" + + " \"domainName\": \"example.lambda-url.us-east-1.on.aws\"," + + " \"http\": {" + + " \"method\": \"GET\"," + + " \"path\": \"/\"," + + " \"sourceIp\": \"1.2.3.4\"" + + " }" + + "}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); ByteArrayOutputStream output = new ByteArrayOutputStream(); @@ -417,17 +380,16 @@ void responseCallbacksSkipNonApiGatewayResponseForNonHttpEvent() throws IOExcept @Test void responseAndRequestCallbacksAreBothInvoked() throws IOException { - String eventJson = - "{" - + "\"path\": \"/api/users/123\"," - + "\"headers\": {\"content-type\": \"application/json\"}," - + "\"body\": \"{\\\"key\\\": \\\"value\\\"}\"," - + "\"requestContext\": {" - + " \"httpMethod\": \"POST\"," - + " \"requestId\": \"req-order-1\"," - + " \"identity\": {\"sourceIp\": \"10.0.0.1\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/users/123\"," + + "\"headers\": {\"content-type\": \"application/json\"}," + + "\"body\": \"{\\\"key\\\": \\\"value\\\"}\"," + + "\"requestContext\": {" + + " \"httpMethod\": \"POST\"," + + " \"requestId\": \"req-order-1\"," + + " \"identity\": {\"sourceIp\": \"10.0.0.1\"}" + + "}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); @@ -449,44 +411,41 @@ void responseAndRequestCallbacksAreBothInvoked() throws IOException { @Test void invocationSpanCarriesHttpTags() throws IOException { - String eventJson = - "{" - + "\"resource\": \"/api/users/{id}\"," - + "\"path\": \"/api/users/123\"," - + "\"httpMethod\": \"GET\"," - + "\"queryStringParameters\": {\"q\": \"hello\"}," - + "\"headers\": {\"Host\": \"api.example.com\"," - + " \"User-Agent\": \"test-agent\"}," - + "\"requestContext\": {" - + " \"httpMethod\": \"GET\"," - + " \"requestId\": \"req-tags\"," - + " \"domainName\": \"api.example.com\"," - + " \"identity\": {\"sourceIp\": \"127.0.0.1\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"resource\": \"/api/users/{id}\"," + + "\"path\": \"/api/users/123\"," + + "\"httpMethod\": \"GET\"," + + "\"queryStringParameters\": {\"q\": \"hello\"}," + + "\"headers\": {\"Host\": \"api.example.com\"," + + " \"User-Agent\": \"test-agent\"}," + + "\"requestContext\": {" + + " \"httpMethod\": \"GET\"," + + " \"requestId\": \"req-tags\"," + + " \"domainName\": \"api.example.com\"," + + " \"identity\": {\"sourceIp\": \"127.0.0.1\"}" + + "}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); ByteArrayOutputStream output = new ByteArrayOutputStream(); new HandlerStreamingWithApiGwResponse().handleRequest(input, output, newContext()); - assertTraces( - trace( - span() - .type(DDSpanTypes.SERVERLESS) - .error(false) - .tags( - defaultTags(), - tag("request_id", is(REQUEST_ID)), - tag(Tags.HTTP_METHOD, is("GET")), - // The tracer tags http.url without the query string; QueryObfuscator - // obfuscates http.query.string and re-appends it as the trace is serialised - tag(Tags.HTTP_URL, is("https://api.example.com/api/users/123?q=hello")), - tag(DDTags.HTTP_QUERY, is("q=hello")), - tag(Tags.HTTP_USER_AGENT, is("test-agent")), - tag(Tags.HTTP_ROUTE, is("/api/users/{id}")), - tag(Tags.HTTP_HOSTNAME, is("api.example.com")), - tag(Tags.HTTP_STATUS, is(200))))); + assertTraces(trace(span() + .type(DDSpanTypes.SERVERLESS) + .error(false) + .tags( + defaultTags(), + tag("request_id", is(REQUEST_ID)), + tag(Tags.HTTP_METHOD, is("GET")), + // The tracer tags http.url without the query string; QueryObfuscator + // obfuscates http.query.string and re-appends it as the trace is serialised + tag(Tags.HTTP_URL, is("https://api.example.com/api/users/123?q=hello")), + tag(DDTags.HTTP_QUERY, is("q=hello")), + tag(Tags.HTTP_USER_AGENT, is("test-agent")), + tag(Tags.HTTP_ROUTE, is("/api/users/{id}")), + tag(Tags.HTTP_HOSTNAME, is("api.example.com")), + tag(Tags.HTTP_STATUS, is(200))))); } @Test @@ -497,46 +456,36 @@ void responseCallbacksFireBeforeRequestEnded() throws IOException { SubscriptionService ss = (SubscriptionService) ig; ss.reset(); + ss.registerCallback(EVENTS.requestStarted(), (Supplier>) + () -> new Flow.ResultFlow<>(new Object())); + ss.registerCallback(EVENTS.responseStarted(), (BiFunction>) + (ctx2, status) -> { + callOrder.add("responseStarted"); + return Flow.ResultFlow.empty(); + }); ss.registerCallback( - EVENTS.requestStarted(), - (Supplier>) () -> new Flow.ResultFlow<>(new Object())); - ss.registerCallback( - EVENTS.responseStarted(), - (BiFunction>) - (ctx2, status) -> { - callOrder.add("responseStarted"); - return Flow.ResultFlow.empty(); - }); - ss.registerCallback( - EVENTS.responseHeaderDone(), - (Function>) - ctx2 -> { - callOrder.add("responseHeaderDone"); - return Flow.ResultFlow.empty(); - }); - ss.registerCallback( - EVENTS.responseBody(), - (BiFunction>) - (ctx2, body) -> { - callOrder.add("responseBody"); - return Flow.ResultFlow.empty(); - }); + EVENTS.responseHeaderDone(), (Function>) ctx2 -> { + callOrder.add("responseHeaderDone"); + return Flow.ResultFlow.empty(); + }); ss.registerCallback( - EVENTS.requestEnded(), - (BiFunction>) - (ctx2, spanInfo) -> { - callOrder.add("requestEnded"); - return Flow.ResultFlow.empty(); - }); - - String eventJson = - "{" - + "\"path\": \"/api/test\"," - + "\"requestContext\": {" - + " \"httpMethod\": \"GET\"," - + " \"requestId\": \"req-order-2\"" - + "}" - + "}"; + EVENTS.responseBody(), (BiFunction>) (ctx2, body) -> { + callOrder.add("responseBody"); + return Flow.ResultFlow.empty(); + }); + ss.registerCallback(EVENTS.requestEnded(), (BiFunction>) + (ctx2, spanInfo) -> { + callOrder.add("requestEnded"); + return Flow.ResultFlow.empty(); + }); + + String eventJson = "{" + + "\"path\": \"/api/test\"," + + "\"requestContext\": {" + + " \"httpMethod\": \"GET\"," + + " \"requestId\": \"req-order-2\"" + + "}" + + "}"; ByteArrayInputStream input = new ByteArrayInputStream(eventJson.getBytes(StandardCharsets.UTF_8)); ByteArrayOutputStream output = new ByteArrayOutputStream(); @@ -563,15 +512,10 @@ void responseCallbacksReceiveNoDataWhenHandlerThrows() { assertNull(capturedResponseStatus, "response status should not be set when handler throws"); assertNull(capturedResponseBody, "response body should not be set when handler throws"); - assertTraces( - trace( - span() - .type(DDSpanTypes.SERVERLESS) - .error(true) - .tags( - defaultTags(), - tag("request_id", is(REQUEST_ID)), - error(Error.class, "Some error")))); + assertTraces(trace(span() + .type(DDSpanTypes.SERVERLESS) + .error(true) + .tags(defaultTags(), tag("request_id", is(REQUEST_ID)), error(Error.class, "Some error")))); } private static final class TestContext implements Context { diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-s3-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/s3/S3Interceptor.java b/dd-java-agent/instrumentation/aws-java/aws-java-s3-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/s3/S3Interceptor.java index 4ab9a591572..596544de884 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-s3-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/s3/S3Interceptor.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-s3-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/s3/S3Interceptor.java @@ -19,9 +19,9 @@ public class S3Interceptor implements ExecutionInterceptor { private static final Logger log = LoggerFactory.getLogger(S3Interceptor.class); - public static final ExecutionAttribute CONTEXT_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); + public static final ExecutionAttribute CONTEXT_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); private static final boolean CAN_ADD_SPAN_POINTERS = Config.get().isAddSpanPointers("aws"); diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsNameCache.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsNameCache.java index 11d9d397884..eaaf14052a9 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsNameCache.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsNameCache.java @@ -16,26 +16,26 @@ public class AwsNameCache { private static final DDCache CACHE = DDCaches.newFixedSizeCache(128); // cloud services can have high cardinality - private static final QualifiedClassNameCache CLASS_NAME_CACHE = - new QualifiedClassNameCache( - input -> REQUEST_PATTERN.matcher(input.getSimpleName()).replaceAll(""), - Functions.SuffixJoin.of( - ".", - serviceName -> - AMAZON_PATTERN.matcher(String.valueOf(serviceName)).replaceAll("").trim())); + private static final QualifiedClassNameCache CLASS_NAME_CACHE = new QualifiedClassNameCache( + input -> REQUEST_PATTERN.matcher(input.getSimpleName()).replaceAll(""), + Functions.SuffixJoin.of( + ".", + serviceName -> + AMAZON_PATTERN.matcher(String.valueOf(serviceName)).replaceAll("").trim())); public static CharSequence spanName(final Request awsRequest) { return CACHE.computeIfAbsent( getQualifiedName(awsRequest).toString(), - key -> - UTF8BytesString.create( - SpanNaming.instance() - .namingSchema() - .cloud() - .operationForRequest( - "aws", - AMAZON_PATTERN.matcher(awsRequest.getServiceName()).replaceAll("").trim(), - key))); + key -> UTF8BytesString.create(SpanNaming.instance() + .namingSchema() + .cloud() + .operationForRequest( + "aws", + AMAZON_PATTERN + .matcher(awsRequest.getServiceName()) + .replaceAll("") + .trim(), + key))); } public static CharSequence getQualifiedName(final Request awsRequest) { diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java index 07027e0f4f6..67e3e0d7a76 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java @@ -195,7 +195,8 @@ protected void doOnRequest(final AgentSpan span, final Request request) { span.setTag(Tags.PEER_SERVICE, hostname); span.setTag(DDTags.PEER_SERVICE_SOURCE, "peer.service"); } else { - if (bestPrecursor != null && SpanNaming.instance().namingSchema().peerService().supports()) { + if (bestPrecursor != null + && SpanNaming.instance().namingSchema().peerService().supports()) { span.setTag(Tags.PEER_SERVICE, bestPeerService); span.setTag(DDTags.PEER_SERVICE_SOURCE, bestPrecursor); } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/GetterAccess.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/GetterAccess.java index ed87408c1bd..c1af6ec77d2 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/GetterAccess.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/GetterAccess.java @@ -10,15 +10,14 @@ import java.util.regex.Pattern; final class GetterAccess { - private static final ClassValue GETTER_ACCESS = - GenericClassValue.of( - // Uses inner class for predictable name for Instrumenter.Default.helperClassNames() - new Function, GetterAccess>() { - @Override - public GetterAccess apply(final Class requestType) { - return new GetterAccess(requestType); - } - }); + private static final ClassValue GETTER_ACCESS = GenericClassValue.of( + // Uses inner class for predictable name for Instrumenter.Default.helperClassNames() + new Function, GetterAccess>() { + @Override + public GetterAccess apply(final Class requestType) { + return new GetterAccess(requestType); + } + }); static GetterAccess of(final Object request) { return GETTER_ACCESS.get(request.getClass()); diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/HandlerChainFactoryInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/HandlerChainFactoryInstrumentation.java index 30abe11b161..d7217ae9110 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/HandlerChainFactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/HandlerChainFactoryInstrumentation.java @@ -41,12 +41,11 @@ public static void addHandler(@Advice.Return final List handler return; } } - handlers.add( - new TracingRequestHandler( - InstrumentationContext.get( - "com.amazonaws.services.sqs.model.ReceiveMessageResult", "java.lang.String"), - InstrumentationContext.get( - "com.amazonaws.AmazonWebServiceRequest", "datadog.context.Context"))); + handlers.add(new TracingRequestHandler( + InstrumentationContext.get( + "com.amazonaws.services.sqs.model.ReceiveMessageResult", "java.lang.String"), + InstrumentationContext.get( + "com.amazonaws.AmazonWebServiceRequest", "datadog.context.Context"))); } } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/OnErrorDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/OnErrorDecorator.java index fb25eb82d07..78294c06ad9 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/OnErrorDecorator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/OnErrorDecorator.java @@ -7,9 +7,8 @@ public class OnErrorDecorator extends BaseDecorator { - public static final HandlerContextKey CONTEXT_CONTEXT_KEY = - new HandlerContextKey<>( - "DatadogContext"); // same as TracingRequestHandler.CONTEXT_CONTEXT_KEY + public static final HandlerContextKey CONTEXT_CONTEXT_KEY = new HandlerContextKey<>( + "DatadogContext"); // same as TracingRequestHandler.CONTEXT_CONTEXT_KEY public static final OnErrorDecorator DECORATE = new OnErrorDecorator(); diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsClientInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsClientInstrumentation.java index 440295067ae..b691de4f93f 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsClientInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsClientInstrumentation.java @@ -33,11 +33,8 @@ public static void methodExit(@Advice.Return final List in return; // list already has our interceptor, return to builder } } - interceptors.add( - new TracingExecutionInterceptor( - InstrumentationContext.get( - "software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse", - "java.lang.String"))); + interceptors.add(new TracingExecutionInterceptor(InstrumentationContext.get( + "software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse", "java.lang.String"))); } } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java index 1aef1957213..8573a881c19 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java @@ -50,9 +50,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(isPublic()) .and(named("execute")) - .and( - takesArgument( - 1, named("software.amazon.awssdk.core.internal.http.RequestExecutionContext"))), + .and(takesArgument( + 1, named("software.amazon.awssdk.core.internal.http.RequestExecutionContext"))), AwsHttpClientInstrumentation.class.getName() + "$AwsHttpClientAdvice"); } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java index 7c1a1a85b90..6f2906eb686 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java @@ -92,9 +92,9 @@ public class AwsSdkClientDecorator extends HttpClientDecorator KINESIS_STREAM_ARN_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("KinesisStreamArn", () -> new ExecutionAttribute<>("KinesisStreamArn")); + public static final ExecutionAttribute KINESIS_STREAM_ARN_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("KinesisStreamArn", () -> new ExecutionAttribute<>("KinesisStreamArn")); // not static because this object would be ClassLoader specific if multiple SDK instances were // loaded by different loaders @@ -108,12 +108,11 @@ public CharSequence spanName(final ExecutionAttributes attributes) { return CACHE.computeIfAbsent( qualifiedName, - s -> - SpanNaming.instance() - .namingSchema() - .cloud() - .operationForRequest( - "aws", attributes.getAttribute(SdkExecutionAttribute.SERVICE_NAME), s)); + s -> SpanNaming.instance() + .namingSchema() + .cloud() + .operationForRequest( + "aws", attributes.getAttribute(SdkExecutionAttribute.SERVICE_NAME), s)); } public void onSdkRequest( @@ -148,17 +147,14 @@ public void onSdkRequest( storageClass -> span.setTag(InstrumentationTags.AWS_STORAGE_CLASS, storageClass)); // SQS - request - .getValueForField("QueueUrl", String.class) - .ifPresent( - url -> { - span.setTag(InstrumentationTags.AWS_QUEUE_URL, url); - setPeerService(span, InstrumentationTags.AWS_QUEUE_URL, url); - String queueName = urlFileName(url); - if (!queueName.isEmpty()) { - setQueueName(span, queueName); - } - }); + request.getValueForField("QueueUrl", String.class).ifPresent(url -> { + span.setTag(InstrumentationTags.AWS_QUEUE_URL, url); + setPeerService(span, InstrumentationTags.AWS_QUEUE_URL, url); + String queueName = urlFileName(url); + if (!queueName.isEmpty()) { + setQueueName(span, queueName); + } + }); request.getValueForField("QueueName", String.class).ifPresent(name -> setQueueName(span, name)); // SNS @@ -174,16 +170,15 @@ public void onSdkRequest( .getValueForField("StreamName", String.class) .ifPresent(name -> setStreamName(span, name)); Optional kinesisStreamArn = request.getValueForField("StreamARN", String.class); - kinesisStreamArn.ifPresent( - streamArn -> { - if (traceConfig().isDataStreamsEnabled()) { - attributes.putAttribute(KINESIS_STREAM_ARN_ATTRIBUTE, streamArn); - } - int streamNameStart = streamArn.indexOf(":stream/"); - if (streamNameStart >= 0) { - setStreamName(span, streamArn.substring(streamNameStart + 8)); - } - }); + kinesisStreamArn.ifPresent(streamArn -> { + if (traceConfig().isDataStreamsEnabled()) { + attributes.putAttribute(KINESIS_STREAM_ARN_ATTRIBUTE, streamArn); + } + int streamNameStart = streamArn.indexOf(":stream/"); + if (streamNameStart >= 0) { + setStreamName(span, streamArn.substring(streamNameStart + 8)); + } + }); // DynamoDB request.getValueForField("TableName", String.class).ifPresent(name -> setTableName(span, name)); @@ -194,10 +189,9 @@ public void onSdkRequest( && "kinesis".equalsIgnoreCase(awsServiceName) && KINESIS_PUT_RECORD_OPERATION_NAMES.contains(awsOperationName)) { // https://github.com/DataDog/dd-trace-py/blob/864abb6c99e1cb0449904260bac93e8232261f2a/ddtrace/contrib/botocore/patch.py#L368 - List records = - request - .getValueForField("Records", List.class) - .orElse(Collections.singletonList(request)); // For PutRecord use request + List records = request + .getValueForField("Records", List.class) + .orElse(Collections.singletonList(request)); // For PutRecord use request for (Object ignored : records) { AgentTracer.get() @@ -207,10 +201,9 @@ public void onSdkRequest( } else if (snsTopicName.isPresent() && "sns".equalsIgnoreCase(awsServiceName) && SNS_PUBLISH_OPERATION_NAMES.contains(awsOperationName)) { - List entries = - request - .getValueForField("PublishBatchRequestEntries", List.class) - .orElse(Collections.singletonList(request)); + List entries = request + .getValueForField("PublishBatchRequestEntries", List.class) + .orElse(Collections.singletonList(request)); for (Object ignored : entries) { AgentTracer.get() @@ -335,43 +328,37 @@ public void onSdkResponse( // https://github.com/DataDog/dd-trace-py/blob/864abb6c99e1cb0449904260bac93e8232261f2a/ddtrace/contrib/botocore/patch.py#L350 String streamArn = attributes.getAttribute(KINESIS_STREAM_ARN_ATTRIBUTE); if (null != streamArn) { - response - .getValueForField("Records", List.class) - .ifPresent( - recordsRaw -> { - //noinspection unchecked - List records = (List) recordsRaw; - if (!records.isEmpty()) { - DataStreamsTags tags = create("kinesis", INBOUND, streamArn); - if (null == kinesisApproximateArrivalTimestampField) { - Optional> maybeField = - records.get(0).sdkFields().stream() - .filter(f -> f.locationName().equals("ApproximateArrivalTimestamp")) - .findFirst(); - if (maybeField.isPresent()) { - //noinspection unchecked - kinesisApproximateArrivalTimestampField = - (SdkField) maybeField.get(); - } else { - // shouldn't be possible - return; - } - } - for (SdkPojo record : records) { - Instant arrivalTime = - kinesisApproximateArrivalTimestampField.getValueOrDefault(record); - AgentDataStreamsMonitoring dataStreamsMonitoring = - AgentTracer.get().getDataStreamsMonitoring(); - PathwayContext pathwayContext = dataStreamsMonitoring.newPathwayContext(); - pathwayContext.setCheckpoint( - create(tags, arrivalTime.toEpochMilli(), 0), - dataStreamsMonitoring::add); - if (!span.spanContext().getPathwayContext().isStarted()) { - span.spanContext().mergePathwayContext(pathwayContext); - } - } - } - }); + response.getValueForField("Records", List.class).ifPresent(recordsRaw -> { + //noinspection unchecked + List records = (List) recordsRaw; + if (!records.isEmpty()) { + DataStreamsTags tags = create("kinesis", INBOUND, streamArn); + if (null == kinesisApproximateArrivalTimestampField) { + Optional> maybeField = records.get(0).sdkFields().stream() + .filter(f -> f.locationName().equals("ApproximateArrivalTimestamp")) + .findFirst(); + if (maybeField.isPresent()) { + //noinspection unchecked + kinesisApproximateArrivalTimestampField = (SdkField) maybeField.get(); + } else { + // shouldn't be possible + return; + } + } + for (SdkPojo record : records) { + Instant arrivalTime = + kinesisApproximateArrivalTimestampField.getValueOrDefault(record); + AgentDataStreamsMonitoring dataStreamsMonitoring = + AgentTracer.get().getDataStreamsMonitoring(); + PathwayContext pathwayContext = dataStreamsMonitoring.newPathwayContext(); + pathwayContext.setCheckpoint( + create(tags, arrivalTime.toEpochMilli(), 0), dataStreamsMonitoring::add); + if (!span.spanContext().getPathwayContext().isStarted()) { + span.spanContext().mergePathwayContext(pathwayContext); + } + } + } + }); } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/TracingExecutionInterceptor.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/TracingExecutionInterceptor.java index 366c67675e3..4f2986b4160 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/TracingExecutionInterceptor.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/TracingExecutionInterceptor.java @@ -37,9 +37,9 @@ /** AWS request execution interceptor */ public class TracingExecutionInterceptor implements ExecutionInterceptor { - public static final ExecutionAttribute CONTEXT_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); + public static final ExecutionAttribute CONTEXT_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); private static final Logger log = LoggerFactory.getLogger(TracingExecutionInterceptor.class); diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sfn-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sfn/SfnInterceptor.java b/dd-java-agent/instrumentation/aws-java/aws-java-sfn-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sfn/SfnInterceptor.java index 0b6b36b945d..7d60949f1f9 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sfn-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sfn/SfnInterceptor.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sfn-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sfn/SfnInterceptor.java @@ -13,9 +13,9 @@ public class SfnInterceptor implements ExecutionInterceptor { - public static final ExecutionAttribute CONTEXT_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); + public static final ExecutionAttribute CONTEXT_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); public SfnInterceptor() {} diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sns-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sns/SnsClientInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sns-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sns/SnsClientInstrumentation.java index bd80bfd554a..e4e6fa5b7f5 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sns-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sns/SnsClientInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sns-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sns/SnsClientInstrumentation.java @@ -53,10 +53,8 @@ public static void addHandler(@Advice.Return final List handler return; // list already has our interceptor, return to builder } } - handlers.add( - new SnsInterceptor( - InstrumentationContext.get( - "com.amazonaws.AmazonWebServiceRequest", "datadog.context.Context"))); + handlers.add(new SnsInterceptor(InstrumentationContext.get( + "com.amazonaws.AmazonWebServiceRequest", "datadog.context.Context"))); } } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptor.java b/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptor.java index 6f84107b7dd..4a95c586b54 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptor.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptor.java @@ -28,9 +28,9 @@ public class SnsInterceptor implements ExecutionInterceptor { // SQS subscriber limit; SNS inherits it when SQS is used as a subscriber private static final int MAX_MESSAGE_ATTRIBUTES = 10; - public static final ExecutionAttribute CONTEXT_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); + public static final ExecutionAttribute CONTEXT_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); private SdkBytes getMessageAttributeValueToInject( ExecutionAttributes executionAttributes, String snsTopicName) { @@ -70,10 +70,9 @@ public SdkRequest modifyRequest(ModifyRequest context, ExecutionAttributes execu } String snsTopicName = snsTopicArn.substring(snsTopicArn.lastIndexOf(':') + 1); - Map messageAttributes = - withDatadogAttribute( - request.messageAttributes(), - this.getMessageAttributeValueToInject(executionAttributes, snsTopicName)); + Map messageAttributes = withDatadogAttribute( + request.messageAttributes(), + this.getMessageAttributeValueToInject(executionAttributes, snsTopicName)); return request.toBuilder().messageAttributes(messageAttributes).build(); } return request; @@ -104,7 +103,8 @@ private static Map withDatadogAttribute( // Use Binary since SNS subscription filter policies fail silently with JSON strings // https://github.com/DataDog/datadog-lambda-js/pull/269 modified.put( - "_datadog", MessageAttributeValue.builder().dataType("Binary").binaryValue(value).build()); + "_datadog", + MessageAttributeValue.builder().dataType("Binary").binaryValue(value).build()); return modified; } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptorTest.java b/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptorTest.java index 74e4ad2d454..1e140e420db 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptorTest.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/test/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptorTest.java @@ -23,25 +23,23 @@ public class SnsInterceptorTest { @Test void publishBatchPreservesEntriesAndOnlyInjectsBelowTheMessageAttributeLimit() { - PublishBatchRequest batchRequest = - PublishBatchRequest.builder() - .topicArn("arn:aws:sns:us-east-1:123456789012:test-topic") - .publishBatchRequestEntries( - PublishBatchRequestEntry.builder() - .id("at-limit") - .message("first") - .messageAttributes(stringAttributes(10)) - .build(), - PublishBatchRequestEntry.builder() - .id("under-limit") - .message("second") - .messageAttributes(stringAttributes(9)) - .build()) - .build(); + PublishBatchRequest batchRequest = PublishBatchRequest.builder() + .topicArn("arn:aws:sns:us-east-1:123456789012:test-topic") + .publishBatchRequestEntries( + PublishBatchRequestEntry.builder() + .id("at-limit") + .message("first") + .messageAttributes(stringAttributes(10)) + .build(), + PublishBatchRequestEntry.builder() + .id("under-limit") + .message("second") + .messageAttributes(stringAttributes(9)) + .build()) + .build(); - PublishBatchRequest modified = - (PublishBatchRequest) - new SnsInterceptor().modifyRequest(() -> batchRequest, executionAttributes()); + PublishBatchRequest modified = (PublishBatchRequest) + new SnsInterceptor().modifyRequest(() -> batchRequest, executionAttributes()); assertEquals( Arrays.asList("at-limit", "under-limit"), @@ -58,15 +56,18 @@ void publishBatchPreservesEntriesAndOnlyInjectsBelowTheMessageAttributeLimit() { void publishPreservesReadonlyAttributesWhileAddingDatadogContext() { Map headers = new HashMap<>(); headers.put( - "mykey", MessageAttributeValue.builder().dataType("String").stringValue("myvalue").build()); + "mykey", + MessageAttributeValue.builder() + .dataType("String") + .stringValue("myvalue") + .build()); Map readonlyHeaders = Collections.unmodifiableMap(headers); - PublishRequest request = - PublishRequest.builder() - .topicArn("arn:aws:sns:us-east-1:123456789012:test-topic") - .message("sometext") - .messageAttributes(readonlyHeaders) - .build(); + PublishRequest request = PublishRequest.builder() + .topicArn("arn:aws:sns:us-east-1:123456789012:test-topic") + .message("sometext") + .messageAttributes(readonlyHeaders) + .build(); PublishRequest modified = (PublishRequest) new SnsInterceptor().modifyRequest(() -> request, executionAttributes()); @@ -88,7 +89,10 @@ private static Map stringAttributes(int count) { for (int index = 1; index <= count; index++) { attributes.put( "key" + index, - MessageAttributeValue.builder().dataType("String").stringValue("value" + index).build()); + MessageAttributeValue.builder() + .dataType("String") + .stringValue("value" + index) + .build()); } return attributes; } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/QueueBufferConfigInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/QueueBufferConfigInstrumentation.java index eee0e4d9b9d..7bb6adeb844 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/QueueBufferConfigInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/QueueBufferConfigInstrumentation.java @@ -36,9 +36,8 @@ public ElementMatcher structureMatcher() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isConstructor() - .or( - isMethod() - .and(namedOneOf("setReceiveAttributeNames", "withReceiveAttributeNames"))), + .or(isMethod() + .and(namedOneOf("setReceiveAttributeNames", "withReceiveAttributeNames"))), getClass().getName() + "$QueueBufferConfigAdvice"); } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsClientInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsClientInstrumentation.java index 8c47ff8f660..bf6033235d7 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsClientInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsClientInstrumentation.java @@ -38,8 +38,7 @@ public void methodAdvice(MethodTransformer transformer) { @Override public String[] helperClassNames() { - return new String[] { - packageName + ".SqsInterceptor", packageName + ".MessageAttributeInjector" + return new String[] {packageName + ".SqsInterceptor", packageName + ".MessageAttributeInjector" }; } @@ -59,10 +58,8 @@ public static void addHandler(@Advice.Return final List handler return; // list already has our interceptor, return to builder } } - handlers.add( - new SqsInterceptor( - InstrumentationContext.get( - "com.amazonaws.AmazonWebServiceRequest", "datadog.context.Context"))); + handlers.add(new SqsInterceptor(InstrumentationContext.get( + "com.amazonaws.AmazonWebServiceRequest", "datadog.context.Context"))); } } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsDecorator.java index a306525a91e..bea361a500a 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsDecorator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsDecorator.java @@ -14,9 +14,8 @@ public class SqsDecorator extends MessagingClientDecorator { static final CharSequence COMPONENT_NAME = UTF8BytesString.create("java-aws-sdk"); - public static final CharSequence SQS_INBOUND_OPERATION = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation("sqs")); + public static final CharSequence SQS_INBOUND_OPERATION = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation("sqs")); public static final CharSequence SQS_RECEIVE = UTF8BytesString.create("SQS.ReceiveMessage"); public static final CharSequence SQS_DELIVER = UTF8BytesString.create("SQS.DeliverMessage"); public static final CharSequence SQS_TIME_IN_QUEUE_OPERATION = @@ -28,20 +27,15 @@ public class SqsDecorator extends MessagingClientDecorator { private final CharSequence spanType; private final Supplier serviceNameSupplier; - public static final SqsDecorator CONSUMER_DECORATE = - new SqsDecorator( - SPAN_KIND_CONSUMER, - MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService("sqs", SQS_LEGACY_TRACING)); + public static final SqsDecorator CONSUMER_DECORATE = new SqsDecorator( + SPAN_KIND_CONSUMER, + MESSAGE_CONSUMER, + SpanNaming.instance().namingSchema().messaging().inboundService("sqs", SQS_LEGACY_TRACING)); - public static final SqsDecorator BROKER_DECORATE = - new SqsDecorator( - SPAN_KIND_BROKER, - MESSAGE_BROKER, - SpanNaming.instance().namingSchema().messaging().timeInQueueService("sqs")); + public static final SqsDecorator BROKER_DECORATE = new SqsDecorator( + SPAN_KIND_BROKER, + MESSAGE_BROKER, + SpanNaming.instance().namingSchema().messaging().timeInQueueService("sqs")); protected SqsDecorator(String spanKind, CharSequence spanType, Supplier serviceName) { this.spanKind = spanKind; diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/TracingIterator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/TracingIterator.java index c6d6b40cc59..c26af7103e2 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/TracingIterator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/TracingIterator.java @@ -79,20 +79,18 @@ protected void startNewMessageSpan(Message message) { AgentSpan queueSpan = null; if (batchContext == null) { // first grab any incoming distributed context - AgentSpanContext spanContext = - Config.get().isSqsPropagationEnabled() - ? extractContextAndGetSpanContext(message, GETTER) - : null; + AgentSpanContext spanContext = Config.get().isSqsPropagationEnabled() + ? extractContextAndGetSpanContext(message, GETTER) + : null; // next add a time-in-queue span for non-legacy SQS traces if (TIME_IN_QUEUE_ENABLED) { long timeInQueueStart = GETTER.extractTimeInQueueStart(message); if (timeInQueueStart > 0) { - queueSpan = - startSpan( - COMPONENT_NAME.toString(), - SQS_TIME_IN_QUEUE_OPERATION, - spanContext, - MILLISECONDS.toMicros(timeInQueueStart)); + queueSpan = startSpan( + COMPONENT_NAME.toString(), + SQS_TIME_IN_QUEUE_OPERATION, + spanContext, + MILLISECONDS.toMicros(timeInQueueStart)); BROKER_DECORATE.afterStart(queueSpan); BROKER_DECORATE.onTimeInQueue(queueSpan, queueUrl); spanContext = queueSpan.spanContext(); diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/MessageAttributeInjector.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/MessageAttributeInjector.java index 59dfb4f9e74..79e0dd05f07 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/MessageAttributeInjector.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/MessageAttributeInjector.java @@ -44,7 +44,10 @@ public void set( existing.substring(0, closingBrace) + String.format(", \"%s\": \"%s\"}", key, value); carrier.put( DATADOG_KEY, - MessageAttributeValue.builder().dataType("String").stringValue(updated).build()); + MessageAttributeValue.builder() + .dataType("String") + .stringValue(updated) + .build()); } } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java index dd4da882456..63d1954598a 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java @@ -15,9 +15,8 @@ public class SqsDecorator extends MessagingClientDecorator { static final CharSequence COMPONENT_NAME = UTF8BytesString.create("java-aws-sdk"); - public static final CharSequence SQS_INBOUND_OPERATION = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation("sqs")); + public static final CharSequence SQS_INBOUND_OPERATION = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation("sqs")); public static final CharSequence SQS_RECEIVE = UTF8BytesString.create("Sqs.ReceiveMessage"); public static final CharSequence SQS_DELIVER = UTF8BytesString.create("Sqs.DeliverMessage"); public static final CharSequence SQS_TIME_IN_QUEUE_OPERATION = @@ -30,20 +29,15 @@ public class SqsDecorator extends MessagingClientDecorator { private final CharSequence spanType; private final Supplier serviceNameSupplier; - public static final SqsDecorator CONSUMER_DECORATE = - new SqsDecorator( - SPAN_KIND_CONSUMER, - MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService("sqs", SQS_LEGACY_TRACING)); + public static final SqsDecorator CONSUMER_DECORATE = new SqsDecorator( + SPAN_KIND_CONSUMER, + MESSAGE_CONSUMER, + SpanNaming.instance().namingSchema().messaging().inboundService("sqs", SQS_LEGACY_TRACING)); - public static final SqsDecorator BROKER_DECORATE = - new SqsDecorator( - SPAN_KIND_BROKER, - MESSAGE_BROKER, - SpanNaming.instance().namingSchema().messaging().timeInQueueService("sqs")); + public static final SqsDecorator BROKER_DECORATE = new SqsDecorator( + SPAN_KIND_BROKER, + MESSAGE_BROKER, + SpanNaming.instance().namingSchema().messaging().timeInQueueService("sqs")); protected SqsDecorator( String spanKind, CharSequence spanType, Supplier serviceNameSupplier) { diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsInterceptor.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsInterceptor.java index ed59931810a..7f0a96e1a9d 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsInterceptor.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsInterceptor.java @@ -30,9 +30,9 @@ public class SqsInterceptor implements ExecutionInterceptor { - public static final ExecutionAttribute CONTEXT_ATTRIBUTE = - InstanceStore.of(ExecutionAttribute.class) - .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); + public static final ExecutionAttribute CONTEXT_ATTRIBUTE = InstanceStore.of( + ExecutionAttribute.class) + .getOrCreate("DatadogContext", () -> new ExecutionAttribute<>("DatadogContext")); public SqsInterceptor() {} diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsJmsMessageInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsJmsMessageInstrumentation.java index 0e759660cec..519c8f2a3fd 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsJmsMessageInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsJmsMessageInstrumentation.java @@ -52,7 +52,8 @@ public static void onEnter(@Advice.Argument(value = 2, readOnly = false) Message Map messageAttributesCopy = new HashMap<>(messageAttributes); // need to copy to remove because the original is an UnmodifiableMap messageAttributesCopy.remove("_datadog"); - sqsMessage = sqsMessage.toBuilder().messageAttributes(messageAttributesCopy).build(); + sqsMessage = + sqsMessage.toBuilder().messageAttributes(messageAttributesCopy).build(); } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResponseBuilderInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResponseBuilderInstrumentation.java index 3fc1ffeb55d..d3dfae1ad34 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResponseBuilderInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResponseBuilderInstrumentation.java @@ -27,10 +27,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(named("toBuilder")) .and(takesNoArguments()) - .and( - returns( - named( - "software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse$Builder"))), + .and(returns( + named("software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse$Builder"))), getClass().getName() + "$ToBuilderAdvice"); } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResultInstrumentation.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResultInstrumentation.java index 9b53fd8a316..2ad734c93e8 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResultInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsReceiveResultInstrumentation.java @@ -35,10 +35,11 @@ public static void onExit( return; } if (messages != null && !messages.isEmpty() && !(messages instanceof TracingList)) { - String queueUrl = - InstrumentationContext.get(ReceiveMessageResponse.class, String.class).get(result); + String queueUrl = InstrumentationContext.get(ReceiveMessageResponse.class, String.class) + .get(result); if (queueUrl != null) { - messages = new TracingList(messages, queueUrl, result.responseMetadata().requestId()); + messages = + new TracingList(messages, queueUrl, result.responseMetadata().requestId()); } } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/TracingIterator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/TracingIterator.java index c027a4432fe..7659dcca20f 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/TracingIterator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/TracingIterator.java @@ -83,20 +83,18 @@ protected void startNewMessageSpan(Message message) { AgentSpan queueSpan = null; if (batchContext == null) { // first grab any incoming distributed context - AgentSpanContext spanContext = - Config.get().isSqsPropagationEnabled() - ? extractContextAndGetSpanContext(message, GETTER) - : null; + AgentSpanContext spanContext = Config.get().isSqsPropagationEnabled() + ? extractContextAndGetSpanContext(message, GETTER) + : null; // next add a time-in-queue span for non-legacy SQS traces if (TIME_IN_QUEUE_ENABLED) { long timeInQueueStart = GETTER.extractTimeInQueueStart(message); if (timeInQueueStart > 0) { - queueSpan = - startSpan( - COMPONENT_NAME.toString(), - SQS_TIME_IN_QUEUE_OPERATION, - spanContext, - MILLISECONDS.toMicros(timeInQueueStart)); + queueSpan = startSpan( + COMPONENT_NAME.toString(), + SQS_TIME_IN_QUEUE_OPERATION, + spanContext, + MILLISECONDS.toMicros(timeInQueueStart)); BROKER_DECORATE.afterStart(queueSpan); BROKER_DECORATE.onTimeInQueue(queueSpan, queueUrl, queueName, requestId); spanContext = queueSpan.spanContext(); diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java index 5569f7898fc..b654356889f 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java @@ -85,17 +85,16 @@ void traceDetailsPropagatedViaSqsSystemMessageAttributes() throws Exception { String queueUrl = createQueue(client); writer.clear(); - TraceUtils.runUnderTrace( - "parent", - () -> { - client.sendMessage( - SendMessageRequest.builder().queueUrl(queueUrl).messageBody("sometext").build()); - return null; - }); - List messages = - client - .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) - .messages(); + TraceUtils.runUnderTrace("parent", () -> { + client.sendMessage(SendMessageRequest.builder() + .queueUrl(queueUrl) + .messageBody("sometext") + .build()); + return null; + }); + List messages = client + .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) + .messages(); messages.forEach(message -> {}); DDSpan sendSpan = assertSqsSendReceiveTraces(queueUrl); @@ -103,13 +102,11 @@ void traceDetailsPropagatedViaSqsSystemMessageAttributes() throws Exception { String awsTraceHeader = messages.get(0).attributesAsStrings().get("AWSTraceHeader"); assertNotNull(awsTraceHeader); - assertTrue( - awsTraceHeader.matches( - "Root=1-[0-9a-f]{8}-00000000" - + sendSpan.getTraceId().toHexStringPadded(16) - + ";Parent=" - + DDSpanId.toHexStringPadded(sendSpan.getSpanId()) - + ";Sampled=1")); + assertTrue(awsTraceHeader.matches("Root=1-[0-9a-f]{8}-00000000" + + sendSpan.getTraceId().toHexStringPadded(16) + + ";Parent=" + + DDSpanId.toHexStringPadded(sendSpan.getSpanId()) + + ";Sampled=1")); } } @@ -120,12 +117,13 @@ void datadogContextIsNotInjectedIfSqsInjectDatadogAttributeIsDisabled() throws E String queueUrl = createQueue(client); writer.clear(); - client.sendMessage( - SendMessageRequest.builder().queueUrl(queueUrl).messageBody("sometext").build()); - List messages = - client - .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) - .messages(); + client.sendMessage(SendMessageRequest.builder() + .queueUrl(queueUrl) + .messageBody("sometext") + .build()); + List messages = client + .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) + .messages(); assertEquals(1, messages.size()); assertFalse(messages.get(0).messageAttributes().containsKey("_datadog")); @@ -138,21 +136,21 @@ void apmTraceContextIsInjectedIntoDatadogMessageAttributeOnSend() throws Excepti String queueUrl = createQueue(client); writer.clear(); - TraceUtils.runUnderTrace( - "parent", - () -> { - client.sendMessage( - SendMessageRequest.builder().queueUrl(queueUrl).messageBody("sometext").build()); - return null; - }); - List messages = - client - .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) - .messages(); + TraceUtils.runUnderTrace("parent", () -> { + client.sendMessage(SendMessageRequest.builder() + .queueUrl(queueUrl) + .messageBody("sometext") + .build()); + return null; + }); + List messages = client + .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) + .messages(); messages.forEach(message -> {}); DDSpan sendSpan = assertSqsSendReceiveTraces(queueUrl); - MessageAttributeValue datadogAttribute = messages.get(0).messageAttributes().get("_datadog"); + MessageAttributeValue datadogAttribute = + messages.get(0).messageAttributes().get("_datadog"); assertNotNull(datadogAttribute); assertEquals("String", datadogAttribute.dataType()); assertTrue(datadogAttribute.stringValue().contains("\"x-datadog-trace-id\"")); @@ -168,22 +166,18 @@ void traceDetailsPropagatedViaEmbeddedSqsMessageAttributeString() throws Excepti assumeFalse(isDataStreamsEnabled()); writer.clear(); - Message message = - Message.builder() - .messageAttributes( - Collections.singletonMap( - "_datadog", - MessageAttributeValue.builder() - .dataType("String") - .stringValue( - "{\"x-datadog-trace-id\": \"4948377316357291421\", " - + "\"x-datadog-parent-id\": \"6746998015037429512\", " - + "\"x-datadog-sampling-priority\": \"1\"}") - .build())) - .build(); - List messages = - new TracingList( - Collections.singletonList(message), expectedQueueUrl("somequeue"), requestId()); + Message message = Message.builder() + .messageAttributes(Collections.singletonMap( + "_datadog", + MessageAttributeValue.builder() + .dataType("String") + .stringValue("{\"x-datadog-trace-id\": \"4948377316357291421\", " + + "\"x-datadog-parent-id\": \"6746998015037429512\", " + + "\"x-datadog-sampling-priority\": \"1\"}") + .build())) + .build(); + List messages = new TracingList( + Collections.singletonList(message), expectedQueueUrl("somequeue"), requestId()); messages.forEach(ignored -> {}); @@ -194,16 +188,13 @@ void traceDetailsPropagatedViaEmbeddedSqsMessageAttributeString() throws Excepti void traceDetailsPropagatedViaEmbeddedSqsMessageAttributeBinary() throws Exception { assumeFalse(isDataStreamsEnabled()); + assertEmbeddedBinaryHeader(UTF_8.encode("{\"x-datadog-trace-id\":\"4948377316357291421\"," + + "\"x-datadog-parent-id\":\"6746998015037429512\"," + + "\"x-datadog-sampling-priority\":\"1\"}")); assertEmbeddedBinaryHeader( - UTF_8.encode( - "{\"x-datadog-trace-id\":\"4948377316357291421\"," - + "\"x-datadog-parent-id\":\"6746998015037429512\"," - + "\"x-datadog-sampling-priority\":\"1\"}")); - assertEmbeddedBinaryHeader( - UTF_8.encode( - "eyJ4LWRhdGFkb2ctdHJhY2UtaWQiOiI0OTQ4Mzc3MzE2MzU3MjkxNDIxIiwieC1kYXRhZG9n" - + "LXBhcmVudC1pZCI6IjY3NDY5OTgwMTUwMzc0Mjk1MTIiLCJ4LWRhdGFkb2ctc2FtcGxpbmct" - + "cHJpb3JpdHkiOiIxIn0=")); + UTF_8.encode("eyJ4LWRhdGFkb2ctdHJhY2UtaWQiOiI0OTQ4Mzc3MzE2MzU3MjkxNDIxIiwieC1kYXRhZG9n" + + "LXBhcmVudC1pZCI6IjY3NDY5OTgwMTUwMzc0Mjk1MTIiLCJ4LWRhdGFkb2ctc2FtcGxpbmct" + + "cHJpb3JpdHkiOiIxIn0=")); } @Test @@ -212,8 +203,9 @@ void traceDetailsPropagatedFromSqsToJms() throws Exception { try (SqsClient client = newClient()) { String queueName = queueName(); - String queueUrl = - client.createQueue(CreateQueueRequest.builder().queueName(queueName).build()).queueUrl(); + String queueUrl = client + .createQueue(CreateQueueRequest.builder().queueName(queueName).build()) + .queueUrl(); SQSConnectionFactory connectionFactory = new SQSConnectionFactory(new ProviderConfiguration(), client); Connection connection = connectionFactory.createConnection(); @@ -223,25 +215,21 @@ void traceDetailsPropagatedFromSqsToJms() throws Exception { writer.clear(); - MessageAttributeValue datadogAttribute = - MessageAttributeValue.builder() - .dataType("Binary") - .binaryValue(SdkBytes.fromUtf8String("hello world")) - .build(); + MessageAttributeValue datadogAttribute = MessageAttributeValue.builder() + .dataType("Binary") + .binaryValue(SdkBytes.fromUtf8String("hello world")) + .build(); try { connection.start(); - TraceUtils.runUnderTrace( - "parent", - () -> { - client.sendMessage( - SendMessageRequest.builder() - .queueUrl(queueUrl) - .messageBody("sometext") - .messageAttributes(Collections.singletonMap("_datadog", datadogAttribute)) - .build()); - return null; - }); + TraceUtils.runUnderTrace("parent", () -> { + client.sendMessage(SendMessageRequest.builder() + .queueUrl(queueUrl) + .messageBody("sometext") + .messageAttributes(Collections.singletonMap("_datadog", datadogAttribute)) + .build()); + return null; + }); javax.jms.Message message = consumer.receive(); consumer.receiveNoWait(); @@ -301,15 +289,13 @@ void traceDetailsPropagatedFromSqsToJms() throws Exception { String expectedTraceProperty = "X-Amzn-Trace-Id".toLowerCase(Locale.ENGLISH).replace("-", "__dash__"); - assertTrue( - message - .getStringProperty(expectedTraceProperty) - .matches( - "Root=1-[0-9a-f]{8}-00000000" - + sendSpan.getTraceId().toHexStringPadded(16) - + ";Parent=" - + DDSpanId.toHexStringPadded(sendSpan.getSpanId()) - + ";Sampled=1")); + assertTrue(message + .getStringProperty(expectedTraceProperty) + .matches("Root=1-[0-9a-f]{8}-00000000" + + sendSpan.getTraceId().toHexStringPadded(16) + + ";Parent=" + + DDSpanId.toHexStringPadded(sendSpan.getSpanId()) + + ";Sampled=1")); assertFalse(message.propertyExists("_datadog")); } finally { session.close(); @@ -384,19 +370,16 @@ private DDSpan assertSqsSendReceiveTraces(String queueUrl) throws Exception { private void assertEmbeddedBinaryHeader(ByteBuffer headerValue) throws Exception { writer.clear(); - Message message = - Message.builder() - .messageAttributes( - Collections.singletonMap( - "_datadog", - MessageAttributeValue.builder() - .dataType("Binary") - .binaryValue(SdkBytes.fromByteBuffer(headerValue)) - .build())) - .build(); - List messages = - new TracingList( - Collections.singletonList(message), expectedQueueUrl("somequeue"), requestId()); + Message message = Message.builder() + .messageAttributes(Collections.singletonMap( + "_datadog", + MessageAttributeValue.builder() + .dataType("Binary") + .binaryValue(SdkBytes.fromByteBuffer(headerValue)) + .build())) + .build(); + List messages = new TracingList( + Collections.singletonList(message), expectedQueueUrl("somequeue"), requestId()); messages.forEach(ignored -> {}); @@ -494,12 +477,11 @@ private static String requestId() { } private static String expectedJmsService() { - String service = - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService("jms", Config.get().isJmsLegacyTracingEnabled()) - .get(); + String service = SpanNaming.instance() + .namingSchema() + .messaging() + .inboundService("jms", Config.get().isJmsLegacyTracingEnabled()) + .get(); return service == null ? Config.get().getServiceName() : service; } @@ -604,32 +586,29 @@ void setUpAwsCredentials() { @Test void syncReceiveActivatesConsumerSpanForUserHandlerIteration() throws Exception { - try (SqsClient client = - SqsClient.builder() - .region(Region.EU_CENTRAL_1) - .endpointOverride(endpoint) - .credentialsProvider(CREDENTIALS_PROVIDER) - .build()) { - String queueUrl = - client - .createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) - .queueUrl(); + try (SqsClient client = SqsClient.builder() + .region(Region.EU_CENTRAL_1) + .endpointOverride(endpoint) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build()) { + String queueUrl = client + .createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) + .queueUrl(); writer.clear(); - TraceUtils.runUnderTrace( - "parent", - () -> { - client.sendMessage( - SendMessageRequest.builder().queueUrl(queueUrl).messageBody("sometext").build()); - return null; - }); + TraceUtils.runUnderTrace("parent", () -> { + client.sendMessage(SendMessageRequest.builder() + .queueUrl(queueUrl) + .messageBody("sometext") + .build()); + return null; + }); // The sync AWS SDK receive pipeline rebuilds the immutable response before user code sees it. // Iterating the copied message list must still activate the consumer span for user handlers. - List messages = - client - .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) - .messages(); + List messages = client + .receiveMessage(ReceiveMessageRequest.builder().queueUrl(queueUrl).build()) + .messages(); messages.forEach(message -> TraceUtils.runUnderTrace("handler", () -> null)); assertEquals(1, messages.size()); diff --git a/dd-java-agent/instrumentation/axis2-1.3/src/test/java/test/TestSender.java b/dd-java-agent/instrumentation/axis2-1.3/src/test/java/test/TestSender.java index b3a826c73ae..a47a0997dce 100644 --- a/dd-java-agent/instrumentation/axis2-1.3/src/test/java/test/TestSender.java +++ b/dd-java-agent/instrumentation/axis2-1.3/src/test/java/test/TestSender.java @@ -9,15 +9,13 @@ /** Test sender that checks the outgoing TRANSPORT_HEADERS have the expected propagation headers. */ public class TestSender extends LocalTransportSender { - private static final Set EXPECTED_HEADERS = - new HashSet<>( - Arrays.asList( - "x-datadog-trace-id", - "x-datadog-parent-id", - "x-datadog-sampling-priority", - "x-datadog-tags", - "traceparent", - "tracestate")); + private static final Set EXPECTED_HEADERS = new HashSet<>(Arrays.asList( + "x-datadog-trace-id", + "x-datadog-parent-id", + "x-datadog-sampling-priority", + "x-datadog-tags", + "traceparent", + "tracestate")); @Override public InvocationResponse invoke(MessageContext messageContext) { diff --git a/dd-java-agent/instrumentation/azure-functions-1.2.2/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java b/dd-java-agent/instrumentation/azure-functions-1.2.2/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java index e8466f50844..ea0c38bcfe1 100644 --- a/dd-java-agent/instrumentation/azure-functions-1.2.2/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java +++ b/dd-java-agent/instrumentation/azure-functions-1.2.2/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java @@ -17,9 +17,8 @@ public class AzureFunctionsDecorator public static final CharSequence AZURE_FUNCTIONS = UTF8BytesString.create("azure-functions"); public static final AzureFunctionsDecorator DECORATE = new AzureFunctionsDecorator(); - public static final CharSequence AZURE_FUNCTIONS_REQUEST = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().cloud().operationForFaas("azure")); + public static final CharSequence AZURE_FUNCTIONS_REQUEST = UTF8BytesString.create( + SpanNaming.instance().namingSchema().cloud().operationForFaas("azure")); @Override protected String[] instrumentationNames() { diff --git a/dd-java-agent/instrumentation/azure-functions-1.2.2/src/test/groovy/Function.java b/dd-java-agent/instrumentation/azure-functions-1.2.2/src/test/groovy/Function.java index 94df257d079..83542a3e6eb 100644 --- a/dd-java-agent/instrumentation/azure-functions-1.2.2/src/test/groovy/Function.java +++ b/dd-java-agent/instrumentation/azure-functions-1.2.2/src/test/groovy/Function.java @@ -17,6 +17,9 @@ public HttpResponseMessage run( authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage> request, final ExecutionContext context) { - return request.createResponseBuilder(HttpStatus.OK).body("Hello Datadog test!").build(); + return request + .createResponseBuilder(HttpStatus.OK) + .body("Hello Datadog test!") + .build(); } } diff --git a/dd-java-agent/instrumentation/beanshell-2.0/src/main/java/datadog/trace/instrumentation/beanshell/BeanShellInstrumentation.java b/dd-java-agent/instrumentation/beanshell-2.0/src/main/java/datadog/trace/instrumentation/beanshell/BeanShellInstrumentation.java index 2f2431f8c8a..f5c175ed041 100644 --- a/dd-java-agent/instrumentation/beanshell-2.0/src/main/java/datadog/trace/instrumentation/beanshell/BeanShellInstrumentation.java +++ b/dd-java-agent/instrumentation/beanshell-2.0/src/main/java/datadog/trace/instrumentation/beanshell/BeanShellInstrumentation.java @@ -73,10 +73,9 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("eval") .and(isMethod()) - .and( - takesArguments(2) - .and(takesArgument(0, String.class)) - .and(takesArgument(1, named("bsh.NameSpace")))), + .and(takesArguments(2) + .and(takesArgument(0, String.class)) + .and(takesArgument(1, named("bsh.NameSpace")))), BeanShellInstrumentation.class.getName() + "$StringEvalAdvice"); // bsh.Interpreter.eval(Reader, NameSpace, String): shared core reached by public eval(Reader). // Only reports when the caller supplied a tainted Reader; the Reader built internally by @@ -86,11 +85,10 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("eval") .and(isMethod()) - .and( - takesArguments(3) - .and(takesArgument(0, Reader.class)) - .and(takesArgument(1, named("bsh.NameSpace"))) - .and(takesArgument(2, String.class))), + .and(takesArguments(3) + .and(takesArgument(0, Reader.class)) + .and(takesArgument(1, named("bsh.NameSpace"))) + .and(takesArgument(2, String.class))), BeanShellInstrumentation.class.getName() + "$EvalAdvice"); // bsh.Remote.eval(String url, String text) transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseOnSubscribe.java b/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseOnSubscribe.java index ea0fa683725..a3a72e87272 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseOnSubscribe.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-2.0/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseOnSubscribe.java @@ -12,21 +12,20 @@ public class CouchbaseOnSubscribe extends TracedOnSubscribe { - private static final QualifiedClassNameCache NAMES = - new QualifiedClassNameCache( - new Function, CharSequence>() { - @Override - public String apply(Class input) { - StringBuilder builder = new StringBuilder(input.getSimpleName()); - int i; - while ((i = builder.indexOf("CouchbaseAsync")) != -1) - builder.delete(i, i + "CouchbaseAsync".length()); - while ((i = builder.indexOf("DefaultAsync")) != -1) - builder.delete(i, i + "DefaultAsync".length()); - return builder.toString(); - } - }, - Functions.PrefixJoin.of(".")); + private static final QualifiedClassNameCache NAMES = new QualifiedClassNameCache( + new Function, CharSequence>() { + @Override + public String apply(Class input) { + StringBuilder builder = new StringBuilder(input.getSimpleName()); + int i; + while ((i = builder.indexOf("CouchbaseAsync")) != -1) + builder.delete(i, i + "CouchbaseAsync".length()); + while ((i = builder.indexOf("DefaultAsync")) != -1) + builder.delete(i, i + "DefaultAsync".length()); + return builder.toString(); + } + }, + Functions.PrefixJoin.of(".")); private final String resourceName; private final String bucket; @@ -34,7 +33,8 @@ public String apply(Class input) { public CouchbaseOnSubscribe( final Observable originalObservable, final Method method, final String bucket) { super(originalObservable, CouchbaseClientDecorator.OPERATION_NAME, DECORATE); - resourceName = NAMES.getQualifiedName(method.getDeclaringClass(), method.getName()).toString(); + resourceName = + NAMES.getQualifiedName(method.getDeclaringClass(), method.getName()).toString(); this.bucket = bucket; } diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java b/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java index b708292cabf..1a7d6bdf9be 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java @@ -53,9 +53,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(named("encode")) .and(takesArguments(3)) - .and( - takesArgument( - 0, named("com.couchbase.client.deps.io.netty.channel.ChannelHandlerContext"))) + .and(takesArgument( + 0, named("com.couchbase.client.deps.io.netty.channel.ChannelHandlerContext"))) .and(takesArgument(2, named("java.util.List"))), CouchbaseNetworkInstrumentation.class.getName() + "$CouchbaseNetworkAdvice"); } diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/BaseRequestInstrumentation.java b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/BaseRequestInstrumentation.java index 5717db6a6f5..04f5a4f86e8 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/BaseRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/BaseRequestInstrumentation.java @@ -33,10 +33,9 @@ public String instrumentedType() { private static final Reference TRACING_IDENTIFIERS_REFERENCE = new Reference.Builder("com.couchbase.client.core.cnc.TracingIdentifiers").build(); - private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = - new Reference.Builder( - "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") - .build(); + private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = new Reference.Builder( + "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderAdvice.java b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderAdvice.java index 13359d7f116..ff9e06f89fe 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderAdvice.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderAdvice.java @@ -9,8 +9,7 @@ public class CoreEnvironmentBuilderAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void onExit(@Advice.This CoreEnvironment.Builder builder) { - builder.requestTracer( - new DatadogRequestTracer( - AgentTracer.get(), InstrumentationContext.get(Core.class, String.class))); + builder.requestTracer(new DatadogRequestTracer( + AgentTracer.get(), InstrumentationContext.get(Core.class, String.class))); } } diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderInstrumentation.java b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderInstrumentation.java index 35dbc6c6830..3c6e2574c43 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderInstrumentation.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreEnvironmentBuilderInstrumentation.java @@ -40,10 +40,9 @@ public String instrumentedType() { private static final Reference TRACING_IDENTIFIERS_REFERENCE = new Reference.Builder("com.couchbase.client.core.cnc.TracingIdentifiers").build(); - private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = - new Reference.Builder( - "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") - .build(); + private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = new Reference.Builder( + "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreInstrumentation.java b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreInstrumentation.java index 626bd31b9c4..fe678479595 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreInstrumentation.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/CoreInstrumentation.java @@ -23,10 +23,9 @@ public class CoreInstrumentation extends InstrumenterModule.Tracing private static final Reference TRACING_IDENTIFIERS_REFERENCE = new Reference.Builder("com.couchbase.client.core.cnc.TracingIdentifiers").build(); - private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = - new Reference.Builder( - "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") - .build(); + private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = new Reference.Builder( + "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") + .build(); public CoreInstrumentation() { super("couchbase"); diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/DefaultErrorUtilInstrumentation.java b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/DefaultErrorUtilInstrumentation.java index e70ee102936..302986d0f3e 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/DefaultErrorUtilInstrumentation.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-3.1/src/main/java/datadog/trace/instrumentation/couchbase_31/client/DefaultErrorUtilInstrumentation.java @@ -34,10 +34,9 @@ public String instrumentedType() { private static final Reference TRACING_IDENTIFIERS_REFERENCE = new Reference.Builder("com.couchbase.client.core.cnc.TracingIdentifiers").build(); - private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = - new Reference.Builder( - "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") - .build(); + private static final Reference SUSPICIOUS_EXPIRY_REFERENCE = new Reference.Builder( + "com.couchbase.client.core.cnc.events.request.SuspiciousExpiryDurationEvent") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/ConnectionStringHelper.java b/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/ConnectionStringHelper.java index cf7c75772a2..11c7c33210c 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/ConnectionStringHelper.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/ConnectionStringHelper.java @@ -10,12 +10,10 @@ public class ConnectionStringHelper { private static final DDCache CONNECTION_STRING_STRING_CACHE = DDCaches.newFixedSizeCache(8); - private static final Function ADDER = - cs -> - cs.hosts().stream() - .map(ConnectionString.UnresolvedSocket::hostname) - .distinct() - .collect(Collectors.joining(",")); + private static final Function ADDER = cs -> cs.hosts().stream() + .map(ConnectionString.UnresolvedSocket::hostname) + .distinct() + .collect(Collectors.joining(",")); public static String toHostPortList(final ConnectionString connectionString) { if (connectionString == null) { diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/CoreEnvironmentBuilderAdvice.java b/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/CoreEnvironmentBuilderAdvice.java index be0092c2873..4f202deff6c 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/CoreEnvironmentBuilderAdvice.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-3.2/src/main/java/datadog/trace/instrumentation/couchbase_32/client/CoreEnvironmentBuilderAdvice.java @@ -9,8 +9,7 @@ public class CoreEnvironmentBuilderAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void onExit(@Advice.This CoreEnvironment.Builder builder) { - builder.requestTracer( - new DatadogRequestTracer( - AgentTracer.get(), InstrumentationContext.get(Core.class, String.class))); + builder.requestTracer(new DatadogRequestTracer( + AgentTracer.get(), InstrumentationContext.get(Core.class, String.class))); } } diff --git a/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/InvokerInstrumentation.java b/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/InvokerInstrumentation.java index c1625b98746..97c2303c96b 100644 --- a/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/InvokerInstrumentation.java +++ b/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/InvokerInstrumentation.java @@ -59,10 +59,8 @@ public static ContextScope beforeInvoke(@Advice.Argument(0) final Exchange excha if (exchange == null || exchange.getInMessage() == null || AgentTracer.activeSpan() != null) { return null; } - final Object contextObj = - ServletHelper.getServletRequestAttribute( - exchange.getInMessage().get("HTTP.REQUEST"), - HttpServerDecorator.DD_CONTEXT_ATTRIBUTE); + final Object contextObj = ServletHelper.getServletRequestAttribute( + exchange.getInMessage().get("HTTP.REQUEST"), HttpServerDecorator.DD_CONTEXT_ATTRIBUTE); if (contextObj instanceof Context) { return ((Context) contextObj).attach(); } diff --git a/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/ServletHelper.java b/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/ServletHelper.java index adbd6eb4463..5c04d22d67d 100644 --- a/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/ServletHelper.java +++ b/dd-java-agent/instrumentation/cxf-2.1/src/main/java/datadog/trace/instrumentation/cxf/ServletHelper.java @@ -44,14 +44,13 @@ private static MethodHandle safelyUnreflectServletRequestAttributeGetter( } public static Object getServletRequestAttribute(final Object servletRequest, final String name) { - final MethodHandle mh = - JAVAX_SERVLET_REQUEST_CLASS != null - && JAVAX_SERVLET_REQUEST_CLASS.isInstance(servletRequest) - ? JAVAX_ATTRIBUTE_ACCESSOR - : JAKARTA_SERVLET_REQUEST_CLASS != null - && JAKARTA_SERVLET_REQUEST_CLASS.isInstance(servletRequest) - ? JAKARTA_ATTRIBUTE_ACCESSOR - : null; + final MethodHandle mh = JAVAX_SERVLET_REQUEST_CLASS != null + && JAVAX_SERVLET_REQUEST_CLASS.isInstance(servletRequest) + ? JAVAX_ATTRIBUTE_ACCESSOR + : JAKARTA_SERVLET_REQUEST_CLASS != null + && JAKARTA_SERVLET_REQUEST_CLASS.isInstance(servletRequest) + ? JAKARTA_ATTRIBUTE_ACCESSOR + : null; if (mh != null) { try { return mh.invoke(servletRequest, name); diff --git a/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/IastInstrumentation.java b/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/IastInstrumentation.java index fc5637527ec..b2e721cc331 100644 --- a/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/IastInstrumentation.java +++ b/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/IastInstrumentation.java @@ -58,10 +58,9 @@ protected Advices buildAdvices(final Iterable callSites) { if (Config.get().isIastHardcodedSecretEnabled()) { listeners.add(IastHardcodedSecretListener.INSTANCE); } - StratumManager stratumManager = - StratumManager.init( - Config.get().getIastSourceMappingMaxSize(), - IastInstrumentation::onSourceMappingLimitReached); + StratumManager stratumManager = StratumManager.init( + Config.get().getIastSourceMappingMaxSize(), + IastInstrumentation::onSourceMappingLimitReached); listeners.add(new StratumListener(stratumManager)); } return Advices.fromCallSites(callSites, listeners.toArray(new Listener[0])); diff --git a/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/SourceMapperImpl.java b/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/SourceMapperImpl.java index 349439662f7..8885e54ff1e 100644 --- a/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/SourceMapperImpl.java +++ b/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/main/java/datadog/trace/instrumentation/iastinstrumenter/SourceMapperImpl.java @@ -9,10 +9,9 @@ public class SourceMapperImpl implements SourceMapper { // This is only available if IAST source mapping is enabled - public static final SourceMapperImpl INSTANCE = - Config.get().isIastSourceMappingEnabled() - ? new SourceMapperImpl(StratumManager.getInstance()) - : null; + public static final SourceMapperImpl INSTANCE = Config.get().isIastSourceMappingEnabled() + ? new SourceMapperImpl(StratumManager.getInstance()) + : null; private final StratumManager stratumManager; diff --git a/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/test/java/OuterClass.java b/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/test/java/OuterClass.java index 443603df135..78dae765768 100644 --- a/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/test/java/OuterClass.java +++ b/dd-java-agent/instrumentation/datadog/asm/iast-instrumenter/src/test/java/OuterClass.java @@ -2,13 +2,12 @@ public class OuterClass { - public final long anonymous = - new Supplier() { - @Override - public Long get() { - return 1L; - } - }.get(); + public final long anonymous = new Supplier() { + @Override + public Long get() { + return 1L; + } + }.get(); public final InnerClass inner = new InnerClass(); diff --git a/dd-java-agent/instrumentation/datadog/profiling/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java b/dd-java-agent/instrumentation/datadog/profiling/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java index 42750e317ba..f4a42a274f0 100644 --- a/dd-java-agent/instrumentation/datadog/profiling/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java +++ b/dd-java-agent/instrumentation/datadog/profiling/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java @@ -56,10 +56,9 @@ public void methodAdvice(MethodTransformer transformer) { String adviceClassName = getClass().getName() + "$EnableWallclockSampling"; transformer.applyAdvice( isMethod() - .and( - named("run") - .and(isDeclaredBy(namedOneOf(RUNNABLE_EVENT_LOOPS))) - .and(takesNoArguments())), + .and(named("run") + .and(isDeclaredBy(namedOneOf(RUNNABLE_EVENT_LOOPS))) + .and(takesNoArguments())), adviceClassName); transformer.applyAdvice( isMethod() diff --git a/dd-java-agent/instrumentation/datadog/profiling/exception-profiling/src/test/java/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogramTest.java b/dd-java-agent/instrumentation/datadog/profiling/exception-profiling/src/test/java/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogramTest.java index f5823a5bebe..5f04458b0f8 100644 --- a/dd-java-agent/instrumentation/datadog/profiling/exception-profiling/src/test/java/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogramTest.java +++ b/dd-java-agent/instrumentation/datadog/profiling/exception-profiling/src/test/java/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionHistogramTest.java @@ -40,18 +40,17 @@ public class ExceptionHistogramTest { private static final IAttribute COUNT = Attribute.attr("count", "count", "Exception count", UnitLookup.NUMBER); - private static final Comparator EXCEPTION_COMPARATOR = - new Comparator() { - @Override - public int compare(final Exception e1, final Exception e2) { - return e1.getClass().getCanonicalName().compareTo(e2.getClass().getCanonicalName()); - } - - @Override - public boolean equals(final Object obj) { - return this == obj; - } - }; + private static final Comparator EXCEPTION_COMPARATOR = new Comparator() { + @Override + public int compare(final Exception e1, final Exception e2) { + return e1.getClass().getCanonicalName().compareTo(e2.getClass().getCanonicalName()); + } + + @Override + public boolean equals(final Object obj) { + return this == obj; + } + }; private static final int MAX_ITEMS = 2; private static final int MAX_SIZE = 2; @@ -90,16 +89,13 @@ public void tearDown() { public void testFirstHitConcurrent() { Phaser phaser = new Phaser(2); - ExceptionHistogram histogram = - ExceptionHistogramTestBridge.create( - Config.get(), - () -> { - // below code is executed after emitEvents() returns: - // #1 - histo sums are reset but 0 entries not removed yet - phaser.arriveAndAwaitAdvance(); - // #2 - safe to leave the emit() method - phaser.arriveAndAwaitAdvance(); - }); + ExceptionHistogram histogram = ExceptionHistogramTestBridge.create(Config.get(), () -> { + // below code is executed after emitEvents() returns: + // #1 - histo sums are reset but 0 entries not removed yet + phaser.arriveAndAwaitAdvance(); + // #2 - safe to leave the emit() method + phaser.arriveAndAwaitAdvance(); + }); // don't want the JFR integration active here ExceptionHistogramTestBridge.deregister(histogram); for (int i = 0; i < 5; i++) { @@ -124,14 +120,13 @@ public void testFirstHitConcurrent() { @Test public void testExceptionsRecorded() throws IOException, CouldNotLoadRecordingException, InterruptedException { - writeExceptions( - ImmutableMap.of( - new NullPointerException(), - 8, - new IllegalArgumentException(), - 5, - new RuntimeException(), - 1)); + writeExceptions(ImmutableMap.of( + new NullPointerException(), + 8, + new IllegalArgumentException(), + 5, + new RuntimeException(), + 1)); final Instant firstRecordingNow = Instant.now(); snapshot = FlightRecorder.getFlightRecorder().takeSnapshot(); @@ -155,14 +150,13 @@ public void testExceptionsRecorded() // Sleep to make sure we get new batch of exceptions only Thread.sleep(1000); - writeExceptions( - ImmutableMap.of( - new RuntimeException(), - 8, - new NullPointerException(), - 5, - new IllegalArgumentException(), - 1)); + writeExceptions(ImmutableMap.of( + new RuntimeException(), + 8, + new NullPointerException(), + 5, + new IllegalArgumentException(), + 1)); snapshot = FlightRecorder.getFlightRecorder().takeSnapshot(); final IItemCollection secondRecording = @@ -195,18 +189,17 @@ public void testHistogramSizeIsLimited() instance = ExceptionHistogramTestBridge.create(Config.get(properties)); // Exceptions are written in alphabetical order - writeExceptions( - ImmutableSortedMap.copyOf( - ImmutableMap.of( - new Exception(), - 5, - new IllegalArgumentException(), - 8, - new NegativeArraySizeException(), - 10, - new NullPointerException(), - 11), - EXCEPTION_COMPARATOR)); + writeExceptions(ImmutableSortedMap.copyOf( + ImmutableMap.of( + new Exception(), + 5, + new IllegalArgumentException(), + 8, + new NegativeArraySizeException(), + 10, + new NullPointerException(), + 11), + EXCEPTION_COMPARATOR)); final Instant firstRecordingNow = Instant.now(); snapshot = FlightRecorder.getFlightRecorder().takeSnapshot(); @@ -237,24 +230,24 @@ public void testHistogramSizeIsLimited() Thread.sleep(1000); // Exceptions are written in 'code' order - writeExceptions( - ImmutableSortedMap.copyOf( - ImmutableMap.of( - new IllegalArgumentException(), - 5, - new NegativeArraySizeException(), - 8, - new NullPointerException(), - 10, - new RuntimeException(), - 11), - EXCEPTION_COMPARATOR)); + writeExceptions(ImmutableSortedMap.copyOf( + ImmutableMap.of( + new IllegalArgumentException(), + 5, + new NegativeArraySizeException(), + 8, + new NullPointerException(), + 10, + new RuntimeException(), + 11), + EXCEPTION_COMPARATOR)); snapshot = FlightRecorder.getFlightRecorder().takeSnapshot(); final IItemCollection secondRecording = getEvents(snapshot, firstRecordingNow.plusMillis(1000), Instant.MAX); - assertEquals(MAX_ITEMS + 1, secondRecording.getAggregate(Aggregators.count()).longValue()); + assertEquals( + MAX_ITEMS + 1, secondRecording.getAggregate(Aggregators.count()).longValue()); assertEquals( 5, secondRecording @@ -279,14 +272,13 @@ public void testHistogramSizeIsLimited() @Test public void testDisabled() throws IOException, CouldNotLoadRecordingException { recording.disable("datadog.ExceptionCount"); - final Map exceptions = - ImmutableMap.of( - new NullPointerException(), - 8, - new IllegalArgumentException(), - 5, - new RuntimeException(), - 1); + final Map exceptions = ImmutableMap.of( + new NullPointerException(), + 8, + new IllegalArgumentException(), + 5, + new RuntimeException(), + 1); for (final Map.Entry entry : exceptions.entrySet()) { for (int i = 0; i < entry.getValue(); i++) { diff --git a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationsInstrumentation.java b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationsInstrumentation.java index 56b2c6dcacd..fcfddc22908 100644 --- a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationsInstrumentation.java +++ b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAnnotationsInstrumentation.java @@ -37,13 +37,12 @@ static Set loadAnnotations() { annotations.add("datadog.trace.api.Trace"); final String configString = InstrumenterConfig.get().getTraceAnnotations(); if (configString == null) { - annotations.addAll( - Arrays.asList( - "com.newrelic.api.agent.Trace", - "kamon.annotation.Trace", - "com.tracelytics.api.ext.LogMethod", - "io.opentracing.contrib.dropwizard.Trace", - "org.springframework.cloud.sleuth.annotation.NewSpan")); + annotations.addAll(Arrays.asList( + "com.newrelic.api.agent.Trace", + "kamon.annotation.Trace", + "com.tracelytics.api.ext.LogMethod", + "io.opentracing.contrib.dropwizard.Trace", + "org.springframework.cloud.sleuth.annotation.NewSpan")); } else if (!configString.matches(CONFIG_FORMAT)) { LoggerFactory.getLogger(TraceAnnotationsInstrumentation.class) .warn( diff --git a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java index c60d6458496..26093041f19 100644 --- a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java +++ b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java @@ -95,15 +95,13 @@ public void methodAdvice(MethodTransformer transformer) { } ElementMatcher methodFilter; if (hasWildcard) { - methodFilter = - not( - isHashCode() - .or(isEquals()) - .or(isToString()) - .or(isFinalizer()) - .or(isGetter()) - .or(isSetter()) - .or(isSynthetic())); + methodFilter = not(isHashCode() + .or(isEquals()) + .or(isToString()) + .or(isFinalizer()) + .or(isGetter()) + .or(isSetter()) + .or(isSynthetic())); } else { methodFilter = namedOneOf(methodNames); } diff --git a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java index 34311bf4c23..7c803f5fbf5 100644 --- a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java +++ b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java @@ -82,10 +82,9 @@ public AgentSpan startMethodSpan(Method method) { resourceName = spanNameForMethod(method); } - AgentSpan span = - noParent - ? startSpan(INSTRUMENTATION_NAME, operationName, null) - : startSpan(INSTRUMENTATION_NAME, operationName); + AgentSpan span = noParent + ? startSpan(INSTRUMENTATION_NAME, operationName, null) + : startSpan(INSTRUMENTATION_NAME, operationName); afterStart(span); span.setResourceName(resourceName); diff --git a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/java/dd/test/trace/annotation/SayTracedHello.java b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/java/dd/test/trace/annotation/SayTracedHello.java index 24c4468ec9e..37100be9421 100644 --- a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/java/dd/test/trace/annotation/SayTracedHello.java +++ b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/java/dd/test/trace/annotation/SayTracedHello.java @@ -79,15 +79,14 @@ public static String sayERRORWithResource() { @Trace public static CompletableFuture sayHelloFuture(CountDownLatch latch) { activeSpan().setTag(DDTags.SERVICE_NAME, "test"); - return CompletableFuture.supplyAsync( - () -> { - try { - latch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return "hello!"; - }); + return CompletableFuture.supplyAsync(() -> { + try { + latch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return "hello!"; + }); } public static String fromCallable() throws Exception { diff --git a/dd-java-agent/instrumentation/datanucleus-4.0.5/src/main/java/datadog/trace/instrumentation/datanucleus/JDOQueryInstrumentation.java b/dd-java-agent/instrumentation/datanucleus-4.0.5/src/main/java/datadog/trace/instrumentation/datanucleus/JDOQueryInstrumentation.java index abd3fb76f1c..dbeb14dafcc 100644 --- a/dd-java-agent/instrumentation/datanucleus-4.0.5/src/main/java/datadog/trace/instrumentation/datanucleus/JDOQueryInstrumentation.java +++ b/dd-java-agent/instrumentation/datanucleus-4.0.5/src/main/java/datadog/trace/instrumentation/datanucleus/JDOQueryInstrumentation.java @@ -32,18 +32,17 @@ public void methodAdvice(MethodTransformer transformer) { // *Internal() to futureproof the instrumentation transformer.applyAdvice( isMethod() - .and( - namedOneOf( - "execute", - "executeInternal", - "executeList", - "executeResultList", - "executeResultUnique", - "executeUnique", - "executeWithArray", - "executeWithMap", - "deletePersistentAll", - "deletePersistentInternal")), + .and(namedOneOf( + "execute", + "executeInternal", + "executeList", + "executeResultList", + "executeResultUnique", + "executeUnique", + "executeWithArray", + "executeWithMap", + "deletePersistentAll", + "deletePersistentInternal")), JDOQueryInstrumentation.class.getName() + "$QueryAdvice"); } @@ -55,10 +54,9 @@ public static AgentScope startExecute(@Advice.Origin("#m") final String methodNa return null; } - final AgentSpan span = - methodName.startsWith("execute") - ? startSpan(JAVA_DATANUCLEUS.toString(), DATANUCLEUS_QUERY_EXECUTE) - : startSpan(JAVA_DATANUCLEUS.toString(), DATANUCLEUS_QUERY_DELETE); + final AgentSpan span = methodName.startsWith("execute") + ? startSpan(JAVA_DATANUCLEUS.toString(), DATANUCLEUS_QUERY_EXECUTE) + : startSpan(JAVA_DATANUCLEUS.toString(), DATANUCLEUS_QUERY_DELETE); DECORATE.afterStart(span); @@ -80,10 +78,9 @@ public static void endExecute( AgentSpan span = scope.span(); // candidateClass is set internally and is not always in sync with candidateClassName - String candidateClassName = - internalQuery.getCandidateClass() != null - ? internalQuery.getCandidateClass().getName() - : internalQuery.getCandidateClassName(); + String candidateClassName = internalQuery.getCandidateClass() != null + ? internalQuery.getCandidateClass().getName() + : internalQuery.getCandidateClassName(); DECORATE.setResourceFromIdOrClass(span, null, candidateClassName); DECORATE.onError(span, throwable); diff --git a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java index f46dc18f3f3..ae0dae226df 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java +++ b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java @@ -68,10 +68,9 @@ public static void injectTracingSession(@Advice.Return(readOnly = false) Session if (session.getClass().getName().endsWith("cassandra.TracingSession")) { return; } - session = - new TracingSession( - session, - InstrumentationContext.get(Cluster.class, String.class).get(session.getCluster())); + session = new TracingSession( + session, + InstrumentationContext.get(Cluster.class, String.class).get(session.getCluster())); } } } diff --git a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/ContactPointsUtil.java b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/ContactPointsUtil.java index ff2c27465e2..5f7e74abcb4 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/ContactPointsUtil.java +++ b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra/ContactPointsUtil.java @@ -13,15 +13,12 @@ public class ContactPointsUtil { DDCaches.newFixedSizeCache(8); private static final Function, String> ADDER = - inetSocketAddresses -> - inetSocketAddresses.stream() - .map( - inetSocketAddress -> - inetSocketAddress.getPort() > 0 - ? inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort() - : inetSocketAddress.getHostString()) - .distinct() - .collect(Collectors.joining(",")); + inetSocketAddresses -> inetSocketAddresses.stream() + .map(inetSocketAddress -> inetSocketAddress.getPort() > 0 + ? inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort() + : inetSocketAddress.getHostString()) + .distinct() + .collect(Collectors.joining(",")); public static String fromInetSocketList(@Nullable final List contactPoints) { if (contactPoints == null) { diff --git a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.8/src/main/java/datadog/trace/instrumentation/datastax/cassandra38/ContactPointsUtil.java b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.8/src/main/java/datadog/trace/instrumentation/datastax/cassandra38/ContactPointsUtil.java index d045a517e86..677325d35d6 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.8/src/main/java/datadog/trace/instrumentation/datastax/cassandra38/ContactPointsUtil.java +++ b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-3.8/src/main/java/datadog/trace/instrumentation/datastax/cassandra38/ContactPointsUtil.java @@ -12,17 +12,13 @@ public class ContactPointsUtil { private static final DDCache, String> CONTACT_POINT_CACHE = DDCaches.newFixedSizeCache(8); - private static final Function, String> ADDER = - endPoints -> - endPoints.stream() - .map(EndPoint::resolve) - .map( - inetSocketAddress -> - inetSocketAddress.getPort() > 0 - ? inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort() - : inetSocketAddress.getHostString()) - .distinct() // avoid duplicates - .collect(Collectors.joining(",")); + private static final Function, String> ADDER = endPoints -> endPoints.stream() + .map(EndPoint::resolve) + .map(inetSocketAddress -> inetSocketAddress.getPort() > 0 + ? inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort() + : inetSocketAddress.getHostString()) + .distinct() // avoid duplicates + .collect(Collectors.joining(",")); public static String fromEndPointList(@Nullable final List contactPoints) { if (contactPoints == null) { diff --git a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/CassandraClientAdvice.java b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/CassandraClientAdvice.java index d43ff39d1a1..14e4430a649 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/CassandraClientAdvice.java +++ b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/CassandraClientAdvice.java @@ -16,9 +16,8 @@ public static void injectTracingSession( // Change CompletingStage to CompletingStage // The TracingSession wrapper includes span start/stop - completionStage = - completionStage.thenCombine( - CompletableFuture.completedFuture(ContactPointsUtil.fromEndPointSet(contactPoints)), - TracingSession::new); + completionStage = completionStage.thenCombine( + CompletableFuture.completedFuture(ContactPointsUtil.fromEndPointSet(contactPoints)), + TracingSession::new); } } diff --git a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/ContactPointsUtil.java b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/ContactPointsUtil.java index bb72201069b..81e218b710c 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/ContactPointsUtil.java +++ b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/ContactPointsUtil.java @@ -13,21 +13,18 @@ public class ContactPointsUtil { private static final DDCache, String> CONTACT_POINT_CACHE = DDCaches.newFixedSizeCache(8); - private static final Function, String> ADDER = - endPoints -> - endPoints.stream() - .map(EndPoint::resolve) - .filter(InetSocketAddress.class::isInstance) - .map(InetSocketAddress.class::cast) - .map( - inetSocketAddress -> { - if (inetSocketAddress.getPort() > 0) { - return inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort(); - } - return inetSocketAddress.getHostString(); - }) - .distinct() // avoid duplicates - .collect(Collectors.joining(",")); + private static final Function, String> ADDER = endPoints -> endPoints.stream() + .map(EndPoint::resolve) + .filter(InetSocketAddress.class::isInstance) + .map(InetSocketAddress.class::cast) + .map(inetSocketAddress -> { + if (inetSocketAddress.getPort() > 0) { + return inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort(); + } + return inetSocketAddress.getHostString(); + }) + .distinct() // avoid duplicates + .collect(Collectors.joining(",")); public static String fromEndPointSet(@Nullable final Set contactPoints) { if (contactPoints == null) { diff --git a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/TracingSession.java b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/TracingSession.java index 23cdb14b3d2..cad0045cec9 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/TracingSession.java +++ b/dd-java-agent/instrumentation/datastax-cassandra/datastax-cassandra-4.0/src/main/java/datadog/trace/instrumentation/datastax/cassandra4/TracingSession.java @@ -90,18 +90,17 @@ private CompletionStage wrapAsyncRequest(Statement request) { CompletionStage completionStage = getDelegate().execute(request, Statement.ASYNC); - return completionStage.whenComplete( - (result, throwable) -> { - if (result != null) { - DECORATE.onResponse(span, result); - } - - if (throwable instanceof CompletionException) { - throwable = throwable.getCause(); - } - DECORATE.onError(span, throwable); - span.finish(); - }); + return completionStage.whenComplete((result, throwable) -> { + if (result != null) { + DECORATE.onResponse(span, result); + } + + if (throwable instanceof CompletionException) { + throwable = throwable.getCause(); + } + DECORATE.onError(span, throwable); + span.finish(); + }); } } diff --git a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-common/src/main/java/datadog/trace/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-common/src/main/java/datadog/trace/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java index 951967e2ec4..ec1d046cd1e 100644 --- a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-common/src/main/java/datadog/trace/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java +++ b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-common/src/main/java/datadog/trace/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java @@ -23,9 +23,8 @@ public class ElasticsearchRestClientDecorator extends DBTypeProcessingDatabaseCl private static final String SERVICE_NAME = SpanNaming.instance().namingSchema().database().service("elasticsearch"); - public static final CharSequence OPERATION_NAME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().database().operation("elasticsearch.rest")); + public static final CharSequence OPERATION_NAME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().database().operation("elasticsearch.rest")); public static final CharSequence ELASTICSEARCH_JAVA = UTF8BytesString.create("elasticsearch-java"); diff --git a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.0/src/main/java/datadog/trace/instrumentation/elasticsearch5/TransportActionListener.java b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.0/src/main/java/datadog/trace/instrumentation/elasticsearch5/TransportActionListener.java index 826cb940e37..954d903942a 100644 --- a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.0/src/main/java/datadog/trace/instrumentation/elasticsearch5/TransportActionListener.java +++ b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.0/src/main/java/datadog/trace/instrumentation/elasticsearch5/TransportActionListener.java @@ -81,7 +81,8 @@ public void onResponse(final T response) { } if (response instanceof IndexResponse) { - span.setTag("elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); + span.setTag( + "elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); } if (response instanceof BulkShardResponse) { diff --git a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.3/src/main/java/datadog/trace/instrumentation/elasticsearch5_3/TransportActionListener.java b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.3/src/main/java/datadog/trace/instrumentation/elasticsearch5_3/TransportActionListener.java index f3d0e613650..c2ebb58c756 100644 --- a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.3/src/main/java/datadog/trace/instrumentation/elasticsearch5_3/TransportActionListener.java +++ b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-5.3/src/main/java/datadog/trace/instrumentation/elasticsearch5_3/TransportActionListener.java @@ -79,7 +79,8 @@ public void onResponse(final T response) { } if (response instanceof IndexResponse) { - span.setTag("elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); + span.setTag( + "elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); } if (response instanceof BulkShardResponse) { diff --git a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-6.0/src/main/java/datadog/trace/instrumentation/elasticsearch6/TransportActionListener.java b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-6.0/src/main/java/datadog/trace/instrumentation/elasticsearch6/TransportActionListener.java index da6c206ba11..77f080b14bd 100644 --- a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-6.0/src/main/java/datadog/trace/instrumentation/elasticsearch6/TransportActionListener.java +++ b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-6.0/src/main/java/datadog/trace/instrumentation/elasticsearch6/TransportActionListener.java @@ -80,7 +80,8 @@ public void onResponse(final T response) { } if (response instanceof IndexResponse) { - span.setTag("elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); + span.setTag( + "elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); } if (response instanceof BulkShardResponse) { diff --git a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-7.3/src/main/java/datadog/trace/instrumentation/elasticsearch7_3/TransportActionListener.java b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-7.3/src/main/java/datadog/trace/instrumentation/elasticsearch7_3/TransportActionListener.java index e2cdff49789..523f9e938a0 100644 --- a/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-7.3/src/main/java/datadog/trace/instrumentation/elasticsearch7_3/TransportActionListener.java +++ b/dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-7.3/src/main/java/datadog/trace/instrumentation/elasticsearch7_3/TransportActionListener.java @@ -77,7 +77,8 @@ public void onResponse(final T response) { } if (response instanceof IndexResponse) { - span.setTag("elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); + span.setTag( + "elasticsearch.response.status", ((IndexResponse) response).status().getStatus()); } if (response instanceof BulkShardResponse) { diff --git a/dd-java-agent/instrumentation/gax-1.4/src/test/java/datadog/trace/instrumentation/gax/GaxRetryContinuationTest.java b/dd-java-agent/instrumentation/gax-1.4/src/test/java/datadog/trace/instrumentation/gax/GaxRetryContinuationTest.java index f70f1b6280e..067d7e22088 100644 --- a/dd-java-agent/instrumentation/gax-1.4/src/test/java/datadog/trace/instrumentation/gax/GaxRetryContinuationTest.java +++ b/dd-java-agent/instrumentation/gax-1.4/src/test/java/datadog/trace/instrumentation/gax/GaxRetryContinuationTest.java @@ -66,17 +66,15 @@ void singleAttemptSucceedsAndContextNotLeaked() throws Exception { new ScheduledRetryingExecutor<>(retryAlgorithm(3), scheduler); AgentSpan parent = startSpan("gax", "publish"); CountDownLatch allAttemptsDone = new CountDownLatch(1); - RetryingFuture future = - executor.createFuture( - () -> { - AgentSpan attempt = startSpan("gax", "attempt"); - try { - return "ok"; - } finally { - attempt.finish(); - allAttemptsDone.countDown(); - } - }); + RetryingFuture future = executor.createFuture(() -> { + AgentSpan attempt = startSpan("gax", "attempt"); + try { + return "ok"; + } finally { + attempt.finish(); + allAttemptsDone.countDown(); + } + }); try (ContextScope scope = activateSpan(parent)) { future.setAttemptFuture(executor.submit(future)); @@ -84,11 +82,10 @@ void singleAttemptSucceedsAndContextNotLeaked() throws Exception { } allAttemptsDone.await(5, TimeUnit.SECONDS); parent.finish(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("publish"), - span().childOf(parent.getSpanId()).operationName("attempt"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("publish"), + span().childOf(parent.getSpanId()).operationName("attempt"))); } finally { scheduler.shutdownNow(); } @@ -103,20 +100,18 @@ void retriedAttemptsSucceedAndContextNotLeaked() throws Exception { AtomicInteger count = new AtomicInteger(0); AgentSpan parent = startSpan("gax", "publish"); CountDownLatch allAttemptsDone = new CountDownLatch(3); - RetryingFuture future = - executor.createFuture( - () -> { - AgentSpan attempt = startSpan("gax", "attempt"); - try { - if (count.incrementAndGet() < 3) { - throw new RuntimeException("transient"); - } - return "ok"; - } finally { - attempt.finish(); - allAttemptsDone.countDown(); - } - }); + RetryingFuture future = executor.createFuture(() -> { + AgentSpan attempt = startSpan("gax", "attempt"); + try { + if (count.incrementAndGet() < 3) { + throw new RuntimeException("transient"); + } + return "ok"; + } finally { + attempt.finish(); + allAttemptsDone.countDown(); + } + }); try (ContextScope scope = activateSpan(parent)) { future.setAttemptFuture(executor.submit(future)); @@ -124,13 +119,12 @@ void retriedAttemptsSucceedAndContextNotLeaked() throws Exception { } allAttemptsDone.await(5, TimeUnit.SECONDS); parent.finish(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("publish"), - span().childOf(parent.getSpanId()).operationName("attempt"), - span().childOf(parent.getSpanId()).operationName("attempt"), - span().childOf(parent.getSpanId()).operationName("attempt"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("publish"), + span().childOf(parent.getSpanId()).operationName("attempt"), + span().childOf(parent.getSpanId()).operationName("attempt"), + span().childOf(parent.getSpanId()).operationName("attempt"))); } finally { scheduler.shutdownNow(); } @@ -144,17 +138,15 @@ void exhaustedRetriesContextNotLeaked() throws Exception { new ScheduledRetryingExecutor<>(retryAlgorithm(3), scheduler); AgentSpan parent = startSpan("gax", "publish"); CountDownLatch allAttemptsDone = new CountDownLatch(3); - RetryingFuture future = - executor.createFuture( - () -> { - AgentSpan attempt = startSpan("gax", "attempt"); - try { - throw new RuntimeException("always fails"); - } finally { - attempt.finish(); - allAttemptsDone.countDown(); - } - }); + RetryingFuture future = executor.createFuture(() -> { + AgentSpan attempt = startSpan("gax", "attempt"); + try { + throw new RuntimeException("always fails"); + } finally { + attempt.finish(); + allAttemptsDone.countDown(); + } + }); try (ContextScope scope = activateSpan(parent)) { future.setAttemptFuture(executor.submit(future)); @@ -162,30 +154,28 @@ void exhaustedRetriesContextNotLeaked() throws Exception { } allAttemptsDone.await(5, TimeUnit.SECONDS); parent.finish(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("publish"), - span().childOf(parent.getSpanId()).operationName("attempt"), - span().childOf(parent.getSpanId()).operationName("attempt"), - span().childOf(parent.getSpanId()).operationName("attempt"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("publish"), + span().childOf(parent.getSpanId()).operationName("attempt"), + span().childOf(parent.getSpanId()).operationName("attempt"), + span().childOf(parent.getSpanId()).operationName("attempt"))); } finally { scheduler.shutdownNow(); } } private static RetryAlgorithm retryAlgorithm(int maxAttempts) { - RetrySettings settings = - RetrySettings.newBuilder() - .setMaxAttempts(maxAttempts) - .setInitialRetryDelay(Duration.ofMillis(1)) - .setRetryDelayMultiplier(1.0) - .setMaxRetryDelay(Duration.ofMillis(10)) - .setInitialRpcTimeout(Duration.ofSeconds(5)) - .setRpcTimeoutMultiplier(1.0) - .setMaxRpcTimeout(Duration.ofSeconds(5)) - .setTotalTimeout(Duration.ofSeconds(30)) - .build(); + RetrySettings settings = RetrySettings.newBuilder() + .setMaxAttempts(maxAttempts) + .setInitialRetryDelay(Duration.ofMillis(1)) + .setRetryDelayMultiplier(1.0) + .setMaxRetryDelay(Duration.ofMillis(10)) + .setInitialRpcTimeout(Duration.ofSeconds(5)) + .setRpcTimeoutMultiplier(1.0) + .setMaxRpcTimeout(Duration.ofSeconds(5)) + .setTotalTimeout(Duration.ofSeconds(30)) + .build(); ApiClock clock = NanoClock.getDefaultClock(); return new RetryAlgorithm<>( new BasicResultRetryAlgorithm<>(), new ExponentialRetryAlgorithm(settings, clock)); diff --git a/dd-java-agent/instrumentation/glassfish-3.0/src/test/groovy/TestServlets.java b/dd-java-agent/instrumentation/glassfish-3.0/src/test/groovy/TestServlets.java index d324550d452..e065abdb4ea 100644 --- a/dd-java-agent/instrumentation/glassfish-3.0/src/test/groovy/TestServlets.java +++ b/dd-java-agent/instrumentation/glassfish-3.0/src/test/groovy/TestServlets.java @@ -29,16 +29,14 @@ public static class Success extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) { final HttpServerTest.ServerEndpoint endpoint = HttpServerTest.ServerEndpoint.forPath(req.getServletPath()); - HttpServerTest.controller( - endpoint, - new Closure(null) { - public Object doCall() throws Exception { - resp.setContentType("text/plain"); - resp.setStatus(endpoint.getStatus()); - resp.getWriter().print(endpoint.getBody()); - return null; - } - }); + HttpServerTest.controller(endpoint, new Closure(null) { + public Object doCall() throws Exception { + resp.setContentType("text/plain"); + resp.setStatus(endpoint.getStatus()); + resp.getWriter().print(endpoint.getBody()); + return null; + } + }); } } @@ -48,16 +46,14 @@ public static class Forwarded extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) { final HttpServerTest.ServerEndpoint endpoint = HttpServerTest.ServerEndpoint.forPath(req.getServletPath()); - HttpServerTest.controller( - endpoint, - new Closure(null) { - public Object doCall() throws Exception { - resp.setContentType("text/plain"); - resp.setStatus(endpoint.getStatus()); - resp.getWriter().print(req.getHeader("x-forwarded-for")); - return null; - } - }); + HttpServerTest.controller(endpoint, new Closure(null) { + public Object doCall() throws Exception { + resp.setContentType("text/plain"); + resp.setStatus(endpoint.getStatus()); + resp.getWriter().print(req.getHeader("x-forwarded-for")); + return null; + } + }); } } @@ -65,16 +61,14 @@ public Object doCall() throws Exception { public static class BodyUrlEncoded extends HttpServlet { @Override protected void service(final HttpServletRequest req, final HttpServletResponse resp) { - HttpServerTest.controller( - HttpServerTest.ServerEndpoint.BODY_URLENCODED, - new Closure(null) { - public Object doCall() throws Exception { - resp.setContentType("text/plain"); - resp.setStatus(HttpServerTest.ServerEndpoint.BODY_URLENCODED.getStatus()); - resp.getWriter().print("[a:" + Arrays.asList(req.getParameterValues("a")) + "]"); - return null; - } - }); + HttpServerTest.controller(HttpServerTest.ServerEndpoint.BODY_URLENCODED, new Closure(null) { + public Object doCall() throws Exception { + resp.setContentType("text/plain"); + resp.setStatus(HttpServerTest.ServerEndpoint.BODY_URLENCODED.getStatus()); + resp.getWriter().print("[a:" + Arrays.asList(req.getParameterValues("a")) + "]"); + return null; + } + }); } } @@ -84,16 +78,14 @@ public static class Query extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) { final HttpServerTest.ServerEndpoint endpoint = HttpServerTest.ServerEndpoint.forPath(req.getServletPath()); - HttpServerTest.controller( - endpoint, - new Closure(null) { - public Object doCall() throws Exception { - resp.setContentType("text/plain"); - resp.setStatus(endpoint.getStatus()); - resp.getWriter().print(endpoint.getBody()); - return null; - } - }); + HttpServerTest.controller(endpoint, new Closure(null) { + public Object doCall() throws Exception { + resp.setContentType("text/plain"); + resp.setStatus(endpoint.getStatus()); + resp.getWriter().print(endpoint.getBody()); + return null; + } + }); } } @@ -103,14 +95,12 @@ public static class Redirect extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) { final HttpServerTest.ServerEndpoint endpoint = HttpServerTest.ServerEndpoint.forPath(req.getServletPath()); - HttpServerTest.controller( - endpoint, - new Closure(null) { - public Object doCall() throws Exception { - resp.sendRedirect(endpoint.getBody()); - return null; - } - }); + HttpServerTest.controller(endpoint, new Closure(null) { + public Object doCall() throws Exception { + resp.sendRedirect(endpoint.getBody()); + return null; + } + }); } } @@ -120,15 +110,13 @@ public static class Error extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) { final HttpServerTest.ServerEndpoint endpoint = HttpServerTest.ServerEndpoint.forPath(req.getServletPath()); - HttpServerTest.controller( - endpoint, - new Closure(null) { - public Object doCall() throws Exception { - resp.setContentType("text/plain"); - resp.sendError(endpoint.getStatus(), endpoint.getBody()); - return null; - } - }); + HttpServerTest.controller(endpoint, new Closure(null) { + public Object doCall() throws Exception { + resp.setContentType("text/plain"); + resp.sendError(endpoint.getStatus(), endpoint.getBody()); + return null; + } + }); } } @@ -138,13 +126,11 @@ public static class ExceptionServlet extends HttpServlet { protected void service(final HttpServletRequest req, final HttpServletResponse resp) { final HttpServerTest.ServerEndpoint endpoint = HttpServerTest.ServerEndpoint.forPath(req.getServletPath()); - HttpServerTest.controller( - endpoint, - new Closure(null) { - public Object doCall() throws Exception { - throw new Exception(endpoint.getBody()); - } - }); + HttpServerTest.controller(endpoint, new Closure(null) { + public Object doCall() throws Exception { + throw new Exception(endpoint.getBody()); + } + }); } } @@ -152,16 +138,13 @@ public Object doCall() throws Exception { public static class CreatedServlet extends HttpServlet { @Override protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) { - controller( - CREATED, - new Closure(this) { - public Object doCall() throws IOException { - resp.setStatus(CREATED.getStatus()); - resp.getWriter() - .print(CREATED.getBody() + ": " + CharStreams.toString(req.getReader())); - return null; - } - }); + controller(CREATED, new Closure(this) { + public Object doCall() throws IOException { + resp.setStatus(CREATED.getStatus()); + resp.getWriter().print(CREATED.getBody() + ": " + CharStreams.toString(req.getReader())); + return null; + } + }); } } @@ -169,20 +152,17 @@ public Object doCall() throws IOException { public static class CreatedISServlet extends HttpServlet { @Override protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) { - controller( - CREATED_IS, - new Closure(this) { - public Object doCall() throws IOException { - resp.setStatus(CREATED_IS.getStatus()); - resp.getWriter() - .print( - CREATED_IS.getBody() - + ": " - + CharStreams.toString( - new InputStreamReader(req.getInputStream(), StandardCharsets.UTF_8))); - return null; - } - }); + controller(CREATED_IS, new Closure(this) { + public Object doCall() throws IOException { + resp.setStatus(CREATED_IS.getStatus()); + resp.getWriter() + .print(CREATED_IS.getBody() + + ": " + + CharStreams.toString( + new InputStreamReader(req.getInputStream(), StandardCharsets.UTF_8))); + return null; + } + }); } } diff --git a/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PubSubDecorator.java b/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PubSubDecorator.java index 8e64b96ea44..9fb1d098c99 100644 --- a/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PubSubDecorator.java +++ b/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PubSubDecorator.java @@ -48,12 +48,10 @@ public CharSequence apply(CharSequence input) { private static final String PUBSUB = "google-pubsub"; public static final CharSequence JAVA_PUBSUB = UTF8BytesString.create("java-google-pubsub"); - public static final CharSequence PUBSUB_CONSUME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation(PUBSUB)); - public static final CharSequence PUBSUB_PRODUCE = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().outboundOperation(PUBSUB)); + public static final CharSequence PUBSUB_CONSUME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation(PUBSUB)); + public static final CharSequence PUBSUB_PRODUCE = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().outboundOperation(PUBSUB)); private static final DDCache TOPIC_NAME_CACHE = DDCaches.newFixedSizeCache(32); @@ -73,23 +71,21 @@ public CharSequence apply(CharSequence input) { private static final Function SUBSCRIPTION_EXTRACTION_FUNCTION = new RegexExtractor("^projects/(.+)/subscriptions/(.+)$", 2).andThen(UTF8BytesString::create); - public static final PubSubDecorator PRODUCER_DECORATE = - new PubSubDecorator( - Tags.SPAN_KIND_PRODUCER, - InternalSpanTypes.MESSAGE_PRODUCER, - SpanNaming.instance() - .namingSchema() - .messaging() - .outboundService(PUBSUB, Config.get().isGooglePubSubLegacyTracingEnabled())); - - public static final PubSubDecorator CONSUMER_DECORATE = - new PubSubDecorator( - Tags.SPAN_KIND_CONSUMER, - InternalSpanTypes.MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService(PUBSUB, Config.get().isGooglePubSubLegacyTracingEnabled())); + public static final PubSubDecorator PRODUCER_DECORATE = new PubSubDecorator( + Tags.SPAN_KIND_PRODUCER, + InternalSpanTypes.MESSAGE_PRODUCER, + SpanNaming.instance() + .namingSchema() + .messaging() + .outboundService(PUBSUB, Config.get().isGooglePubSubLegacyTracingEnabled())); + + public static final PubSubDecorator CONSUMER_DECORATE = new PubSubDecorator( + Tags.SPAN_KIND_CONSUMER, + InternalSpanTypes.MESSAGE_CONSUMER, + SpanNaming.instance() + .namingSchema() + .messaging() + .inboundService(PUBSUB, Config.get().isGooglePubSubLegacyTracingEnabled())); private final String spanKind; private final CharSequence spanType; private final Supplier serviceNameSupplier; diff --git a/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PublisherInstrumentation.java b/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PublisherInstrumentation.java index 35f44420a64..4202b663e50 100644 --- a/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PublisherInstrumentation.java +++ b/dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PublisherInstrumentation.java @@ -70,11 +70,10 @@ public static void onEnter( @Advice.This Publisher publisher) { AgentSpan span = activeSpan(); if (span == null) return; - DataStreamsTags tags = - create( - "google-pubsub", - OUTBOUND, - PRODUCER_DECORATE.extractTopic(publisher.getTopicNameString()).toString()); + DataStreamsTags tags = create( + "google-pubsub", + OUTBOUND, + PRODUCER_DECORATE.extractTopic(publisher.getTopicNameString()).toString()); PubsubMessage.Builder builder = msg.toBuilder(); DataStreamsContext dsmContext = DataStreamsContext.fromTags(tags); defaultPropagator().inject(span.with(dsmContext), builder, SETTER); diff --git a/dd-java-agent/instrumentation/graal/graal-native-image-20.0/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java b/dd-java-agent/instrumentation/graal/graal-native-image-20.0/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java index c4c47e02233..ab3197b279a 100644 --- a/dd-java-agent/instrumentation/graal/graal-native-image-20.0/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/graal-native-image-20.0/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java @@ -45,143 +45,140 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[ } // !!! Important - if you add more args entries here, make sure to update the array copy below - args = - Arrays.copyOf( - args, oldLength + 5 + (InstrumenterConfig.get().isProfilingEnabled() ? 1 : 0)); + args = Arrays.copyOf( + args, oldLength + 5 + (InstrumenterConfig.get().isProfilingEnabled() ? 1 : 0)); args[oldLength++] = "-H:+AddAllCharsets"; args[oldLength++] = "-H:EnableURLProtocols=http"; // placeholder to trigger resource scanning, ResourcesFeatureInstrumentation does the rest args[oldLength++] = "-H:IncludeResources=.*dd-.*version$"; - args[oldLength++] = - "-H:ReflectionConfigurationResources=" - + "META-INF/native-image/com.datadoghq/dd-java-agent/reflect-config.json"; - args[oldLength++] = - "-H:ClassInitialization=" - + "com.datadog.profiling.controller.openjdk.events.AvailableProcessorCoresEvent:build_time," - + "com.datadog.profiling.controller.openjdk.events.DeadlockEvent:build_time," - + "com.datadog.profiling.controller.openjdk.events.ProfilerSettingEvent:build_time," - + "com.datadog.profiling.controller.openjdk.events.EndpointEvent:build_time," - + "com.datadog.profiling.controller.openjdk.events.QueueTimeEvent:build_time," - + "com.datadog.profiling.controller.openjdk.events.TimelineEvent:build_time," - + "com.datadog.profiling.controller.openjdk.events.SmapEntryEvent:build_time," - + "datadog.context.ContextKey:build_time," - + "datadog.context.ContextProviders$ProvidedManager:build_time," - + "datadog.environment.JavaVirtualMachine:rerun," - + "datadog.environment.OperatingSystem:rerun," - + "datadog.environment.OperatingSystem$Architecture:rerun," - + "datadog.trace.agent.tooling.WeakMaps$Adapter:build_time," - + "datadog.trace.api.Config:rerun," - + "datadog.trace.api.Platform:rerun," - + "datadog.trace.api.Platform$Captured:build_time," - + "datadog.trace.api.env.CapturedEnvironment:build_time," - + "datadog.trace.api.env.CapturedEnvironment$ProcessInfo:build_time," - + "datadog.trace.api.ConfigCollector:rerun," - + "datadog.trace.api.ConfigDefaults:build_time," - + "datadog.trace.api.ConfigOrigin:build_time," - + "datadog.trace.api.ConfigSetting:build_time," - + "datadog.trace.api.ProtocolVersion:build_time," - + "datadog.trace.api.config.OtlpConfig$Protocol:build_time," - + "datadog.trace.api.config.OtlpConfig$Temporality:build_time," - + "datadog.trace.api.EventTracker:build_time," - + "datadog.trace.api.InstrumenterConfig:build_time," - + "datadog.trace.api.Functions:build_time," - + "datadog.trace.api.Functions$NewInstance:build_time," - + "datadog.trace.api.GenericClassValue:build_time," - + "datadog.trace.api.GlobalTracer:build_time," - + "datadog.trace.api.GlobalTracer$1:build_time," - + "datadog.trace.api.IdGenerationStrategy:build_time," - + "datadog.trace.api.MethodFilterConfigParser:build_time," - + "datadog.trace.api.WithGlobalTracer:build_time," - + "datadog.trace.api.ProductActivation:build_time," - + "datadog.trace.api.PropagationStyle:build_time," - + "datadog.trace.api.ResolverCacheConfig$1:build_time," - + "datadog.trace.api.ResolverCacheConfig$2:build_time," - + "datadog.trace.api.ResolverCacheConfig$3:build_time," - + "datadog.trace.api.ResolverCacheConfig$4:build_time," - + "datadog.trace.api.ResolverCacheConfig$5:build_time," - + "datadog.trace.api.TracePropagationStyle:build_time," - + "datadog.trace.api.TracePropagationBehaviorExtract:build_time," - + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorProvider:rerun," - + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl:build_time," - + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl$ConfigInversionMetric:build_time," - + "datadog.trace.api.telemetry.NoOpConfigInversionMetricCollector:build_time," - + "datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl:build_time," - + "datadog.trace.api.telemetry.OtelSpiCollector:build_time," - + "datadog.trace.api.profiling.ProfilingEnablement:build_time," - + "datadog.trace.bootstrap.config.provider.ConfigConverter:build_time," - + "datadog.trace.bootstrap.config.provider.ConfigConverter$ValueOfLookup:build_time," - + "datadog.trace.bootstrap.config.provider.ConfigProvider:build_time," - + "datadog.trace.bootstrap.config.provider.ConfigProvider$Singleton:build_time," - + "datadog.trace.bootstrap.config.provider.CapturedEnvironmentConfigSource:build_time," - + "datadog.trace.bootstrap.config.provider.EnvironmentConfigSource:build_time," - + "datadog.trace.bootstrap.config.provider.OtelEnvironmentConfigSource:build_time," - + "datadog.trace.bootstrap.config.provider.SystemPropertiesConfigSource:build_time," - + "datadog.trace.bootstrap.config.provider.StableConfigSource:build_time," - + "datadog.trace.bootstrap.config.provider.StableConfigSource$StableConfig:build_time," - + "datadog.trace.bootstrap.Agent:build_time," - + "datadog.trace.bootstrap.BootstrapProxy:build_time," - + "datadog.trace.bootstrap.CallDepthThreadLocalMap:build_time," - + "datadog.trace.bootstrap.CallDepthThreadLocalMap$ThreadLocalDepth:build_time," - + "datadog.trace.bootstrap.ContextStore$Factory:build_time," - + "datadog.trace.bootstrap.DatadogClassLoader:build_time," - + "datadog.trace.bootstrap.InstrumentationClassLoader:build_time," - + "datadog.trace.bootstrap.FieldBackedContextStores:build_time," - + "datadog.trace.bootstrap.FieldBackedContextStore:build_time," - + "datadog.trace.bootstrap.benchmark.StaticEventLogger:build_time," - + "datadog.trace.bootstrap.blocking.BlockingExceptionHandler:build_time," - + "datadog.trace.bootstrap.InstrumentationErrors:build_time," - + "datadog.trace.bootstrap.instrumentation.api.AgentTracer$LegacyContextManager:build_time," - + "datadog.trace.bootstrap.instrumentation.api.InternalContextKeys:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.AsyncResultExtensions$CompletableAsyncResultExtension:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.AsyncResultExtensions$1:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.AsyncResultExtensions:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.ConcurrentState:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter$ExcludeType:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.QueueTimerHelper:build_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.QueueTimerHelper$RateLimiterHolder:run_time," - + "datadog.trace.bootstrap.instrumentation.java.concurrent.TPEHelper:build_time," - + "datadog.trace.bootstrap.instrumentation.java.module.JpmsHelper:build_time," - + "datadog.trace.bootstrap.instrumentation.jfr.exceptions.ExceptionCountEvent:build_time," - + "datadog.trace.bootstrap.instrumentation.jfr.exceptions.ExceptionSampleEvent:build_time," - + "datadog.trace.bootstrap.instrumentation.jfr.backpressure.BackpressureSampleEvent:build_time," - + "datadog.trace.bootstrap.instrumentation.jfr.directallocation.DirectAllocationTotalEvent:build_time," - + "datadog.trace.bootstrap.WeakMapPerStore:build_time," - + "datadog.trace.config.inversion.ConfigHelper:rerun," - + "datadog.trace.config.inversion.ConfigHelper$StrictnessPolicy:rerun," - + "datadog.trace.config.inversion.GeneratedSupportedConfigurations:build_time," - + "datadog.trace.config.inversion.SupportedConfiguration:build_time," - + "datadog.trace.instrumentation.guava10.GuavaAsyncResultExtension:build_time," - + "datadog.trace.instrumentation.reactivestreams.ReactiveStreamsAsyncResultExtension:build_time," - + "datadog.trace.instrumentation.reactor.core.ReactorAsyncResultExtension:build_time," - + "datadog.trace.instrumentation.rxjava2.RxJavaAsyncResultExtension:build_time," - + "datadog.trace.instrumentation.rxjava3.RxJavaAsyncResultExtension:build_time," - + "datadog.trace.logging.ddlogger.DDLogger:build_time," - + "datadog.trace.logging.ddlogger.DDLoggerFactory:build_time," - + "datadog.trace.logging.ddlogger.DDLoggerFactory$HelperWrapper:build_time," - + "datadog.trace.logging.LoggingSettingsDescription:build_time," - + "datadog.trace.logging.simplelogger.SLCompatFactory:build_time," - + "datadog.trace.logging.simplelogger.SLCompatHelper:build_time," - + "datadog.trace.logging.simplelogger.SLCompatSettings:build_time," - + "datadog.trace.logging.simplelogger.SLCompatSettings$NewDTFormatter:build_time," - + "datadog.trace.logging.LogLevel:build_time," - + "datadog.trace.logging.LogReporter:build_time," - + "datadog.trace.logging.PrintStreamWrapper:build_time," - + "datadog.trace.util.CollectionUtils:build_time," - + "datadog.trace.util.TempLocationManager$SingletonHolder:run_time," - + "datadog.slf4j.helpers.NOPLoggerFactory:build_time," - + "datadog.slf4j.helpers.SubstituteLoggerFactory:build_time," - + "datadog.slf4j.impl.StaticLoggerBinder:build_time," - + "datadog.slf4j.LoggerFactory:build_time," - + "datadog.instrument.fieldinject.GlobalObjectStore:build_time," - + "datadog.instrument.fieldinject.GlobalObjectStore$LookupKey:build_time," - + "com.blogspot.mydailyjava.weaklockfree.WeakConcurrentMap:build_time," - + "com.blogspot.mydailyjava.weaklockfree.WeakConcurrentMap$1:build_time," - + "net.bytebuddy:build_time," - + "com.sun.proxy:build_time," - + "jnr.enxio.channels:run_time," - + "jnr.unixsocket:run_time"; + args[oldLength++] = "-H:ReflectionConfigurationResources=" + + "META-INF/native-image/com.datadoghq/dd-java-agent/reflect-config.json"; + args[oldLength++] = "-H:ClassInitialization=" + + "com.datadog.profiling.controller.openjdk.events.AvailableProcessorCoresEvent:build_time," + + "com.datadog.profiling.controller.openjdk.events.DeadlockEvent:build_time," + + "com.datadog.profiling.controller.openjdk.events.ProfilerSettingEvent:build_time," + + "com.datadog.profiling.controller.openjdk.events.EndpointEvent:build_time," + + "com.datadog.profiling.controller.openjdk.events.QueueTimeEvent:build_time," + + "com.datadog.profiling.controller.openjdk.events.TimelineEvent:build_time," + + "com.datadog.profiling.controller.openjdk.events.SmapEntryEvent:build_time," + + "datadog.context.ContextKey:build_time," + + "datadog.context.ContextProviders$ProvidedManager:build_time," + + "datadog.environment.JavaVirtualMachine:rerun," + + "datadog.environment.OperatingSystem:rerun," + + "datadog.environment.OperatingSystem$Architecture:rerun," + + "datadog.trace.agent.tooling.WeakMaps$Adapter:build_time," + + "datadog.trace.api.Config:rerun," + + "datadog.trace.api.Platform:rerun," + + "datadog.trace.api.Platform$Captured:build_time," + + "datadog.trace.api.env.CapturedEnvironment:build_time," + + "datadog.trace.api.env.CapturedEnvironment$ProcessInfo:build_time," + + "datadog.trace.api.ConfigCollector:rerun," + + "datadog.trace.api.ConfigDefaults:build_time," + + "datadog.trace.api.ConfigOrigin:build_time," + + "datadog.trace.api.ConfigSetting:build_time," + + "datadog.trace.api.ProtocolVersion:build_time," + + "datadog.trace.api.config.OtlpConfig$Protocol:build_time," + + "datadog.trace.api.config.OtlpConfig$Temporality:build_time," + + "datadog.trace.api.EventTracker:build_time," + + "datadog.trace.api.InstrumenterConfig:build_time," + + "datadog.trace.api.Functions:build_time," + + "datadog.trace.api.Functions$NewInstance:build_time," + + "datadog.trace.api.GenericClassValue:build_time," + + "datadog.trace.api.GlobalTracer:build_time," + + "datadog.trace.api.GlobalTracer$1:build_time," + + "datadog.trace.api.IdGenerationStrategy:build_time," + + "datadog.trace.api.MethodFilterConfigParser:build_time," + + "datadog.trace.api.WithGlobalTracer:build_time," + + "datadog.trace.api.ProductActivation:build_time," + + "datadog.trace.api.PropagationStyle:build_time," + + "datadog.trace.api.ResolverCacheConfig$1:build_time," + + "datadog.trace.api.ResolverCacheConfig$2:build_time," + + "datadog.trace.api.ResolverCacheConfig$3:build_time," + + "datadog.trace.api.ResolverCacheConfig$4:build_time," + + "datadog.trace.api.ResolverCacheConfig$5:build_time," + + "datadog.trace.api.TracePropagationStyle:build_time," + + "datadog.trace.api.TracePropagationBehaviorExtract:build_time," + + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorProvider:rerun," + + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl:build_time," + + "datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl$ConfigInversionMetric:build_time," + + "datadog.trace.api.telemetry.NoOpConfigInversionMetricCollector:build_time," + + "datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl:build_time," + + "datadog.trace.api.telemetry.OtelSpiCollector:build_time," + + "datadog.trace.api.profiling.ProfilingEnablement:build_time," + + "datadog.trace.bootstrap.config.provider.ConfigConverter:build_time," + + "datadog.trace.bootstrap.config.provider.ConfigConverter$ValueOfLookup:build_time," + + "datadog.trace.bootstrap.config.provider.ConfigProvider:build_time," + + "datadog.trace.bootstrap.config.provider.ConfigProvider$Singleton:build_time," + + "datadog.trace.bootstrap.config.provider.CapturedEnvironmentConfigSource:build_time," + + "datadog.trace.bootstrap.config.provider.EnvironmentConfigSource:build_time," + + "datadog.trace.bootstrap.config.provider.OtelEnvironmentConfigSource:build_time," + + "datadog.trace.bootstrap.config.provider.SystemPropertiesConfigSource:build_time," + + "datadog.trace.bootstrap.config.provider.StableConfigSource:build_time," + + "datadog.trace.bootstrap.config.provider.StableConfigSource$StableConfig:build_time," + + "datadog.trace.bootstrap.Agent:build_time," + + "datadog.trace.bootstrap.BootstrapProxy:build_time," + + "datadog.trace.bootstrap.CallDepthThreadLocalMap:build_time," + + "datadog.trace.bootstrap.CallDepthThreadLocalMap$ThreadLocalDepth:build_time," + + "datadog.trace.bootstrap.ContextStore$Factory:build_time," + + "datadog.trace.bootstrap.DatadogClassLoader:build_time," + + "datadog.trace.bootstrap.InstrumentationClassLoader:build_time," + + "datadog.trace.bootstrap.FieldBackedContextStores:build_time," + + "datadog.trace.bootstrap.FieldBackedContextStore:build_time," + + "datadog.trace.bootstrap.benchmark.StaticEventLogger:build_time," + + "datadog.trace.bootstrap.blocking.BlockingExceptionHandler:build_time," + + "datadog.trace.bootstrap.InstrumentationErrors:build_time," + + "datadog.trace.bootstrap.instrumentation.api.AgentTracer$LegacyContextManager:build_time," + + "datadog.trace.bootstrap.instrumentation.api.InternalContextKeys:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.AsyncResultExtensions$CompletableAsyncResultExtension:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.AsyncResultExtensions$1:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.AsyncResultExtensions:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.ConcurrentState:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter$ExcludeType:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.QueueTimerHelper:build_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.QueueTimerHelper$RateLimiterHolder:run_time," + + "datadog.trace.bootstrap.instrumentation.java.concurrent.TPEHelper:build_time," + + "datadog.trace.bootstrap.instrumentation.java.module.JpmsHelper:build_time," + + "datadog.trace.bootstrap.instrumentation.jfr.exceptions.ExceptionCountEvent:build_time," + + "datadog.trace.bootstrap.instrumentation.jfr.exceptions.ExceptionSampleEvent:build_time," + + "datadog.trace.bootstrap.instrumentation.jfr.backpressure.BackpressureSampleEvent:build_time," + + "datadog.trace.bootstrap.instrumentation.jfr.directallocation.DirectAllocationTotalEvent:build_time," + + "datadog.trace.bootstrap.WeakMapPerStore:build_time," + + "datadog.trace.config.inversion.ConfigHelper:rerun," + + "datadog.trace.config.inversion.ConfigHelper$StrictnessPolicy:rerun," + + "datadog.trace.config.inversion.GeneratedSupportedConfigurations:build_time," + + "datadog.trace.config.inversion.SupportedConfiguration:build_time," + + "datadog.trace.instrumentation.guava10.GuavaAsyncResultExtension:build_time," + + "datadog.trace.instrumentation.reactivestreams.ReactiveStreamsAsyncResultExtension:build_time," + + "datadog.trace.instrumentation.reactor.core.ReactorAsyncResultExtension:build_time," + + "datadog.trace.instrumentation.rxjava2.RxJavaAsyncResultExtension:build_time," + + "datadog.trace.instrumentation.rxjava3.RxJavaAsyncResultExtension:build_time," + + "datadog.trace.logging.ddlogger.DDLogger:build_time," + + "datadog.trace.logging.ddlogger.DDLoggerFactory:build_time," + + "datadog.trace.logging.ddlogger.DDLoggerFactory$HelperWrapper:build_time," + + "datadog.trace.logging.LoggingSettingsDescription:build_time," + + "datadog.trace.logging.simplelogger.SLCompatFactory:build_time," + + "datadog.trace.logging.simplelogger.SLCompatHelper:build_time," + + "datadog.trace.logging.simplelogger.SLCompatSettings:build_time," + + "datadog.trace.logging.simplelogger.SLCompatSettings$NewDTFormatter:build_time," + + "datadog.trace.logging.LogLevel:build_time," + + "datadog.trace.logging.LogReporter:build_time," + + "datadog.trace.logging.PrintStreamWrapper:build_time," + + "datadog.trace.util.CollectionUtils:build_time," + + "datadog.trace.util.TempLocationManager$SingletonHolder:run_time," + + "datadog.slf4j.helpers.NOPLoggerFactory:build_time," + + "datadog.slf4j.helpers.SubstituteLoggerFactory:build_time," + + "datadog.slf4j.impl.StaticLoggerBinder:build_time," + + "datadog.slf4j.LoggerFactory:build_time," + + "datadog.instrument.fieldinject.GlobalObjectStore:build_time," + + "datadog.instrument.fieldinject.GlobalObjectStore$LookupKey:build_time," + + "com.blogspot.mydailyjava.weaklockfree.WeakConcurrentMap:build_time," + + "com.blogspot.mydailyjava.weaklockfree.WeakConcurrentMap$1:build_time," + + "net.bytebuddy:build_time," + + "com.sun.proxy:build_time," + + "jnr.enxio.channels:run_time," + + "jnr.unixsocket:run_time"; if (InstrumenterConfig.get().isProfilingEnabled()) { // Specific GraalVM versions have different flags for enabling JFR // We don't want to drag in internal-api via Platform class, so we just read the system diff --git a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestClassesExecutor.java b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestClassesExecutor.java index 7648ae06e1b..bcc853e8697 100644 --- a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestClassesExecutor.java +++ b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestClassesExecutor.java @@ -39,9 +39,8 @@ public void execute(@Nonnull String testClassName) { } public void processAllTestClasses() { - testClasses.sort( - new JUnit4FailFastClassOrderer( - TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT4))); + testClasses.sort(new JUnit4FailFastClassOrderer( + TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT4))); for (Class clazz : testClasses) { delegate.execute(clazz.getName()); diff --git a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestDefinitionsExecutor.java b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestDefinitionsExecutor.java index 96b3803e49e..2ae1f515ceb 100644 --- a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestDefinitionsExecutor.java +++ b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/DDCollectAllTestDefinitionsExecutor.java @@ -40,9 +40,8 @@ public void accept(ClassTestDefinition testDefinition) { } public void processAllTestClasses() { - testClasses.sort( - new JUnit4FailFastClassOrderer( - TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT4))); + testClasses.sort(new JUnit4FailFastClassOrderer( + TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT4))); for (Class clazz : testClasses) { delegate.accept(testDefinitions.get(clazz.getName())); diff --git a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestClassProcessorInstrumentation.java b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestClassProcessorInstrumentation.java index b30413fbae4..80a305041df 100644 --- a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestClassProcessorInstrumentation.java +++ b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestClassProcessorInstrumentation.java @@ -66,9 +66,8 @@ public static void onTestExecutorCreation( throw new IllegalArgumentException("Unknown test order: " + testOrder); } - executor = - new DDCollectAllTestClassesExecutor( - executor, Thread.currentThread().getContextClassLoader()); + executor = new DDCollectAllTestClassesExecutor( + executor, Thread.currentThread().getContextClassLoader()); } } } diff --git a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestDefinitionProcessorInstrumentation.java b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestDefinitionProcessorInstrumentation.java index 9963637cea3..1a059d1aff9 100644 --- a/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestDefinitionProcessorInstrumentation.java +++ b/dd-java-agent/instrumentation/gradle-testing-5.1/src/main/groovy/datadog/trace/instrumentation/gradle/junit4/JUnitTestDefinitionProcessorInstrumentation.java @@ -67,9 +67,8 @@ public static void onTestExecutorCreation( throw new IllegalArgumentException("Unknown test order: " + testOrder); } - executor = - new DDCollectAllTestDefinitionsExecutor( - executor, Thread.currentThread().getContextClassLoader()); + executor = new DDCollectAllTestDefinitionsExecutor( + executor, Thread.currentThread().getContextClassLoader()); } } } diff --git a/dd-java-agent/instrumentation/gradle/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleBuildListener.java b/dd-java-agent/instrumentation/gradle/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleBuildListener.java index bf99dbe034d..a55d8aa9c8a 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleBuildListener.java +++ b/dd-java-agent/instrumentation/gradle/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleBuildListener.java @@ -114,20 +114,12 @@ public void beforeExecute(@Nonnull Task task) { // "com.android.base" is applied transitively by every Android Gradle Plugin, so it is a // reliable single marker for an Android project regardless of how its tests are executed. - Map additionalTags = - project.getPluginManager().hasPlugin("com.android.base") - ? Collections.singletonMap(Tags.TEST_IS_ANDROID, true) - : Collections.emptyMap(); - - BuildModuleSettings moduleSettings = - buildEventsHandler.onTestModuleStart( - gradle, - taskPath, - moduleLayout, - jvmExecutable, - classpath, - jacocoAgent, - additionalTags); + Map additionalTags = project.getPluginManager().hasPlugin("com.android.base") + ? Collections.singletonMap(Tags.TEST_IS_ANDROID, true) + : Collections.emptyMap(); + + BuildModuleSettings moduleSettings = buildEventsHandler.onTestModuleStart( + gradle, taskPath, moduleLayout, jvmExecutable, classpath, jacocoAgent, additionalTags); Map systemProperties = moduleSettings.getSystemProperties(); GradleProjectConfigurator.INSTANCE.configureTracer(task, systemProperties); } diff --git a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListener.java b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListener.java index 8e3f6220073..1c3adffb58c 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListener.java +++ b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListener.java @@ -41,10 +41,8 @@ public class CiVisibilityGradleListener extends BuildAdapter private static final String TRACER_VERSION; static { - try (BufferedReader reader = - new BufferedReader( - new InputStreamReader( - ClassLoader.getSystemResourceAsStream("dd-java-agent.version")))) { + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(ClassLoader.getSystemResourceAsStream("dd-java-agent.version")))) { TRACER_VERSION = reader.lines().collect(Collectors.joining()); } catch (IOException e) { throw new RuntimeException("Could not read tracer version from dd-java-agent.version", e); @@ -84,9 +82,8 @@ public CiVisibilityGradleListener( this.gradle = gradle; BuildServiceRegistry sharedServices = gradle.getSharedServices(); - Provider ciVisibilityServiceProvider = - sharedServices.registerIfAbsent( - "ciVisibilityService", CiVisibilityService.class, spec -> {}); + Provider ciVisibilityServiceProvider = sharedServices.registerIfAbsent( + "ciVisibilityService", CiVisibilityService.class, spec -> {}); // registration is needed to keep the service alive until the end of the build buildEventsListenerRegistry.onTaskCompletion(ciVisibilityServiceProvider); ciVisibilityService = ciVisibilityServiceProvider.get(); @@ -187,9 +184,8 @@ public void beforeExecute(TaskIdentity taskIdentity) { // Android Gradle Plugins. The Android KMP library plugin (AGP 8.8+) is a separate entry point // that does NOT apply com.android.base, so it must be checked explicitly. PluginManager pluginManager = project.getPluginManager(); - boolean isAndroid = - pluginManager.hasPlugin("com.android.base") - || pluginManager.hasPlugin("com.android.kotlin.multiplatform.library"); + boolean isAndroid = pluginManager.hasPlugin("com.android.base") + || pluginManager.hasPlugin("com.android.kotlin.multiplatform.library"); Map inputProperties = task.getInputs().getProperties(); BuildModuleLayout moduleLayout = diff --git a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_10.java b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_10.java index 5b2f325517b..a87ca6c9824 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_10.java +++ b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_10.java @@ -28,21 +28,20 @@ public static void injectCiVisibilityGradleListener( Class serviceRegistrationActionClass = coreApiClassLoader.loadClass("org.gradle.internal.service.ServiceRegistrationAction"); - Object serviceRegistrationAction = - Proxy.newProxyInstance( - coreApiClassLoader, - new Class[] {serviceRegistrationActionClass}, - (proxy, method, args) -> { - if (method.getName().equals("registerServices")) { - ServiceRegistration serviceRegistration = (ServiceRegistration) args[0]; - Class ciVisibilityGradleListener = - CiVisibilityGradleListenerInjector_8_10.loadCiVisibilityGradleListener( - classLoaderRegistry); - serviceRegistration.add(ciVisibilityGradleListener); - return null; - } - throw new UnsupportedOperationException("Method not implemented"); - }); + Object serviceRegistrationAction = Proxy.newProxyInstance( + coreApiClassLoader, + new Class[] {serviceRegistrationActionClass}, + (proxy, method, args) -> { + if (method.getName().equals("registerServices")) { + ServiceRegistration serviceRegistration = (ServiceRegistration) args[0]; + Class ciVisibilityGradleListener = + CiVisibilityGradleListenerInjector_8_10.loadCiVisibilityGradleListener( + classLoaderRegistry); + serviceRegistration.add(ciVisibilityGradleListener); + return null; + } + throw new UnsupportedOperationException("Method not implemented"); + }); Method register = DefaultServiceRegistry.class.getMethod("register", serviceRegistrationActionClass); diff --git a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPlugin.java b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPlugin.java index 4d7ad9c2c26..7f06e2cad08 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPlugin.java +++ b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPlugin.java @@ -42,10 +42,9 @@ public abstract class CiVisibilityPlugin implements Plugin { public void apply(Project project) { this.project = project; - CiVisibilityPluginExtension extension = - project - .getExtensions() - .create(PLUGIN_EXTENSION_NAME, CiVisibilityPluginExtension.class, project.getObjects()); + CiVisibilityPluginExtension extension = project + .getExtensions() + .create(PLUGIN_EXTENSION_NAME, CiVisibilityPluginExtension.class, project.getObjects()); calculateCompiledClassesFolders(extension); applyCompilerPlugin(extension); applyJacocoPlugin(extension); @@ -75,9 +74,8 @@ private void calculateCompiledClassesFolders(CiVisibilityPluginExtension extensi SourceSetOutput output = sourceSet.getOutput(); Collection destinationDirs = output.getFiles(); - sourceSets.add( - new datadog.trace.api.civisibility.domain.SourceSet( - sourceSetType, srcDirs, destinationDirs)); + sourceSets.add(new datadog.trace.api.civisibility.domain.SourceSet( + sourceSetType, srcDirs, destinationDirs)); } } @@ -93,22 +91,18 @@ private void applyCompilerPlugin(CiVisibilityPluginExtension extension) { } public void addCompilerPluginConfigurations(CiVisibilityPluginExtension extension) { - Configuration configuration = - project - .getConfigurations() - .detachedConfiguration( - project - .getDependencies() - .create( - String.format( - "com.datadoghq:dd-javac-plugin:%s", - extension.getCompilerPluginVersion())), - project - .getDependencies() - .create( - String.format( - "com.datadoghq:dd-javac-plugin-client:%s", - extension.getCompilerPluginVersion()))); + Configuration configuration = project + .getConfigurations() + .detachedConfiguration( + project + .getDependencies() + .create(String.format( + "com.datadoghq:dd-javac-plugin:%s", extension.getCompilerPluginVersion())), + project + .getDependencies() + .create(String.format( + "com.datadoghq:dd-javac-plugin-client:%s", + extension.getCompilerPluginVersion()))); disableDependencyVerificationIfConfigured(configuration); @@ -120,12 +114,11 @@ private void disableDependencyVerificationIfConfigured(Configuration configurati return; } - if (Files.isRegularFile( - project - .getRootProject() - .getProjectDir() - .toPath() - .resolve("gradle/verification-metadata.xml"))) { + if (Files.isRegularFile(project + .getRootProject() + .getProjectDir() + .toPath() + .resolve("gradle/verification-metadata.xml"))) { if (!project .getRootProject() .getExtensions() @@ -189,13 +182,10 @@ private void applyJacocoPlugin(CiVisibilityPluginExtension extension) { project.getExtensions().getByType(JacocoPluginExtension.class); jacocoExtension.setToolVersion(extension.getJacocoVersion()); - List jacocoConfigurations = - project.getConfigurations().stream() - .filter( - c -> - JACOCO_AGENT_CONFIGURATION_NAME.equals(c.getName()) - || JACOCO_ANT_CONFIGURATION_NAME.equals(c.getName())) - .collect(Collectors.toList()); + List jacocoConfigurations = project.getConfigurations().stream() + .filter(c -> JACOCO_AGENT_CONFIGURATION_NAME.equals(c.getName()) + || JACOCO_ANT_CONFIGURATION_NAME.equals(c.getName())) + .collect(Collectors.toList()); for (Configuration jacocoConfiguration : jacocoConfigurations) { disableDependencyVerificationIfConfigured(jacocoConfiguration); } diff --git a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPluginExtension.java b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPluginExtension.java index 78a67b04d76..0635f9fd3a6 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPluginExtension.java +++ b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPluginExtension.java @@ -92,10 +92,9 @@ public void applyTo(JavaCompile javaCompile) { javaCompile.setClasspath(updatedClasspath); FileCollection annotationProcessorPath = options.getAnnotationProcessorPath(); - FileCollection updatedAnnotationProcessorPath = - annotationProcessorPath != null - ? annotationProcessorPath.plus(compilerPluginClasspath) - : compilerPluginClasspath; + FileCollection updatedAnnotationProcessorPath = annotationProcessorPath != null + ? annotationProcessorPath.plus(compilerPluginClasspath) + : compilerPluginClasspath; options.setAnnotationProcessorPath(updatedAnnotationProcessorPath); CommandLineArgumentProvider argumentProvider = @@ -170,12 +169,10 @@ private void applyJacocoSettings(JacocoTaskExtension jacocoTaskExtension) { new ArrayList<>(ciVisibilityService.getExcludeClassLoaders())); } - jacocoTaskExtension.setIncludes( - merge( - jacocoTaskExtension.getIncludes(), ciVisibilityService.getCoverageIncludedPackages())); - jacocoTaskExtension.setExcludes( - merge( - jacocoTaskExtension.getExcludes(), ciVisibilityService.getCoverageExcludedPackages())); + jacocoTaskExtension.setIncludes(merge( + jacocoTaskExtension.getIncludes(), ciVisibilityService.getCoverageIncludedPackages())); + jacocoTaskExtension.setExcludes(merge( + jacocoTaskExtension.getExcludes(), ciVisibilityService.getCoverageExcludedPackages())); } @SafeVarargs diff --git a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityService.java b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityService.java index 6d4462f15b0..9e89c73f1f8 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityService.java +++ b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityService.java @@ -102,10 +102,9 @@ public void onBuildStart( String startCommand, String gradleVersion, boolean nestedBuild) { - Map additionalTags = - nestedBuild - ? Collections.singletonMap(Tags.TEST_GRADLE_NESTED_BUILD, true) - : Collections.emptyMap(); + Map additionalTags = nestedBuild + ? Collections.singletonMap(Tags.TEST_GRADLE_NESTED_BUILD, true) + : Collections.emptyMap(); buildEventsHandler.onTestSessionStart( SESSION_KEY, buildPath, projectRoot, startCommand, "gradle", gradleVersion, additionalTags); } diff --git a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java index 69528065c3e..f35f88d058c 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java +++ b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java @@ -25,7 +25,8 @@ public static Map addJavaagentToGradleDaemonProperties( File agentJar = Config.get().getCiVisibilityAgentJarFile(); Path agentJarPath = agentJar.toPath(); - StringBuilder agentArg = new StringBuilder("-javaagent:").append(agentJarPath).append('='); + StringBuilder agentArg = + new StringBuilder("-javaagent:").append(agentJarPath).append('='); for (Map.Entry p : SystemProperties.asStringMap().entrySet()) { String propertyName = p.getKey(); diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLInstrumentation.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLInstrumentation.java index 14c2753d1c0..a3d7ebc5525 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLInstrumentation.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLInstrumentation.java @@ -101,8 +101,8 @@ public DataFetcher instrumentDataFetcher( public InstrumentationContext beginParse( InstrumentationExecutionParameters parameters) { State state = parameters.getInstrumentationState(); - final AgentSpan parsingSpan = - startSpan(GRAPHQL_JAVA.toString(), GRAPHQL_PARSING, state.getRequestSpan().spanContext()); + final AgentSpan parsingSpan = startSpan( + GRAPHQL_JAVA.toString(), GRAPHQL_PARSING, state.getRequestSpan().spanContext()); DECORATE.afterStart(parsingSpan); return new ParsingInstrumentationContext(parsingSpan, state, parameters.getQuery()); } @@ -112,9 +112,8 @@ public InstrumentationContext> beginValidation( InstrumentationValidationParameters parameters) { State state = parameters.getInstrumentationState(); - final AgentSpan validationSpan = - startSpan( - GRAPHQL_JAVA.toString(), GRAPHQL_VALIDATION, state.getRequestSpan().spanContext()); + final AgentSpan validationSpan = startSpan( + GRAPHQL_JAVA.toString(), GRAPHQL_VALIDATION, state.getRequestSpan().spanContext()); DECORATE.afterStart(validationSpan); return new ValidationInstrumentationContext(validationSpan); } diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLJavaInstrumentation.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLJavaInstrumentation.java index 4c33771e369..cd65063a9ff 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLJavaInstrumentation.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/main/java/datadog/trace/instrumentation/graphqljava14/GraphQLJavaInstrumentation.java @@ -53,13 +53,12 @@ public ElementMatcher.Junction classLoaderMatcher() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() - .and( - namedOneOf( - "checkInstrumentationDefaultState" // 9.7+ - // https://github.com/graphql-java/graphql-java/commit/821241de8ee055d6d254a9d95ef5143f9e540826 - // "checkInstrumentation" // <9.7 - // https://github.com/graphql-java/graphql-java/commit/78a6e4eda1c13f47573adb879ae781cce794e96a - )) + .and(namedOneOf( + "checkInstrumentationDefaultState" // 9.7+ + // https://github.com/graphql-java/graphql-java/commit/821241de8ee055d6d254a9d95ef5143f9e540826 + // "checkInstrumentation" // <9.7 + // https://github.com/graphql-java/graphql-java/commit/78a6e4eda1c13f47573adb879ae781cce794e96a + )) .and(returns(named("graphql.execution.instrumentation.Instrumentation"))), this.getClass().getName() + "$AddInstrumentationAdvice"); } diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Author.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Author.java index 18794637b06..e6579dc37a9 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Author.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Author.java @@ -13,14 +13,16 @@ public Author(String id, String firstName, String lastName) { this.lastName = lastName; } - private static List authors = - Arrays.asList( - new Author("author-1", "Joanne", "Rowling"), - new Author("author-2", "Herman", "Melville"), - new Author("author-3", "Anne", "Rice")); + private static List authors = Arrays.asList( + new Author("author-1", "Joanne", "Rowling"), + new Author("author-2", "Herman", "Melville"), + new Author("author-3", "Anne", "Rice")); public static Author getById(String id) { - return authors.stream().filter(author -> author.getId().equals(id)).findFirst().orElse(null); + return authors.stream() + .filter(author -> author.getId().equals(id)) + .findFirst() + .orElse(null); } public String getId() { diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Book.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Book.java index d80166121cb..8796b7a000e 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Book.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-14.0/src/test/java/Book.java @@ -16,11 +16,10 @@ public Book(String id, String name, int pageCount, String authorId, String isbn) this.isbn = isbn; } - private static List books = - Arrays.asList( - new Book("book-1", "Harry Potter and the Philosopher's Stone", 223, "author-1", "isbn1"), - new Book("book-2", "Moby Dick", 635, "author-2", "isbn2"), - new Book("book-3", "Interview with the vampire", 371, "author-3", "isbn3")); + private static List books = Arrays.asList( + new Book("book-1", "Harry Potter and the Philosopher's Stone", 223, "author-1", "isbn1"), + new Book("book-2", "Moby Dick", 635, "author-2", "isbn2"), + new Book("book-3", "Interview with the vampire", 371, "author-3", "isbn3")); public static Book getById(String id) { return books.stream().filter(book -> book.getId().equals(id)).findFirst().orElse(null); diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/main/java/datadog/trace/instrumentation/graphqljava20/GraphQLInstrumentation.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/main/java/datadog/trace/instrumentation/graphqljava20/GraphQLInstrumentation.java index 5a88ec3dd81..b5c6d4bbee9 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/main/java/datadog/trace/instrumentation/graphqljava20/GraphQLInstrumentation.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/main/java/datadog/trace/instrumentation/graphqljava20/GraphQLInstrumentation.java @@ -116,11 +116,10 @@ public InstrumentationContext beginParse( return super.beginParse(parameters, instrumentationState); } final State state = (State) instrumentationState; - final AgentSpan parsingSpan = - AgentTracer.startSpan( - GraphQLDecorator.GRAPHQL_JAVA.toString(), - GraphQLDecorator.GRAPHQL_PARSING, - state.getRequestSpan().spanContext()); + final AgentSpan parsingSpan = AgentTracer.startSpan( + GraphQLDecorator.GRAPHQL_JAVA.toString(), + GraphQLDecorator.GRAPHQL_PARSING, + state.getRequestSpan().spanContext()); GraphQLDecorator.DECORATE.afterStart(parsingSpan); return new ParsingInstrumentationContext(parsingSpan, state, parameters.getQuery()); } @@ -133,11 +132,10 @@ public InstrumentationContext> beginValidation( } final State state = (State) instrumentationState; - final AgentSpan validationSpan = - AgentTracer.startSpan( - GraphQLDecorator.GRAPHQL_JAVA.toString(), - GraphQLDecorator.GRAPHQL_VALIDATION, - state.getRequestSpan().spanContext()); + final AgentSpan validationSpan = AgentTracer.startSpan( + GraphQLDecorator.GRAPHQL_JAVA.toString(), + GraphQLDecorator.GRAPHQL_VALIDATION, + state.getRequestSpan().spanContext()); GraphQLDecorator.DECORATE.afterStart(validationSpan); return new ValidationInstrumentationContext(validationSpan); } diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Author.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Author.java index 18794637b06..e6579dc37a9 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Author.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Author.java @@ -13,14 +13,16 @@ public Author(String id, String firstName, String lastName) { this.lastName = lastName; } - private static List authors = - Arrays.asList( - new Author("author-1", "Joanne", "Rowling"), - new Author("author-2", "Herman", "Melville"), - new Author("author-3", "Anne", "Rice")); + private static List authors = Arrays.asList( + new Author("author-1", "Joanne", "Rowling"), + new Author("author-2", "Herman", "Melville"), + new Author("author-3", "Anne", "Rice")); public static Author getById(String id) { - return authors.stream().filter(author -> author.getId().equals(id)).findFirst().orElse(null); + return authors.stream() + .filter(author -> author.getId().equals(id)) + .findFirst() + .orElse(null); } public String getId() { diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Book.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Book.java index d80166121cb..8796b7a000e 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Book.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-20.0/src/test/java/Book.java @@ -16,11 +16,10 @@ public Book(String id, String name, int pageCount, String authorId, String isbn) this.isbn = isbn; } - private static List books = - Arrays.asList( - new Book("book-1", "Harry Potter and the Philosopher's Stone", 223, "author-1", "isbn1"), - new Book("book-2", "Moby Dick", 635, "author-2", "isbn2"), - new Book("book-3", "Interview with the vampire", 371, "author-3", "isbn3")); + private static List books = Arrays.asList( + new Book("book-1", "Harry Potter and the Philosopher's Stone", 223, "author-1", "isbn1"), + new Book("book-2", "Moby Dick", 635, "author-2", "isbn2"), + new Book("book-3", "Interview with the vampire", 371, "author-3", "isbn3")); public static Book getById(String id) { return books.stream().filter(book -> book.getId().equals(id)).findFirst().orElse(null); diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/GraphQLDecorator.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/GraphQLDecorator.java index 97e49cb3b09..8392b16132b 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/GraphQLDecorator.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/GraphQLDecorator.java @@ -26,9 +26,8 @@ public class GraphQLDecorator extends BaseDecorator { public static final GraphQLDecorator DECORATE = new GraphQLDecorator(); - public static final CharSequence GRAPHQL_REQUEST = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().server().operationForProtocol("graphql")); + public static final CharSequence GRAPHQL_REQUEST = UTF8BytesString.create( + SpanNaming.instance().namingSchema().server().operationForProtocol("graphql")); public static final CharSequence GRAPHQL_PARSING = UTF8BytesString.create("graphql.parsing"); public static final CharSequence GRAPHQL_VALIDATION = UTF8BytesString.create("graphql.validation"); diff --git a/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/InstrumentedDataFetcher.java b/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/InstrumentedDataFetcher.java index 98bbc788e2c..f259cc7f715 100644 --- a/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/InstrumentedDataFetcher.java +++ b/dd-java-agent/instrumentation/graphql-java/graphql-java-common/src/main/java/datadog/trace/instrumentation/graphqljava/InstrumentedDataFetcher.java @@ -55,13 +55,11 @@ public Object get(DataFetchingEnvironment environment) throws Exception { throw e; } if (dataValue instanceof CompletionStage) { - return ((CompletionStage) dataValue) - .whenComplete( - (result, throwable) -> { - DECORATE.onError(fieldSpan, AsyncExceptionUnwrapper.unwrap(throwable)); - DECORATE.beforeFinish(fieldSpan); - fieldSpan.finish(); - }); + return ((CompletionStage) dataValue).whenComplete((result, throwable) -> { + DECORATE.onError(fieldSpan, AsyncExceptionUnwrapper.unwrap(throwable)); + DECORATE.beforeFinish(fieldSpan); + fieldSpan.finish(); + }); } DECORATE.beforeFinish(fieldSpan); fieldSpan.finish(); diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyCharBodyInstrumentation.java b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyCharBodyInstrumentation.java index 73ce6a5efdd..fb9c0837504 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyCharBodyInstrumentation.java +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyCharBodyInstrumentation.java @@ -159,7 +159,8 @@ static int before( @Advice.This final NIOReader thiz, @Advice.Local("storedCharBody") StoredCharBody storedCharBody, @Advice.Argument(0) CharBuffer charBuffer) { - storedCharBody = InstrumentationContext.get(NIOReader.class, StoredCharBody.class).get(thiz); + storedCharBody = + InstrumentationContext.get(NIOReader.class, StoredCharBody.class).get(thiz); if (storedCharBody == null) { return 0; } diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java index acdb6b26eee..af416412502 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java @@ -128,9 +128,8 @@ public static NextAction onHttpCodecFilterExit( Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); if (rba != null && thiz instanceof HttpServerFilter) { span.getRequestContext().getTraceSegment().effectivelyBlocked(); - nextAction = - GrizzlyHttpBlockingHelper.block( - ctx, (HttpServerFilter) thiz, httpRequest, httpResponse, rba, nextAction); + nextAction = GrizzlyHttpBlockingHelper.block( + ctx, (HttpServerFilter) thiz, httpRequest, httpResponse, rba, nextAction); } if (ActiveSubsystems.APPSEC_ACTIVE) { RequestContext requestContext = span.getRequestContext(); diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyHttpBlockingHelper.java b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyHttpBlockingHelper.java index 700ad1a13a1..3b6670853cc 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyHttpBlockingHelper.java +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyHttpBlockingHelper.java @@ -48,14 +48,12 @@ public class GrizzlyHttpBlockingHelper { Method encodeHttpPacket = null; try { - encodeHttpPacket = - HttpServerFilter.class.getDeclaredMethod( - "encodeHttpPacket", FilterChainContext.class, HttpPacket.class); + encodeHttpPacket = HttpServerFilter.class.getDeclaredMethod( + "encodeHttpPacket", FilterChainContext.class, HttpPacket.class); encodeHttpPacket.setAccessible(true); } catch (NoSuchMethodException nsme) { - log.error( - "Cannot find method HttpServerFilter::encodeHttpPacket. " - + "Blocking will not be possible at the grizzly-http level"); + log.error("Cannot find method HttpServerFilter::encodeHttpPacket. " + + "Blocking will not be possible at the grizzly-http level"); } catch (RuntimeException e) { log.error( "Exception trying to obtain handle for method HttpServerFilter::encodeHttpPacket. " @@ -67,9 +65,8 @@ public class GrizzlyHttpBlockingHelper { try { handle = MethodHandles.lookup().unreflect(encodeHttpPacket); } catch (IllegalAccessException e) { - log.error( - "Exception unreflecting method HttpServerFilter::encodeHttpPacket. " - + "Blocking will not be possible at the grizzly-http level"); + log.error("Exception unreflecting method HttpServerFilter::encodeHttpPacket. " + + "Blocking will not be possible at the grizzly-http level"); } } @@ -89,9 +86,8 @@ public static NextAction block( return nextAction; } - HttpStatus status = - HttpStatus.newHttpStatus( - BlockingActionHelper.getHttpCode(rba.getStatusCode()), "Request Blocked"); + HttpStatus status = HttpStatus.newHttpStatus( + BlockingActionHelper.getHttpCode(rba.getStatusCode()), "Request Blocked"); status.setValues(httpResponse); for (Map.Entry h : rba.getExtraHeaders().entrySet()) { @@ -107,8 +103,10 @@ public static NextAction block( httpResponse.setHeader("Content-type", BlockingActionHelper.getContentType(type)); byte[] template = BlockingActionHelper.getTemplate(type, rba.getSecurityResponseId()); httpResponse.setContentLength(template.length); - httpContent = - HttpContent.builder(httpResponse).content(HeapBuffer.wrap(template)).last(true).build(); + httpContent = HttpContent.builder(httpResponse) + .content(HeapBuffer.wrap(template)) + .last(true) + .build(); } else { httpContent = HttpContent.builder(httpResponse).last(true).build(); } @@ -169,8 +167,10 @@ public static boolean block( httpResponse.setHeader("Content-type", BlockingActionHelper.getContentType(type)); byte[] template = BlockingActionHelper.getTemplate(type, securityResponseId); httpResponse.setContentLength(template.length); - httpContent = - HttpContent.builder(httpResponse).content(HeapBuffer.wrap(template)).last(true).build(); + httpContent = HttpContent.builder(httpResponse) + .content(HeapBuffer.wrap(template)) + .last(true) + .build(); } else { httpContent = HttpContent.builder(httpResponse).last(true).build(); } diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ParsedBodyParametersInstrumentation.java b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ParsedBodyParametersInstrumentation.java index aea5c512c3b..7e897bf1baa 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ParsedBodyParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ParsedBodyParametersInstrumentation.java @@ -42,10 +42,10 @@ public String instrumentedType() { return "org.glassfish.grizzly.http.util.Parameters"; } - private static final Reference PARAM_HASH_VALUES_HASH_MAP_REFERENCE = - new Reference.Builder("org.glassfish.grizzly.http.util.Parameters") - .withField(new String[0], 0, "paramHashValues", "Ljava/util/LinkedHashMap;") - .build(); + private static final Reference PARAM_HASH_VALUES_HASH_MAP_REFERENCE = new Reference.Builder( + "org.glassfish.grizzly.http.util.Parameters") + .withField(new String[0], 0, "paramHashValues", "Ljava/util/LinkedHashMap;") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/QueuedCommandInstrumentation.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/QueuedCommandInstrumentation.java index d44454e6c1d..1a5ac97b19c 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/QueuedCommandInstrumentation.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/QueuedCommandInstrumentation.java @@ -40,11 +40,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice(isConstructor(), getClass().getName() + "$Construct"); transformer.applyAdvice( isMethod() - .and( - named("run") - .and( - takesArguments(1) - .and(takesArgument(0, named("io.netty.channel.Channel"))))), + .and(named("run") + .and(takesArguments(1).and(takesArgument(0, named("io.netty.channel.Channel"))))), getClass().getName() + "$Run"); } diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/AbstractClientStreamInstrumentation.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/AbstractClientStreamInstrumentation.java index 6caaa52af1b..f13f8c132eb 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/AbstractClientStreamInstrumentation.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/AbstractClientStreamInstrumentation.java @@ -25,19 +25,17 @@ public String instrumentedType() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("start") - .and( - isMethod() - .and( - takesArgument(0, named("io.grpc.internal.ClientStreamListener")) - .and(takesArguments(1)))), + .and(isMethod() + .and(takesArgument(0, named("io.grpc.internal.ClientStreamListener")) + .and(takesArguments(1)))), getClass().getName() + "$ActivateSpan"); } public static final class ActivateSpan { @Advice.OnMethodEnter public static AgentScope before(@Advice.Argument(0) ClientStreamListener listener) { - AgentSpan span = - InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class).get(listener); + AgentSpan span = InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class) + .get(listener); if (null != span) { return activateSpan(span); } diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientCallImplInstrumentation.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientCallImplInstrumentation.java index fcb8615aaa2..e61328069aa 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientCallImplInstrumentation.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientCallImplInstrumentation.java @@ -111,7 +111,8 @@ public static void before(@Advice.Argument(1) Metadata headers) { public static final class ActivateSpan { @Advice.OnMethodEnter public static AgentScope before(@Advice.This ClientCall call) { - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); if (null != span) { return activateSpan(span); } @@ -130,7 +131,8 @@ public static final class SendMessage { @Advice.OnMethodEnter public static AgentScope before(@Advice.This ClientCall call) { // could create a message span here for the request - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call); if (span != null) { return activateSpan(span); } @@ -149,7 +151,8 @@ public static final class Cancel { @Advice.OnMethodEnter public static void before( @Advice.This ClientCall call, @Advice.Argument(1) Throwable cause) { - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); if (null != span) { final SocketAddress socketAddress = call.getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR); @@ -168,7 +171,8 @@ public static final class CloseObserver { @Advice.OnMethodExit(onThrowable = Throwable.class) public static void closeObserver( @Advice.This ClientCall call, @Advice.Argument(1) Status status) { - AgentSpan span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); + AgentSpan span = + InstrumentationContext.get(ClientCall.class, AgentSpan.class).remove(call); if (null != span) { final SocketAddress socketAddress = call.getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR); diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java index 953a21be327..f70d78dd855 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java @@ -54,8 +54,8 @@ public static final class ExceptionThrown { public static void exceptionThrown( @Advice.This ClientStreamListener listener, @Advice.Argument(0) Status status) { if (null != status) { - AgentSpan span = - InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class).get(listener); + AgentSpan span = InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class) + .get(listener); if (null != span) { DECORATE.onError(span, status.getCause()); DECORATE.beforeFinish(span); @@ -71,8 +71,8 @@ public static final class RecordActivity { public static AgentScope before(@Advice.This ClientStreamListener listener) { // activate the span so serialisation work is accounted for, whichever thread the work is done // on - AgentSpan span = - InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class).get(listener); + AgentSpan span = InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class) + .get(listener); if (span != null) { return activateSpan(span); } @@ -99,8 +99,8 @@ public static final class RecordHeaders { public static AgentScope before(@Advice.This ClientStreamListener listener) { // activate the span so serialisation work is accounted for, whichever thread the work is done // on - AgentSpan span = - InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class).get(listener); + AgentSpan span = InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class) + .get(listener); if (span != null) { return activateSpan(span); } diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/GrpcClientDecorator.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/GrpcClientDecorator.java index bcf6a5461b5..386ecb7ec91 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/GrpcClientDecorator.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/GrpcClientDecorator.java @@ -29,9 +29,8 @@ import java.util.function.Function; public class GrpcClientDecorator extends ClientDecorator { - public static final CharSequence OPERATION_NAME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().client().operationForProtocol("grpc")); + public static final CharSequence OPERATION_NAME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().client().operationForProtocol("grpc")); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("grpc-client"); public static final CharSequence GRPC_MESSAGE = UTF8BytesString.create("grpc.message"); @@ -44,15 +43,14 @@ private static DataStreamsContext createDsmContext() { private static final Set IGNORED_METHODS = Config.get().getGrpcIgnoredOutboundMethods(); private static final BitSet CLIENT_ERROR_STATUSES = Config.get().getGrpcClientErrorStatuses(); - private static final ClassValue MESSAGE_TYPES = - GenericClassValue.of( - // Uses inner class for predictable name for Instrumenter.Default.helperClassNames() - new Function, UTF8BytesString>() { - @Override - public UTF8BytesString apply(Class input) { - return UTF8BytesString.create(input.getName()); - } - }); + private static final ClassValue MESSAGE_TYPES = GenericClassValue.of( + // Uses inner class for predictable name for Instrumenter.Default.helperClassNames() + new Function, UTF8BytesString>() { + @Override + public UTF8BytesString apply(Class input) { + return UTF8BytesString.create(input.getName()); + } + }); private static final DDCache RPC_SERVICE_CACHE = DDCaches.newFixedSizeCache(64); @@ -97,15 +95,14 @@ public AgentSpan startCall(MethodDescriptor method) { // happen return AgentTracer.blackholeSpan(); } - AgentSpan span = - startSpan(COMPONENT_NAME.toString(), OPERATION_NAME) - .setTag("request.type", requestMessageType(method)) - .setTag("response.type", responseMessageType(method)) - // method.getServiceName() may not be available on some grpc versions - .setTag( - Tags.RPC_SERVICE, - RPC_SERVICE_CACHE.computeIfAbsent( - method.getFullMethodName(), MethodDescriptor::extractFullServiceName)); + AgentSpan span = startSpan(COMPONENT_NAME.toString(), OPERATION_NAME) + .setTag("request.type", requestMessageType(method)) + .setTag("response.type", responseMessageType(method)) + // method.getServiceName() may not be available on some grpc versions + .setTag( + Tags.RPC_SERVICE, + RPC_SERVICE_CACHE.computeIfAbsent( + method.getFullMethodName(), MethodDescriptor::extractFullServiceName)); span.setResourceName(method.getFullMethodName()); afterStart(span); return span; diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/MessagesAvailableInstrumentation.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/MessagesAvailableInstrumentation.java index e72ef5d5431..8edafb5914e 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/MessagesAvailableInstrumentation.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/MessagesAvailableInstrumentation.java @@ -55,9 +55,8 @@ public static final class ReceiveMessages { public static AgentScope before() { AgentSpan clientSpan = activeSpan(); if (clientSpan != null && OPERATION_NAME.equals(clientSpan.getOperationName())) { - AgentSpan messageSpan = - startSpan(COMPONENT_NAME.toString(), GRPC_MESSAGE) - .setTag("message.type", clientSpan.getTag("response.type")); + AgentSpan messageSpan = startSpan(COMPONENT_NAME.toString(), GRPC_MESSAGE) + .setTag("message.type", clientSpan.getTag("response.type")); DECORATE.afterStart(messageSpan); return activateSpan(messageSpan); } diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/GrpcServerDecorator.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/GrpcServerDecorator.java index 0126ae15ad4..3c6751e508c 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/GrpcServerDecorator.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/GrpcServerDecorator.java @@ -28,9 +28,8 @@ public class GrpcServerDecorator extends ServerDecorator { Config.get().isGrpcServerTrimPackageResource(); private static final BitSet SERVER_ERROR_STATUSES = Config.get().getGrpcServerErrorStatuses(); - public static final CharSequence GRPC_SERVER = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().server().operationForProtocol("grpc")); + public static final CharSequence GRPC_SERVER = UTF8BytesString.create( + SpanNaming.instance().namingSchema().server().operationForProtocol("grpc")); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("grpc-server"); public static final CharSequence GRPC_MESSAGE = UTF8BytesString.create("grpc.message"); @@ -88,9 +87,8 @@ protected void doAfterStart(@Nonnull final AgentSpan span) { public void onCall(final AgentSpan span, ServerCall call) { if (TRIM_RESOURCE_PACKAGE_NAME) { - span.setResourceName( - cachedResourceNames.computeIfAbsent( - call.getMethodDescriptor().getFullMethodName(), NORMALIZE)); + span.setResourceName(cachedResourceNames.computeIfAbsent( + call.getMethodDescriptor().getFullMethodName(), NORMALIZE)); } else { span.setResourceName(call.getMethodDescriptor().getFullMethodName()); } diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/TracingServerInterceptor.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/TracingServerInterceptor.java index 7b45d3b1577..49cc0c4c001 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/TracingServerInterceptor.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/TracingServerInterceptor.java @@ -150,9 +150,9 @@ static final class TracingServerCallListener @Override public void onMessage(final ReqT message) { - final AgentSpan msgSpan = - startSpan(COMPONENT_NAME.toString(), GRPC_MESSAGE, this.span.spanContext()) - .setTag("message.type", message.getClass().getName()); + final AgentSpan msgSpan = startSpan( + COMPONENT_NAME.toString(), GRPC_MESSAGE, this.span.spanContext()) + .setTag("message.type", message.getClass().getName()); DECORATE.afterStart(msgSpan); try (ContextScope scope = activateSpan(msgSpan)) { callIGCallbackGrpcMessage(msgSpan, message); diff --git a/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/datadog/trace/instrumentation/guidewire/WsiAsyncResponseInstrumentationTest.java b/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/datadog/trace/instrumentation/guidewire/WsiAsyncResponseInstrumentationTest.java index 0e222537c90..3687882d117 100644 --- a/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/datadog/trace/instrumentation/guidewire/WsiAsyncResponseInstrumentationTest.java +++ b/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/datadog/trace/instrumentation/guidewire/WsiAsyncResponseInstrumentationTest.java @@ -36,22 +36,20 @@ void namedWorkerPropagatesContext() throws Exception { // Constructed and run while the caller's span is active; invoke() blocks until the worker ends. runUnderTrace("parent", () -> new AsyncResponseImpl().invoke()); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("soap.call"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("soap.call"))); } @Test void anonymousWorkerPropagatesContext() throws Exception { runUnderTrace("parent", () -> AsyncResponseImpl.anonymous().invoke()); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("soap.call"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("soap.call"))); } @Test @@ -59,23 +57,20 @@ void synchronousRunPropagatesContext() throws Exception { // callTimeout <= 0 path: AsyncResponseImpl.run() calls _thread.run() on the caller thread. runUnderTrace("parent", () -> new AsyncResponseImpl().invokeSync()); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("soap.call"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("soap.call"))); } @Test void unrelatedThreadIsNotInstrumented() throws Exception { // Same construction pattern, but a class the narrow matcher must ignore. - runUnderTrace( - "parent", - () -> { - UnrelatedWorker worker = new UnrelatedWorker(); - worker.start(); - worker.join(); - }); + runUnderTrace("parent", () -> { + UnrelatedWorker worker = new UnrelatedWorker(); + worker.start(); + worker.join(); + }); // No propagation: the worker's span starts its own trace instead of joining "parent". assertTraces( diff --git a/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/gw/internal/xml/ws/AsyncResponseImpl.java b/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/gw/internal/xml/ws/AsyncResponseImpl.java index b5ff52050f5..b1c0ac773bd 100644 --- a/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/gw/internal/xml/ws/AsyncResponseImpl.java +++ b/dd-java-agent/instrumentation/guidewire-10.0/src/test/java/gw/internal/xml/ws/AsyncResponseImpl.java @@ -16,13 +16,12 @@ public AsyncResponseImpl() { // The boolean only distinguishes this overload from the no-arg constructor; its value is unused. private AsyncResponseImpl(boolean anonymous) { - this.thread = - new Thread() { - @Override - public void run() { - soapCall(); - } - }; + this.thread = new Thread() { + @Override + public void run() { + soapCall(); + } + }; } public static AsyncResponseImpl anonymous() { diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectDecorator.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectDecorator.java index 5deadde66c4..c8d36b03596 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectDecorator.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectDecorator.java @@ -79,9 +79,8 @@ protected String service() { public void onServiceExecution( final AgentSpan span, final DistributedObject object, final String methodName) { - final String objectName = - QUALIFIED_NAME_CACHE.computeIfAbsent( - Pair.of(object.getServiceName(), object.getName()), COMPUTE_QUALIFIED_NAME); + final String objectName = QUALIFIED_NAME_CACHE.computeIfAbsent( + Pair.of(object.getServiceName(), object.getName()), COMPUTE_QUALIFIED_NAME); span.setResourceName(UTF8BytesString.create(String.join(".", objectName, methodName))); diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectInstrumentation.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectInstrumentation.java index 9e17358c1ac..010f60d40a2 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectInstrumentation.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/DistributedObjectInstrumentation.java @@ -54,129 +54,127 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(isPublic()) - .and( - namedOneOf( - "acquire", - "add", - "addAll", - "addAndGet", - "addIndex", - "aggregate", - "availablePermits", - "awaitTermination", - "capacity", - "clear", - "contains", - "containsAll", - "containsEntry", - "containsKey", - "containsValue", - "decrementAndGet", - "delete", - "drainPermits", - "drainTo", - "element", - "entrySet", - "estimate", - "evict", - "evictAll", - "execute", - "executeOnAllMembers", - "executeOnEntries", - "executeOnKey", - "executeOnKeyOwner", - "executeOnKeys", - "executeOnMember", - "executeOnMembers", - "flush", - "forceUnlock", - "get", - "getAll", - "getAndAdd", - "getAndDecrement", - "getAndIncrement", - "getAndSubtract", - "getEntryView", - "getLocalExecutorStats", - "getLockCount", - "getQueryCache", - "getQueryCacheContext", - "getRemainingLeaseTime", - "headSequence", - "increasePermits", - "incrementAndGet", - "indexOf", - "init", - "invokeAll", - "invokeAny", - "isEmpty", - "isLocked", - "isLockedByCurrentThread", - "isShutdown", - "isTerminated", - "iterator", - "keySet", - "lastIndexOf", - "listIterator", - "loadAll", - "lock", - "newCondition", - "newId", - "offer", - "peek", - "poll", - "project", - "publish", - "put", - "putAll", - "putIfAbsent", - "putTransient", - "readFromEventJournal", - "readOne", - "reducePermits", - "release", - "remainingCapacity", - "remove", - "removeAll", - "replace", - "reset", - "retainAll", - "set", - "setTtl", - "shutdown", - "shutdownNow", - "size", - "subList", - "submitToKey", - "submitToKeys", - "subscribeToEventJournal", - "subtractAndGet", - "tailSequence", - "take", - "toArray", - "tryAcquire", - "tryLock", - "tryPut", - "tryRemove", - "unlock", - "valueCount", - "values")), + .and(namedOneOf( + "acquire", + "add", + "addAll", + "addAndGet", + "addIndex", + "aggregate", + "availablePermits", + "awaitTermination", + "capacity", + "clear", + "contains", + "containsAll", + "containsEntry", + "containsKey", + "containsValue", + "decrementAndGet", + "delete", + "drainPermits", + "drainTo", + "element", + "entrySet", + "estimate", + "evict", + "evictAll", + "execute", + "executeOnAllMembers", + "executeOnEntries", + "executeOnKey", + "executeOnKeyOwner", + "executeOnKeys", + "executeOnMember", + "executeOnMembers", + "flush", + "forceUnlock", + "get", + "getAll", + "getAndAdd", + "getAndDecrement", + "getAndIncrement", + "getAndSubtract", + "getEntryView", + "getLocalExecutorStats", + "getLockCount", + "getQueryCache", + "getQueryCacheContext", + "getRemainingLeaseTime", + "headSequence", + "increasePermits", + "incrementAndGet", + "indexOf", + "init", + "invokeAll", + "invokeAny", + "isEmpty", + "isLocked", + "isLockedByCurrentThread", + "isShutdown", + "isTerminated", + "iterator", + "keySet", + "lastIndexOf", + "listIterator", + "loadAll", + "lock", + "newCondition", + "newId", + "offer", + "peek", + "poll", + "project", + "publish", + "put", + "putAll", + "putIfAbsent", + "putTransient", + "readFromEventJournal", + "readOne", + "reducePermits", + "release", + "remainingCapacity", + "remove", + "removeAll", + "replace", + "reset", + "retainAll", + "set", + "setTtl", + "shutdown", + "shutdownNow", + "size", + "subList", + "submitToKey", + "submitToKeys", + "subscribeToEventJournal", + "subtractAndGet", + "tailSequence", + "take", + "toArray", + "tryAcquire", + "tryLock", + "tryPut", + "tryRemove", + "unlock", + "valueCount", + "values")), getClass().getName() + "$SyncAdvice"); // Async transformer.applyAdvice( isMethod() .and(isPublic()) - .and( - namedOneOf( - "addAllAsync", - "addAsync", - "estimateAsync", - "getAsync", - "putAsync", - "readManyAsync", - "removeAsync", - "setAsync")) + .and(namedOneOf( + "addAllAsync", + "addAsync", + "estimateAsync", + "getAsync", + "putAsync", + "readManyAsync", + "removeAsync", + "setAsync")) .and(returns(NameMatchers.named("com.hazelcast.core.ICompletableFuture"))), getClass().getName() + "$CompletableFutureAdvice"); } diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/HazelcastConstants.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/HazelcastConstants.java index 12adc01646f..209c0751f20 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/HazelcastConstants.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.6/src/main/java/datadog/trace/instrumentation/hazelcast36/HazelcastConstants.java @@ -12,8 +12,7 @@ public class HazelcastConstants { public static final String HAZELCAST_OPERATION = "hazelcast.operation"; public static final String HAZELCAST_INSTANCE = "hazelcast.instance"; - public static final CharSequence SPAN_NAME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().cache().operation(INSTRUMENTATION_NAME)); + public static final CharSequence SPAN_NAME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().cache().operation(INSTRUMENTATION_NAME)); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("hazelcast-sdk"); } diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/ClientInvocationInstrumentation.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/ClientInvocationInstrumentation.java index 071003b4e22..95a46e9cb48 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/ClientInvocationInstrumentation.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/ClientInvocationInstrumentation.java @@ -38,12 +38,11 @@ public void methodAdvice(MethodTransformer transformer) { isMethod().and(named("invokeOnSelection")), getClass().getName() + "$InvocationAdvice"); transformer.applyAdvice( isConstructor() - .and( - takesArgument( - 0, - namedOneOf( - "com.hazelcast.client.impl.HazelcastClientInstanceImpl", - "com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl"))), + .and(takesArgument( + 0, + namedOneOf( + "com.hazelcast.client.impl.HazelcastClientInstanceImpl", + "com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl"))), getClass().getName() + "$ConstructAdvice"); } diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/HazelcastConstants.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/HazelcastConstants.java index 4b128dd3bfd..b69afc04b6f 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/HazelcastConstants.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-3.9/src/main/java/datadog/trace/instrumentation/hazelcast39/HazelcastConstants.java @@ -16,8 +16,7 @@ public class HazelcastConstants { public static final String HAZELCAST_INSTANCE = "hazelcast.instance"; public static final String HAZELCAST_CORRELATION_ID = "hazelcast.correlationId"; - public static final CharSequence SPAN_NAME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().cache().operation(INSTRUMENTATION_NAME)); + public static final CharSequence SPAN_NAME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().cache().operation(INSTRUMENTATION_NAME)); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("hazelcast-sdk"); } diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientInvocationInstrumentation.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientInvocationInstrumentation.java index 01135b2cc57..dd00abf714f 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientInvocationInstrumentation.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientInvocationInstrumentation.java @@ -27,9 +27,8 @@ public void methodAdvice(MethodTransformer transformer) { "datadog.trace.instrumentation.hazelcast4.InvocationAdvice"); transformer.applyAdvice( isConstructor() - .and( - takesArgument( - 0, named("com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl"))), + .and(takesArgument( + 0, named("com.hazelcast.client.impl.clientside.HazelcastClientInstanceImpl"))), getClass().getName() + "$ConstructAdvice"); } diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientListenerInstrumentation.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientListenerInstrumentation.java index e325b1ff49e..49887904e19 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/ClientListenerInstrumentation.java @@ -45,10 +45,9 @@ public static AgentScope methodEnter( @Advice.This final ClientListenerService that, @Advice.Argument(0) final ClientMessage clientMessage) { - final String operationName = - clientMessage.getOperationName() != null - ? clientMessage.getOperationName() - : "Event.Handle"; + final String operationName = clientMessage.getOperationName() != null + ? clientMessage.getOperationName() + : "Event.Handle"; long correlationId = clientMessage.getCorrelationId(); // Ensure that we only create a span for the top-level Hazelcast method; except in the diff --git a/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/HazelcastConstants.java b/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/HazelcastConstants.java index 6c9cbb7b646..3b15843eca5 100644 --- a/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/HazelcastConstants.java +++ b/dd-java-agent/instrumentation/hazelcast/hazelcast-4.0/src/main/java/datadog/trace/instrumentation/hazelcast4/HazelcastConstants.java @@ -16,8 +16,7 @@ public class HazelcastConstants { public static final String HAZELCAST_INSTANCE = "hazelcast.instance"; public static final String HAZELCAST_CORRELATION_ID = "hazelcast.correlationId"; - public static final CharSequence SPAN_NAME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().cache().operation(INSTRUMENTATION_NAME)); + public static final CharSequence SPAN_NAME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().cache().operation(INSTRUMENTATION_NAME)); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("hazelcast-sdk"); } diff --git a/dd-java-agent/instrumentation/hibernate/hibernate-common/src/main/java/datadog/trace/instrumentation/hibernate/SessionMethodUtils.java b/dd-java-agent/instrumentation/hibernate/hibernate-common/src/main/java/datadog/trace/instrumentation/hibernate/SessionMethodUtils.java index 3f7fdd6bdff..f3da5fbd99a 100644 --- a/dd-java-agent/instrumentation/hibernate/hibernate-common/src/main/java/datadog/trace/instrumentation/hibernate/SessionMethodUtils.java +++ b/dd-java-agent/instrumentation/hibernate/hibernate-common/src/main/java/datadog/trace/instrumentation/hibernate/SessionMethodUtils.java @@ -41,8 +41,8 @@ public static SessionState startScopeFrom( final AgentScope scope; if (createSpan) { - final AgentSpan span = - startSpan("java-hibernate", operationName, sessionState.getSessionSpan().spanContext()); + final AgentSpan span = startSpan( + "java-hibernate", operationName, sessionState.getSessionSpan().spanContext()); DECORATOR.afterStart(span); DECORATOR.onOperation(span, entity); scope = activateSpan(span); diff --git a/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionFactoryInstrumentation.java b/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionFactoryInstrumentation.java index be7f635672c..fca00c7a42d 100644 --- a/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionFactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionFactoryInstrumentation.java @@ -45,10 +45,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(namedOneOf("openSession", "openStatelessSession")) .and(takesArguments(0)) - .and( - returns( - namedOneOf("org.hibernate.Session", "org.hibernate.StatelessSession") - .or(hasInterface(named("org.hibernate.Session"))))), + .and(returns(namedOneOf("org.hibernate.Session", "org.hibernate.StatelessSession") + .or(hasInterface(named("org.hibernate.Session"))))), SessionFactoryInstrumentation.class.getName() + "$SessionFactoryAdvice"); } diff --git a/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionInstrumentation.java b/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionInstrumentation.java index 108cbcdaa75..a5c7f9703b8 100644 --- a/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/hibernate-core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/SessionInstrumentation.java @@ -31,8 +31,7 @@ public final class SessionInstrumentation extends AbstractHibernateInstrumentation { @Override public String[] knownMatchingTypes() { - return new String[] { - "org.hibernate.impl.SessionImpl", "org.hibernate.impl.StatelessSessionImpl" + return new String[] {"org.hibernate.impl.SessionImpl", "org.hibernate.impl.StatelessSessionImpl" }; } @@ -56,23 +55,22 @@ public void methodAdvice(MethodTransformer transformer) { // Session synchronous methods we want to instrument. transformer.applyAdvice( isMethod() - .and( - namedOneOf( - "save", - "replicate", - "saveOrUpdate", - "update", - "merge", - "persist", - "lock", - "refresh", - "insert", - "delete", - // Iterator methods. - "iterate", - // Lazy-load methods. - "immediateLoad", - "internalLoad")), + .and(namedOneOf( + "save", + "replicate", + "saveOrUpdate", + "update", + "merge", + "persist", + "lock", + "refresh", + "insert", + "delete", + // Iterator methods. + "iterate", + // Lazy-load methods. + "immediateLoad", + "internalLoad")), SessionInstrumentation.class.getName() + "$SessionMethodAdvice"); // Handle the non-generic 'get' separately. diff --git a/dd-java-agent/instrumentation/hibernate/hibernate-core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java b/dd-java-agent/instrumentation/hibernate/hibernate-core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java index 310ce821165..247123b5a4d 100644 --- a/dd-java-agent/instrumentation/hibernate/hibernate-core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/hibernate-core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/SessionInstrumentation.java @@ -53,23 +53,22 @@ public void methodAdvice(MethodTransformer transformer) { // Session synchronous methods we want to instrument. transformer.applyAdvice( isMethod() - .and( - namedOneOf( - "save", - "replicate", - "saveOrUpdate", - "update", - "merge", - "persist", - "lock", - "refresh", - "insert", - "delete", - // Iterator methods. - "iterate", - // Lazy-load methods. - "immediateLoad", - "internalLoad")), + .and(namedOneOf( + "save", + "replicate", + "saveOrUpdate", + "update", + "merge", + "persist", + "lock", + "refresh", + "insert", + "delete", + // Iterator methods. + "iterate", + // Lazy-load methods. + "immediateLoad", + "internalLoad")), SessionInstrumentation.class.getName() + "$SessionMethodAdvice"); // Handle the non-generic 'get' separately. transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/hibernate/hibernate-core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java b/dd-java-agent/instrumentation/hibernate/hibernate-core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java index ba6651816dd..df063fc1bb2 100644 --- a/dd-java-agent/instrumentation/hibernate/hibernate-core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/hibernate-core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java @@ -57,9 +57,8 @@ public static SessionState startMethod( final ContextStore contextStore = InstrumentationContext.get(ProcedureCall.class, SessionState.class); - final SessionState state = - SessionMethodUtils.startScopeFrom( - contextStore, call, operationName, call.getProcedureName(), true); + final SessionState state = SessionMethodUtils.startScopeFrom( + contextStore, call, operationName, call.getProcedureName(), true); return state; } diff --git a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixDecorator.java b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixDecorator.java index 9a39c235052..283d322143e 100644 --- a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixDecorator.java +++ b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixDecorator.java @@ -97,11 +97,10 @@ public void onCommand( if (measured) { span.setMeasured(true); } - span.setResourceName( - RESOURCE_NAME_CACHE.computeIfAbsent( - new ResourceNameCacheKey( - command.getCommandGroup().name(), command.getCommandKey().name(), methodName), - TO_STRING)); + span.setResourceName(RESOURCE_NAME_CACHE.computeIfAbsent( + new ResourceNameCacheKey( + command.getCommandGroup().name(), command.getCommandKey().name(), methodName), + TO_STRING)); } } } diff --git a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java index 1026c9754f5..00e317893ee 100644 --- a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java +++ b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java @@ -29,9 +29,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { - return extendsClass( - namedOneOf( - "com.netflix.hystrix.HystrixCommand", "com.netflix.hystrix.HystrixObservableCommand")); + return extendsClass(namedOneOf( + "com.netflix.hystrix.HystrixCommand", "com.netflix.hystrix.HystrixObservableCommand")); } @Override diff --git a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/IgniteInstrumentation.java b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/IgniteInstrumentation.java index 715144d263f..db948dbd7df 100644 --- a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/IgniteInstrumentation.java +++ b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/IgniteInstrumentation.java @@ -35,13 +35,12 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(isPublic()) - .and( - namedOneOf( - "createCache", - "getOrCreateCache", - "cache", - "createNearCache", - "getOrCreateNearCache")) + .and(namedOneOf( + "createCache", + "getOrCreateCache", + "cache", + "createNearCache", + "getOrCreateNearCache")) .and(returns(hasInterface(named("org.apache.ignite.IgniteCache")))), IgniteInstrumentation.class.getName() + "$IgniteCacheAdvice"); transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheAsyncInstrumentation.java b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheAsyncInstrumentation.java index efdad2f73bc..d99f036228c 100644 --- a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheAsyncInstrumentation.java +++ b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheAsyncInstrumentation.java @@ -23,37 +23,35 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(isPublic()) - .and( - namedOneOf( - "loadCacheAsync", - "sizeAsync", - "sizeLongAsync", - "invokeAllAsync", - "getAllAsync", - "getEntriesAsync", - "getAllOutTxAsync", - "containsKeysAsync", - "putAllAsync", - "removeAllAsync")), + .and(namedOneOf( + "loadCacheAsync", + "sizeAsync", + "sizeLongAsync", + "invokeAllAsync", + "getAllAsync", + "getEntriesAsync", + "getAllOutTxAsync", + "containsKeysAsync", + "putAllAsync", + "removeAllAsync")), IgniteCacheAsyncInstrumentation.class.getName() + "$IgniteAdvice"); transformer.applyAdvice( isMethod() .and(isPublic()) - .and( - namedOneOf( - "getAndPutIfAbsentAsync", - "getAsync", - "getEntryAsync", - "containsKeyAsync", - "getAndPutAsync", - "putAsync", - "putIfAbsentAsync", - "removeAsync", - "getAndRemoveAsync", - "replaceAsync", - "getAndReplaceAsync", - "clearAsync", - "invokeAsync")), + .and(namedOneOf( + "getAndPutIfAbsentAsync", + "getAsync", + "getEntryAsync", + "containsKeyAsync", + "getAndPutAsync", + "putAsync", + "putIfAbsentAsync", + "removeAsync", + "getAndRemoveAsync", + "replaceAsync", + "getAndReplaceAsync", + "clearAsync", + "invokeAsync")), IgniteCacheAsyncInstrumentation.class.getName() + "$KeyedAdvice"); } diff --git a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheSyncInstrumentation.java b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheSyncInstrumentation.java index c97b0d66fa6..afb53e60fbd 100644 --- a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheSyncInstrumentation.java +++ b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteCacheSyncInstrumentation.java @@ -25,48 +25,45 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(isPublic()) - .and( - namedOneOf( - "loadCache", - "size", - "sizeLong", - "invokeAll", - "getAll", - "getEntries", - "getAllOutTx", - "containsKeys", - "putAll", - "removeAll")), + .and(namedOneOf( + "loadCache", + "size", + "sizeLong", + "invokeAll", + "getAll", + "getEntries", + "getAllOutTx", + "containsKeys", + "putAll", + "removeAll")), IgniteCacheSyncInstrumentation.class.getName() + "$IgniteAdvice"); transformer.applyAdvice( isMethod() .and(isPublic()) - .and( - namedOneOf( - "getAndPutIfAbsent", - "get", - "getEntry", - "containsKey", - "getAndPut", - "put", - "putIfAbsent", - "remove", - "getAndRemove", - "replace", - "getAndReplace", - "clear", - "invoke")), + .and(namedOneOf( + "getAndPutIfAbsent", + "get", + "getEntry", + "containsKey", + "getAndPut", + "put", + "putIfAbsent", + "remove", + "getAndRemove", + "replace", + "getAndReplace", + "clear", + "invoke")), IgniteCacheSyncInstrumentation.class.getName() + "$KeyedAdvice"); transformer.applyAdvice( isMethod() .and(isPublic()) .and(named("query")) - .and( - takesArgument( - 0, - namedOneOf( - "org.apache.ignite.cache.query.Query", - "org.apache.ignite.cache.query.SqlFieldsQuery"))), + .and(takesArgument( + 0, + namedOneOf( + "org.apache.ignite.cache.query.Query", + "org.apache.ignite.cache.query.SqlFieldsQuery"))), IgniteCacheSyncInstrumentation.class.getName() + "$QueryAdvice"); } diff --git a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteQueryInfo.java b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteQueryInfo.java index 391f63737cc..a06d86913eb 100644 --- a/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteQueryInfo.java +++ b/dd-java-agent/instrumentation/ignite-2.0/src/main/java/datadog/trace/instrumentation/ignite/v2/cache/IgniteQueryInfo.java @@ -49,23 +49,22 @@ public static IgniteQueryInfo ofPreparedStatement(String sql, String type) { static { Map validDbOperations = new HashMap<>(); - for (String op : - Arrays.asList( - "SELECT", - "INSERT", - "DELETE", - "UPDATE", - "CREATE", - "ALTER", - "DROP", - "TRUNCATE", - "GRANT", - "COMMIT", - "REVOKE", - "ROLLBACK", - "SAVEPOINT", - "WITH", - "MERGE")) { + for (String op : Arrays.asList( + "SELECT", + "INSERT", + "DELETE", + "UPDATE", + "CREATE", + "ALTER", + "DROP", + "TRUNCATE", + "GRANT", + "COMMIT", + "REVOKE", + "ROLLBACK", + "SAVEPOINT", + "WITH", + "MERGE")) { validDbOperations.put(op, UTF8BytesString.create(op)); } VALID_DB_OPERATIONS = Collections.unmodifiableMap(validDbOperations); diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1FactoryInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1FactoryInstrumentation.java index d8700f2bb66..f1581b0bd23 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1FactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1FactoryInstrumentation.java @@ -33,12 +33,11 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("createJsonParser") .and(isMethod()) - .and( - takesArguments(String.class) - .or(takesArguments(InputStream.class)) - .or(takesArguments(Reader.class)) - .or(takesArguments(URL.class)) - .or(takesArguments(byte[].class))), + .and(takesArguments(String.class) + .or(takesArguments(InputStream.class)) + .or(takesArguments(Reader.class)) + .or(takesArguments(URL.class)) + .or(takesArguments(byte[].class))), Json1FactoryInstrumentation.class.getName() + "$InstrumenterAdvice"); transformer.applyAdvice( named("createJsonParser") diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1ParserInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1ParserInstrumentation.java index ea6387c8908..c52f527bd42 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1ParserInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-1.9.13/src/main/java/datadog/trace/instrumentation/jackson/codehouse/core/Json1ParserInstrumentation.java @@ -53,9 +53,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { - return extendsClass( - named(hierarchyMarkerType()) - .and(namedNoneOf("org.codehaus.jackson.impl.JsonParserMinimalBase"))) + return extendsClass(named(hierarchyMarkerType()) + .and(namedNoneOf("org.codehaus.jackson.impl.JsonParserMinimalBase"))) .and(declaresMethod(namedOneOf("getText", "getCurrentName"))); } diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.0/src/main/java/datadog/trace/instrumentation/jackson_2/core/JsonParserInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.0/src/main/java/datadog/trace/instrumentation/jackson_2/core/JsonParserInstrumentation.java index a7dfff9762d..bc95d1f26ed 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.0/src/main/java/datadog/trace/instrumentation/jackson_2/core/JsonParserInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.0/src/main/java/datadog/trace/instrumentation/jackson_2/core/JsonParserInstrumentation.java @@ -58,9 +58,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return declaresMethod(namedOneOf("getCurrentName", "nextFieldName")) - .and( - extendsClass(named(hierarchyMarkerType())) - .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); + .and(extendsClass(named(hierarchyMarkerType())) + .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); } @Override diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.12/src/main/java/datadog/trace/instrumentation/jackson_2_12/core/JsonParserInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.12/src/main/java/datadog/trace/instrumentation/jackson_2_12/core/JsonParserInstrumentation.java index 6f207b58c4a..ba6bfef32d0 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.12/src/main/java/datadog/trace/instrumentation/jackson_2_12/core/JsonParserInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.12/src/main/java/datadog/trace/instrumentation/jackson_2_12/core/JsonParserInstrumentation.java @@ -60,9 +60,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return declaresMethod(namedOneOf("getCurrentName", "nextFieldName")) - .and( - extendsClass(named(hierarchyMarkerType())) - .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); + .and(extendsClass(named(hierarchyMarkerType())) + .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); } @Override diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.16/src/main/java/datadog/trace/instrumentation/jackson_2_16/core/JsonParserInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.16/src/main/java/datadog/trace/instrumentation/jackson_2_16/core/JsonParserInstrumentation.java index 81624a1d64c..d338e9ec9d7 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.16/src/main/java/datadog/trace/instrumentation/jackson_2_16/core/JsonParserInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.16/src/main/java/datadog/trace/instrumentation/jackson_2_16/core/JsonParserInstrumentation.java @@ -58,9 +58,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return declaresMethod(namedOneOf("getCurrentName", "nextFieldName")) - .and( - extendsClass(named(hierarchyMarkerType())) - .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); + .and(extendsClass(named(hierarchyMarkerType())) + .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); } @Override diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.6/src/main/java/datadog/trace/instrumentation/jackson_2_6/core/JsonParserInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.6/src/main/java/datadog/trace/instrumentation/jackson_2_6/core/JsonParserInstrumentation.java index 1f427d982ba..bf92358cfd9 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.6/src/main/java/datadog/trace/instrumentation/jackson_2_6/core/JsonParserInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.6/src/main/java/datadog/trace/instrumentation/jackson_2_6/core/JsonParserInstrumentation.java @@ -60,9 +60,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return declaresMethod(namedOneOf("getCurrentName", "nextFieldName")) - .and( - extendsClass(named(hierarchyMarkerType())) - .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); + .and(extendsClass(named(hierarchyMarkerType())) + .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); } @Override diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.8/src/main/java/datadog/trace/instrumentation/jackson_2_8/core/JsonParserInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.8/src/main/java/datadog/trace/instrumentation/jackson_2_8/core/JsonParserInstrumentation.java index b0cb0043e27..1930d231bd4 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-2.8/src/main/java/datadog/trace/instrumentation/jackson_2_8/core/JsonParserInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-2.8/src/main/java/datadog/trace/instrumentation/jackson_2_8/core/JsonParserInstrumentation.java @@ -60,9 +60,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return declaresMethod(namedOneOf("getCurrentName", "nextFieldName")) - .and( - extendsClass(named(hierarchyMarkerType())) - .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); + .and(extendsClass(named(hierarchyMarkerType())) + .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); } @Override diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/Json2FactoryInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/Json2FactoryInstrumentation.java index ff0465fec40..120b0038833 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/Json2FactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/Json2FactoryInstrumentation.java @@ -33,14 +33,12 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("createParser") .and(isMethod()) - .and( - isPublic() - .and( - takesArguments(String.class) - .or(takesArguments(InputStream.class)) - .or(takesArguments(Reader.class)) - .or(takesArguments(URL.class)) - .or(takesArguments(byte[].class)))), + .and(isPublic() + .and(takesArguments(String.class) + .or(takesArguments(InputStream.class)) + .or(takesArguments(Reader.class)) + .or(takesArguments(URL.class)) + .or(takesArguments(byte[].class)))), Json2FactoryInstrumentation.class.getName() + "$InstrumenterAdvice"); transformer.applyAdvice( named("createParser") diff --git a/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/JsonParserInstrumentation.java b/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/JsonParserInstrumentation.java index fc4b3f59ce2..47ad74f6527 100644 --- a/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/JsonParserInstrumentation.java +++ b/dd-java-agent/instrumentation/jackson-core/jackson-core-common/src/main/java/datadog/trace/instrumentation/jackson/core/JsonParserInstrumentation.java @@ -53,9 +53,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return declaresMethod(namedOneOf("getText", "getValueAsString")) - .and( - extendsClass(named(hierarchyMarkerType())) - .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); + .and(extendsClass(named(hierarchyMarkerType())) + .and(namedNoneOf("com.fasterxml.jackson.core.base.ParserMinimalBase"))); } @Override diff --git a/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/MethodVisitorWrapper.java b/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/MethodVisitorWrapper.java index 8b80d00ce30..7e48ebe34ab 100644 --- a/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/MethodVisitorWrapper.java +++ b/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/MethodVisitorWrapper.java @@ -30,16 +30,15 @@ public class MethodVisitorWrapper { MethodHandles.Lookup lookup = MethodHandles.lookup(); Class shadedMethodVisitorClass = getJacocoClass(jacocoClassLoader, jacocoPackageName, ".asm.MethodVisitor"); - visitMethodInsnHandle = - accessMethod( - lookup, - shadedMethodVisitorClass, - "visitMethodInsn", - int.class, - String.class, - String.class, - String.class, - boolean.class); + visitMethodInsnHandle = accessMethod( + lookup, + shadedMethodVisitorClass, + "visitMethodInsn", + int.class, + String.class, + String.class, + String.class, + boolean.class); visitInsnHandle = accessMethod(lookup, shadedMethodVisitorClass, "visitInsn", int.class); visitIntInsnHandle = accessMethod(lookup, shadedMethodVisitorClass, "visitIntInsn", int.class, int.class); diff --git a/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/ProbeInserterInstrumentation.java b/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/ProbeInserterInstrumentation.java index 695b659d6e1..4490f98988b 100644 --- a/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/ProbeInserterInstrumentation.java +++ b/dd-java-agent/instrumentation/jacoco-0.8.9/src/main/java/datadog/trace/instrumentation/jacoco/ProbeInserterInstrumentation.java @@ -65,35 +65,24 @@ private static ElementMatcher.Junction arrayStrategyType() { @SuppressForbidden private ElementMatcher methodVisitor() { return named("mv") - .and( - fieldType( - nameStartsWith("org.jacoco.agent.rt.internal") - .and(nameEndsWith(".asm.MethodVisitor")) - .and( - declaresMethod( - named("visitMethodInsn") - .and(takesArguments(5)) - .and(takesArgument(0, int.class)) - .and(takesArgument(1, String.class)) - .and(takesArgument(2, String.class)) - .and(takesArgument(3, String.class)) - .and(takesArgument(4, boolean.class)))) - .and( - declaresMethod( - named("visitInsn") - .and(takesArguments(1)) - .and(takesArgument(0, int.class)))) - .and( - declaresMethod( - named("visitIntInsn") - .and(takesArguments(2)) - .and(takesArgument(0, int.class)) - .and(takesArgument(1, int.class)))) - .and( - declaresMethod( - named("visitLdcInsn") - .and(takesArguments(1)) - .and(takesArgument(0, Object.class)))))); + .and(fieldType(nameStartsWith("org.jacoco.agent.rt.internal") + .and(nameEndsWith(".asm.MethodVisitor")) + .and(declaresMethod(named("visitMethodInsn") + .and(takesArguments(5)) + .and(takesArgument(0, int.class)) + .and(takesArgument(1, String.class)) + .and(takesArgument(2, String.class)) + .and(takesArgument(3, String.class)) + .and(takesArgument(4, boolean.class)))) + .and(declaresMethod( + named("visitInsn").and(takesArguments(1)).and(takesArgument(0, int.class)))) + .and(declaresMethod(named("visitIntInsn") + .and(takesArguments(2)) + .and(takesArgument(0, int.class)) + .and(takesArgument(1, int.class)))) + .and(declaresMethod(named("visitLdcInsn") + .and(takesArguments(1)) + .and(takesArgument(0, Object.class)))))); } @Override diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/completablefuture/CompletableFutureModule.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/completablefuture/CompletableFutureModule.java index 04891d10086..6a35b36bc09 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/completablefuture/CompletableFutureModule.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/completablefuture/CompletableFutureModule.java @@ -48,39 +48,38 @@ public Map contextStore() { excludedRunnableClasses.addAll(asList(CLASS_NAMES)); if (isEnabled()) { // CompletableFutureUniCompletionInstrumentation - final List unicompletionClasses = - asList( - // This is not a subclass of UniCompletion and doesn't have a dependent - // CompletableFuture - "java.util.concurrent.CompletableFuture$Completion", - "java.util.concurrent.CompletableFuture$UniCompletion", - "java.util.concurrent.CompletableFuture$UniApply", - "java.util.concurrent.CompletableFuture$UniAccept", - "java.util.concurrent.CompletableFuture$UniRun", - "java.util.concurrent.CompletableFuture$UniWhenComplete", - "java.util.concurrent.CompletableFuture$UniHandle", - "java.util.concurrent.CompletableFuture$UniExceptionally", - "java.util.concurrent.CompletableFuture$UniComposeExceptionally", - "java.util.concurrent.CompletableFuture$UniRelay", - "java.util.concurrent.CompletableFuture$UniCompose", - "java.util.concurrent.CompletableFuture$BiCompletion", - // This is not a subclass of UniCompletion and doesn't have a dependent - // CompletableFuture - // "java.util.concurrent.CompletableFuture$CoCompletion", - "java.util.concurrent.CompletableFuture$BiApply", - "java.util.concurrent.CompletableFuture$BiAccept", - "java.util.concurrent.CompletableFuture$BiRun", - "java.util.concurrent.CompletableFuture$BiRelay", - "java.util.concurrent.CompletableFuture$OrApply", - "java.util.concurrent.CompletableFuture$OrAccept", - "java.util.concurrent.CompletableFuture$OrRun" - // This is not a subclass of UniCompletion and doesn't have a dependent - // CompletableFuture - // "java.util.concurrent.CompletableFuture$AnyOf", - // This is not a subclass of UniCompletion and doesn't have a dependent - // CompletableFuture - // "java.util.concurrent.CompletableFuture$Signaller", - ); + final List unicompletionClasses = asList( + // This is not a subclass of UniCompletion and doesn't have a dependent + // CompletableFuture + "java.util.concurrent.CompletableFuture$Completion", + "java.util.concurrent.CompletableFuture$UniCompletion", + "java.util.concurrent.CompletableFuture$UniApply", + "java.util.concurrent.CompletableFuture$UniAccept", + "java.util.concurrent.CompletableFuture$UniRun", + "java.util.concurrent.CompletableFuture$UniWhenComplete", + "java.util.concurrent.CompletableFuture$UniHandle", + "java.util.concurrent.CompletableFuture$UniExceptionally", + "java.util.concurrent.CompletableFuture$UniComposeExceptionally", + "java.util.concurrent.CompletableFuture$UniRelay", + "java.util.concurrent.CompletableFuture$UniCompose", + "java.util.concurrent.CompletableFuture$BiCompletion", + // This is not a subclass of UniCompletion and doesn't have a dependent + // CompletableFuture + // "java.util.concurrent.CompletableFuture$CoCompletion", + "java.util.concurrent.CompletableFuture$BiApply", + "java.util.concurrent.CompletableFuture$BiAccept", + "java.util.concurrent.CompletableFuture$BiRun", + "java.util.concurrent.CompletableFuture$BiRelay", + "java.util.concurrent.CompletableFuture$OrApply", + "java.util.concurrent.CompletableFuture$OrAccept", + "java.util.concurrent.CompletableFuture$OrRun" + // This is not a subclass of UniCompletion and doesn't have a dependent + // CompletableFuture + // "java.util.concurrent.CompletableFuture$AnyOf", + // This is not a subclass of UniCompletion and doesn't have a dependent + // CompletableFuture + // "java.util.concurrent.CompletableFuture$Signaller", + ); excludedRunnableClasses.addAll(unicompletionClasses); excludedExecutorClasses.addAll(unicompletionClasses); excludedForkJoinClass.addAll(unicompletionClasses); diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java index 2eadfb0cfe9..8e62aa362a9 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java @@ -33,14 +33,13 @@ public AsyncPropagatingDisableInstrumentation() { private static final ElementMatcher.Junction RX_WORKERS = nameStartsWith("rx.").and(extendsClass(named("rx.Scheduler$Worker"))); - private static final ElementMatcher NETTY_UNSAFE = - namedOneOf( - "io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe", - "io.grpc.netty.shaded.io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe", - "io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe", - "io.grpc.netty.shaded.io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe", - "io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe", - "io.grpc.netty.shaded.io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe"); + private static final ElementMatcher NETTY_UNSAFE = namedOneOf( + "io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe", + "io.grpc.netty.shaded.io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe", + "io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe", + "io.grpc.netty.shaded.io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe", + "io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe", + "io.grpc.netty.shaded.io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe"); private static final ElementMatcher GRPC_MANAGED_CHANNEL = nameEndsWith("io.grpc.internal.ManagedChannelImpl"); private static final ElementMatcher REACTOR_DISABLED_TYPE_INITIALIZERS = @@ -55,11 +54,10 @@ public AsyncPropagatingDisableInstrumentation() { private static final ElementMatcher RXJAVA3_DISABLED_TYPE_INITIALIZERS = named("io.reactivex.rxjava3.internal.schedulers.AbstractDirectTask"); - private static final ElementMatcher NETTY_GLOBAL_EVENT_EXECUTOR = - namedOneOf( - "io.netty.util.concurrent.GlobalEventExecutor", - // shaded version - "io.grpc.netty.shaded.io.netty.util.concurrent.GlobalEventExecutor"); + private static final ElementMatcher NETTY_GLOBAL_EVENT_EXECUTOR = namedOneOf( + "io.netty.util.concurrent.GlobalEventExecutor", + // shaded version + "io.grpc.netty.shaded.io.netty.util.concurrent.GlobalEventExecutor"); private static final ElementMatcher JAVA_HTTP_CLIENT = extendsClass(named("java.net.http.HttpClient")); private static final String LETTUCE_HANDSHAKE_HANDLER = @@ -166,10 +164,8 @@ public void methodAdvice(MethodTransformer transformer) { advice); transformer.applyAdvice( named("runOnEventLoop") - .and( - isDeclaredBy( - named( - "com.datastax.oss.driver.internal.core.channel.DefaultWriteCoalescer$Flusher"))), + .and(isDeclaredBy(named( + "com.datastax.oss.driver.internal.core.channel.DefaultWriteCoalescer$Flusher"))), advice); transformer.applyAdvice( named("buildAsync") @@ -187,9 +183,8 @@ public void methodAdvice(MethodTransformer transformer) { advice); transformer.applyAdvice( named("doRescheduleTask") - .and( - isDeclaredBy( - named("org.springframework.jms.listener.DefaultMessageListenerContainer"))), + .and(isDeclaredBy( + named("org.springframework.jms.listener.DefaultMessageListenerContainer"))), advice); transformer.applyAdvice( named("beginTransaction") @@ -197,10 +192,8 @@ public void methodAdvice(MethodTransformer transformer) { advice); transformer.applyAdvice( named("initUnlessClosed") - .and( - isDeclaredBy( - named( - "com.mongodb.internal.connection.DefaultConnectionPool$AsyncWorkManager"))), + .and(isDeclaredBy( + named("com.mongodb.internal.connection.DefaultConnectionPool$AsyncWorkManager"))), advice); transformer.applyAdvice( isTypeInitializer().and(isDeclaredBy(REACTOR_DISABLED_TYPE_INITIALIZERS)), advice); diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/RejectedExecutionHandlerInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/RejectedExecutionHandlerInstrumentation.java index e8b7b9effd3..d6c471b1af5 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/RejectedExecutionHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/RejectedExecutionHandlerInstrumentation.java @@ -50,9 +50,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { - return implementsInterface( - named("java.util.concurrent.RejectedExecutionHandler") - .or(nameEndsWith("netty.util.concurrent.RejectedExecutionHandler"))); + return implementsInterface(named("java.util.concurrent.RejectedExecutionHandler") + .or(nameEndsWith("netty.util.concurrent.RejectedExecutionHandler"))); } @Override diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/ThreadPoolExecutorInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/ThreadPoolExecutorInstrumentation.java index b7340c0f434..a783025c167 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/ThreadPoolExecutorInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/ThreadPoolExecutorInstrumentation.java @@ -59,10 +59,8 @@ public final class ThreadPoolExecutorInstrumentation // executors which do their own wrapping before calling super, // leading to double wrapping, once at the child level and once // in ThreadPoolExecutor - private static final ElementMatcher NO_WRAPPING_BEFORE_DELEGATION = - not( - isDeclaredBy( - namedOneOf("org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor"))); + private static final ElementMatcher NO_WRAPPING_BEFORE_DELEGATION = not( + isDeclaredBy(namedOneOf("org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor"))); @Override public String hierarchyMarkerType() { diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/forkjoin/JavaForkJoinWorkQueueInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/forkjoin/JavaForkJoinWorkQueueInstrumentation.java index 3be741c9908..bab19186364 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/forkjoin/JavaForkJoinWorkQueueInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/forkjoin/JavaForkJoinWorkQueueInstrumentation.java @@ -63,10 +63,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(named("push")) .and(takesArgument(0, named("java.util.concurrent.ForkJoinTask"))) - .and( - isDeclaredBy( - declaresField(fieldType(int.class).and(named("top"))) - .and(declaresField(fieldType(int.class).and(named("base")))))), + .and(isDeclaredBy(declaresField(fieldType(int.class).and(named("top"))) + .and(declaresField(fieldType(int.class).and(named("base")))))), name + "$PushTask"); } diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/runnable/RunnableFutureInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/runnable/RunnableFutureInstrumentation.java index 4b560dc541f..64710c0a564 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/runnable/RunnableFutureInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/runnable/RunnableFutureInstrumentation.java @@ -53,13 +53,9 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return notExcludedByName(RUNNABLE_FUTURE) - .and( - extendsClass( - named("java.util.concurrent.FutureTask") - .or(nameEndsWith(".netty.util.concurrent.PromiseTask")) - .or( - nameEndsWith( - "com.google.common.util.concurrent.TrustedListenableFutureTask")))); + .and(extendsClass(named("java.util.concurrent.FutureTask") + .or(nameEndsWith(".netty.util.concurrent.PromiseTask")) + .or(nameEndsWith("com.google.common.util.concurrent.TrustedListenableFutureTask")))); } @Override @@ -73,15 +69,11 @@ public void methodAdvice(MethodTransformer transformer) { // but only instrument the PromiseTask constructor with a Callable argument transformer.applyAdvice( isConstructor() - .and( - isDeclaredBy( - named("java.util.concurrent.FutureTask") - .or( - nameEndsWith( - "com.google.common.util.concurrent.TrustedListenableFutureTask"))) - .or( - isDeclaredBy(nameEndsWith(".netty.util.concurrent.PromiseTask")) - .and(takesArgument(1, named(Callable.class.getName()))))), + .and(isDeclaredBy(named("java.util.concurrent.FutureTask") + .or(nameEndsWith( + "com.google.common.util.concurrent.TrustedListenableFutureTask"))) + .or(isDeclaredBy(nameEndsWith(".netty.util.concurrent.PromiseTask")) + .and(takesArgument(1, named(Callable.class.getName()))))), getClass().getName() + "$Construct"); transformer.applyAdvice(isConstructor(), getClass().getName() + "$Construct"); transformer.applyAdvice(isMethod().and(named("run")), getClass().getName() + "$Run"); diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/timer/JavaTimerInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/timer/JavaTimerInstrumentation.java index 07e3cc934e7..d368a0477cf 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/timer/JavaTimerInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/timer/JavaTimerInstrumentation.java @@ -29,12 +29,11 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(isPrivate()) - .and( - named("sched") - .and(takesArguments(3)) - .and(takesArgument(0, named("java.util.TimerTask"))) - .and(takesArgument(1, long.class)) - .and(takesArgument(2, long.class))), + .and(named("sched") + .and(takesArguments(3)) + .and(takesArgument(0, named("java.util.TimerTask"))) + .and(takesArgument(1, long.class)) + .and(takesArgument(2, long.class))), getClass().getName() + "$TimerScheduleAdvice"); } diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/Fanout.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/Fanout.java index 9b7d77e22ca..c678512ea80 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/Fanout.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/Fanout.java @@ -21,12 +21,9 @@ public Fanout(Executor executor, int tasks, boolean traceChild) { public void execute() { try { - Stream> futures = - IntStream.range(0, tasks) - .mapToObj( - i -> - CompletableFuture.runAsync( - traceChild ? this::tracedWork : this::untracedWork, executor)); + Stream> futures = IntStream.range(0, tasks) + .mapToObj(i -> CompletableFuture.runAsync( + traceChild ? this::tracedWork : this::untracedWork, executor)); // Wait for those threads to finish work CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).get(); } catch (InterruptedException | ExecutionException e) { @@ -36,14 +33,10 @@ public void execute() { public void executeTwoLevels() { try { - Stream> futures = - IntStream.range(0, tasks) - .mapToObj( - i -> - CompletableFuture.runAsync( - traceChild ? this::tracedWork : this::untracedWork, executor) - .thenRunAsync( - traceChild ? this::tracedWork : this::untracedWork, executor)); + Stream> futures = IntStream.range(0, tasks) + .mapToObj(i -> CompletableFuture.runAsync( + traceChild ? this::tracedWork : this::untracedWork, executor) + .thenRunAsync(traceChild ? this::tracedWork : this::untracedWork, executor)); // Wait for those threads to finish work CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).get(); } catch (InterruptedException | ExecutionException e) { diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/executor/CustomThreadPoolExecutor.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/executor/CustomThreadPoolExecutor.java index 0aeb3aaff03..0c4e656fd60 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/executor/CustomThreadPoolExecutor.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/executor/CustomThreadPoolExecutor.java @@ -13,22 +13,21 @@ public class CustomThreadPoolExecutor extends AbstractExecutorService { private volatile Boolean running = true; private LinkedBlockingQueue workQueue = new LinkedBlockingQueue(10); - private Runnable worker = - new Runnable() { - public void run() { - try { - while (getRunning()) { - Runnable runnable = ((LinkedBlockingQueue) getWorkQueue()).take(); - runnable.run(); - } - - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (Exception e) { - e.printStackTrace(); - } + private Runnable worker = new Runnable() { + public void run() { + try { + while (getRunning()) { + Runnable runnable = ((LinkedBlockingQueue) getWorkQueue()).take(); + runnable.run(); } - }; + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; private Thread workerThread = new Thread(worker, "ExecutorTestThread"); public CustomThreadPoolExecutor() { diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/runnable/SettableFuture.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/runnable/SettableFuture.java index 9df241918ab..2d032778625 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/runnable/SettableFuture.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/java/runnable/SettableFuture.java @@ -5,13 +5,12 @@ public class SettableFuture extends FutureTask { SettableFuture() { - super( - new Callable() { - @Override - public String call() throws Exception { - return "async result"; - } - }); + super(new Callable() { + @Override + public String call() throws Exception { + return "async result"; + } + }); } public void set(String value) { diff --git a/dd-java-agent/instrumentation/java/java-io-1.8/src/test/java/foo/bar/TestCustomStringReader.java b/dd-java-agent/instrumentation/java/java-io-1.8/src/test/java/foo/bar/TestCustomStringReader.java index 34082f66ad8..7134f3d5ef5 100644 --- a/dd-java-agent/instrumentation/java/java-io-1.8/src/test/java/foo/bar/TestCustomStringReader.java +++ b/dd-java-agent/instrumentation/java/java-io-1.8/src/test/java/foo/bar/TestCustomStringReader.java @@ -5,10 +5,7 @@ public class TestCustomStringReader extends StringReader { public TestCustomStringReader(String s) { - super( - "Super " - + s - + (new StringReader( - "New_1" + new StringReader("New_2" + new StringReader("New_3" + s))))); + super("Super " + s + + (new StringReader("New_1" + new StringReader("New_2" + new StringReader("New_3" + s))))); } } diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-1.8/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplInstrumentation.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-1.8/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplInstrumentation.java index 9aa9d8c19da..d8572b6c623 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-1.8/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-1.8/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplInstrumentation.java @@ -32,13 +32,12 @@ public String instrumentedType() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("start") - .and( - takesArguments( - String[].class, - Map.class, - String.class, - ProcessBuilder.Redirect[].class, - boolean.class)), + .and(takesArguments( + String[].class, + Map.class, + String.class, + ProcessBuilder.Redirect[].class, + boolean.class)), packageName + ".ProcessImplStartAdvice"); } } diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadApiInstrumentationTest.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadApiInstrumentationTest.java index 566954da9c7..b6981107aea 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadApiInstrumentationTest.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadApiInstrumentationTest.java @@ -100,49 +100,44 @@ void testNestedVirtualThreads() throws InterruptedException, TimeoutException { @Trace(operationName = "parent") @Override public void run() { - threadBuilder.start( - new Runnable() { - @Trace(operationName = "child") + threadBuilder.start(new Runnable() { + @Trace(operationName = "child") + @Override + public void run() { + threadBuilder.start(new Runnable() { + @Trace(operationName = "great-child") @Override public void run() { - threadBuilder.start( - new Runnable() { - @Trace(operationName = "great-child") - @Override - public void run() { - threadBuilder.start( - new Runnable() { - @Trace(operationName = "great-great-child") - @Override - public void run() { - System.out.println("complete"); - } - }); - } - }); + threadBuilder.start(new Runnable() { + @Trace(operationName = "great-great-child") + @Override + public void run() { + System.out.println("complete"); + } + }); } }); + } + }); } }.run(); // Block test thread until child spans are reported blockUntilTracesMatch(traces -> traces.size() == 1 && traces.get(0).size() == 4); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("child"), - span().childOfPrevious().operationName("great-child"), - span().childOfPrevious().operationName("great-great-child"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("child"), + span().childOfPrevious().operationName("great-child"), + span().childOfPrevious().operationName("great-great-child"))); } /** Verifies the parent / child span relation. */ void assertConnectedTrace() { - assertTraces( - trace( - span().root().operationName("parent"), - span().childOfPrevious().operationName("asyncChild"))); + assertTraces(trace( + span().root().operationName("parent"), + span().childOfPrevious().operationName("asyncChild"))); } private static void tryUnmount() { diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadLifeCycleTest.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadLifeCycleTest.java index 54690e14f73..d37e6e3ec20 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadLifeCycleTest.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/test/java/testdog/trace/instrumentation/java/lang/jdk21/VirtualThreadLifeCycleTest.java @@ -35,15 +35,13 @@ void testContextRestoredAfterVirtualThreadRemount() { public void run() { spanId[0] = GlobalTracer.get().getSpanId(); - Thread thread = - Thread.startVirtualThread( - () -> { - spanIdBeforeUnmount[0] = GlobalTracer.get().getSpanId(); - for (int remount = 0; remount < remountCount; remount++) { - tryUnmount(); - spanIdsAfterRemount[remount] = GlobalTracer.get().getSpanId(); - } - }); + Thread thread = Thread.startVirtualThread(() -> { + spanIdBeforeUnmount[0] = GlobalTracer.get().getSpanId(); + for (int remount = 0; remount < remountCount; remount++) { + tryUnmount(); + spanIdsAfterRemount[remount] = GlobalTracer.get().getSpanId(); + } + }); try { thread.join(TIMEOUT); } catch (InterruptedException e) { @@ -73,17 +71,15 @@ void testContextRestoredAsImplicitParentSpanAfterRemount() { @Override @Trace(operationName = "parent") public void run() { - Thread thread = - Thread.startVirtualThread( - () -> { - tryUnmount(); - // Runnable to create child span, not async related - new Runnable() { - @Override - @Trace(operationName = "child") - public void run() {} - }.run(); - }); + Thread thread = Thread.startVirtualThread(() -> { + tryUnmount(); + // Runnable to create child span, not async related + new Runnable() { + @Override + @Trace(operationName = "child") + public void run() {} + }.run(); + }); try { thread.join(TIMEOUT); } catch (InterruptedException e) { @@ -93,10 +89,8 @@ public void run() {} } }.run(); - assertTraces( - trace( - span().root().operationName("parent"), - span().childOfPrevious().operationName("child"))); + assertTraces(trace( + span().root().operationName("parent"), span().childOfPrevious().operationName("child"))); } @DisplayName("test concurrent virtual threads with remount") @@ -115,12 +109,10 @@ public void run() { List threads = new ArrayList<>(); for (int i = 0; i < threadCount; i++) { int index = i; - threads.add( - Thread.startVirtualThread( - () -> { - tryUnmount(); - spanIdsAfterRemount[index] = CorrelationIdentifier.getSpanId(); - })); + threads.add(Thread.startVirtualThread(() -> { + tryUnmount(); + spanIdsAfterRemount[index] = CorrelationIdentifier.getSpanId(); + })); } for (Thread thread : threads) { @@ -149,12 +141,11 @@ void testNoContextVirtualThreadRemount() throws InterruptedException { AtomicReference spanIdBeforeUnmount = new AtomicReference<>(); AtomicReference spanIdAfterRemount = new AtomicReference<>(); - Thread.startVirtualThread( - () -> { - spanIdBeforeUnmount.set(CorrelationIdentifier.getSpanId()); - tryUnmount(); - spanIdAfterRemount.set(CorrelationIdentifier.getSpanId()); - }) + Thread.startVirtualThread(() -> { + spanIdBeforeUnmount.set(CorrelationIdentifier.getSpanId()); + tryUnmount(); + spanIdAfterRemount.set(CorrelationIdentifier.getSpanId()); + }) .join(TIMEOUT); assertEquals( @@ -177,13 +168,11 @@ void testContextOrderingWithChildSpanAcrossRemount() throws InterruptedException public void run() { parentSpanId[0] = GlobalTracer.get().getSpanId(); - Thread thread = - Thread.startVirtualThread( - () -> { - beforeChild[0] = GlobalTracer.get().getSpanId(); - childWork(insideChildBeforeUnmount, insideChildAfterRemount); - afterChild[0] = GlobalTracer.get().getSpanId(); - }); + Thread thread = Thread.startVirtualThread(() -> { + beforeChild[0] = GlobalTracer.get().getSpanId(); + childWork(insideChildBeforeUnmount, insideChildAfterRemount); + afterChild[0] = GlobalTracer.get().getSpanId(); + }); try { thread.join(); } catch (InterruptedException e) { @@ -205,11 +194,10 @@ public void run() { assertEquals(parentSpanId[0], afterChild[0], "parent should be active after child span closes"); // Verify trace structure - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("child"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("child"))); } @Trace(operationName = "child") diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java/datadog/trace/instrumentation/java/lang/jdk22/FFMApiModule.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java/datadog/trace/instrumentation/java/lang/jdk22/FFMApiModule.java index f49f343a555..f3654ed98cd 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java/datadog/trace/instrumentation/java/lang/jdk22/FFMApiModule.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java/datadog/trace/instrumentation/java/lang/jdk22/FFMApiModule.java @@ -18,7 +18,8 @@ public FFMApiModule() { @Override public boolean isEnabled() { - return super.isEnabled() && !InstrumenterConfig.get().getTraceNativeMethods().isEmpty(); + return super.isEnabled() + && !InstrumenterConfig.get().getTraceNativeMethods().isEmpty(); } @Override diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureLibraryNameAdvice.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureLibraryNameAdvice.java index c718b9acd28..720c4a5ab5c 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureLibraryNameAdvice.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureLibraryNameAdvice.java @@ -14,9 +14,8 @@ public static void onExit(@Advice.This final Object self) { // this module is not opened by default hence we are inlining this code into the target to // circumvent this limitation try { - final MethodHandle mh = - MethodHandles.lookup() - .findVirtual(self.getClass(), "name", MethodType.methodType(String.class)); + final MethodHandle mh = MethodHandles.lookup() + .findVirtual(self.getClass(), "name", MethodType.methodType(String.class)); String libraryName = (String) mh.invoke(self); if (libraryName != null) { libraryName = extractLibraryName(libraryName); diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureSymbolAddressAdvice.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureSymbolAddressAdvice.java index 236a49a82b9..4e0219f9feb 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureSymbolAddressAdvice.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-22.0/src/main/java25/datadog/trace/instrumentation/java/lang/jdk22/CaptureSymbolAddressAdvice.java @@ -12,9 +12,8 @@ public static void onExit( @Advice.This final Object self, @Advice.Return final long address) { final String libraryName = - (String) - InstrumentationContext.get("jdk.internal.loader.NativeLibrary", "java.lang.String") - .get(self); + (String) InstrumentationContext.get("jdk.internal.loader.NativeLibrary", "java.lang.String") + .get(self); onSymbolLookup(libraryName, symbol, address); } } diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/main/java/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSite.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/main/java/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSite.java index 5f92b4f6ec3..53e0ea6d266 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/main/java/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSite.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/main/java/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSite.java @@ -58,9 +58,8 @@ public static java.lang.invoke.CallSite aroundMakeConcatWithConstants( throw new IllegalArgumentException( "Expected ConstantCallSite, received " + callSite.getClass()); } - MethodHandle target = - MethodHandles.insertArguments( - INSTRUMENTATION_BRIDGE, 2, recipe, constants, preprocessRecipe(recipe, constants)); + MethodHandle target = MethodHandles.insertArguments( + INSTRUMENTATION_BRIDGE, 2, recipe, constants, preprocessRecipe(recipe, constants)); target = target.asCollector(1, String[].class, concatType.parameterCount()); target = MethodHandles.foldArguments(target, callSite.getTarget()); target = MethodHandles.filterArguments(target, 0, toStringMethods); diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/ClassloadingInstrumentation.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/ClassloadingInstrumentation.java index 510eaf6ea6e..8d58985d6e8 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/ClassloadingInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/ClassloadingInstrumentation.java @@ -68,13 +68,11 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("loadClass")) - .and( - takesArguments(1) + .and(takesArguments(1) + .and(takesArgument(0, named("java.lang.String"))) + .or(takesArguments(2) .and(takesArgument(0, named("java.lang.String"))) - .or( - takesArguments(2) - .and(takesArgument(0, named("java.lang.String"))) - .and(takesArgument(1, named("boolean"))))) + .and(takesArgument(1, named("boolean"))))) .and(isPublic().or(isProtected())) .and(not(isStatic())), ClassloadingInstrumentation.class.getName() + "$LoadClassAdvice"); diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/DefineClassInstrumentation.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/DefineClassInstrumentation.java index 4d62c9ce047..4f2d3b51e4b 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/DefineClassInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-classloading-1.8/src/main/java/datadog/trace/instrumentation/java/lang/classloading/DefineClassInstrumentation.java @@ -36,15 +36,9 @@ public String instrumentedType() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() - .and( - named("defineClass") - .and( - takesArguments( - String.class, - byte[].class, - int.class, - int.class, - ProtectionDomain.class))), + .and(named("defineClass") + .and(takesArguments( + String.class, byte[].class, int.class, int.class, ProtectionDomain.class))), DefineClassInstrumentation.class.getName() + "$DefineClassAdvice"); } diff --git a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/main/java/datadog/trace/instrumentation/java/net/SslSocketInstrumentation.java b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/main/java/datadog/trace/instrumentation/java/net/SslSocketInstrumentation.java index c1d04ffc3aa..d88459ddbbb 100644 --- a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/main/java/datadog/trace/instrumentation/java/net/SslSocketInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/main/java/datadog/trace/instrumentation/java/net/SslSocketInstrumentation.java @@ -60,13 +60,12 @@ public static final class CloseAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void close(@Advice.This final SSLSocket socket) { boolean isIPv6 = socket.getLocalAddress() instanceof Inet6Address; - UsmConnection connection = - new UsmConnection( - socket.getLocalAddress(), - socket.getLocalPort(), - socket.getInetAddress(), - socket.getPort(), - isIPv6); + UsmConnection connection = new UsmConnection( + socket.getLocalAddress(), + socket.getLocalPort(), + socket.getInetAddress(), + socket.getPort(), + isIPv6); UsmMessage message = UsmMessageFactory.Supplier.getCloseMessage(connection); UsmExtractor.Supplier.send(message); } diff --git a/dd-java-agent/instrumentation/java/java-net/java-net-11.0/src/main/java11/datadog/trace/instrumentation/httpclient/CompletableFutureWrapper.java b/dd-java-agent/instrumentation/java/java-net/java-net-11.0/src/main/java11/datadog/trace/instrumentation/httpclient/CompletableFutureWrapper.java index 86fd52493d0..1e3e7e74aa7 100644 --- a/dd-java-agent/instrumentation/java/java-net/java-net-11.0/src/main/java11/datadog/trace/instrumentation/httpclient/CompletableFutureWrapper.java +++ b/dd-java-agent/instrumentation/java/java-net/java-net-11.0/src/main/java11/datadog/trace/instrumentation/httpclient/CompletableFutureWrapper.java @@ -11,16 +11,15 @@ private CompletableFutureWrapper() {} public static CompletableFuture wrap( CompletableFuture future, ContextContinuation continuation) { CompletableFuture result = new CompletableFuture<>(); - future.whenComplete( - (T value, Throwable throwable) -> { - try (ContextScope scope = continuation.resume()) { - if (throwable != null) { - result.completeExceptionally(throwable); - } else { - result.complete(value); - } - } - }); + future.whenComplete((T value, Throwable throwable) -> { + try (ContextScope scope = continuation.resume()) { + if (throwable != null) { + result.completeExceptionally(throwable); + } else { + result.complete(value); + } + } + }); return result; } diff --git a/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java b/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java index 6b724a8c24e..2589633c385 100644 --- a/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java +++ b/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java @@ -57,13 +57,11 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("loadModuleClass")) - .and( - takesArguments(1) + .and(takesArguments(1) + .and(takesArgument(0, String.class)) + .or(takesArguments(2) .and(takesArgument(0, String.class)) - .or( - takesArguments(2) - .and(takesArgument(0, String.class)) - .and(takesArgument(1, boolean.class)))), + .and(takesArgument(1, boolean.class)))), ModuleInstrumentation.class.getName() + "$WidenLoadClassAdvice"); transformer.applyAdvice(isConstructor(), getClass().getName() + "$CaptureModuleNameAdvice"); } diff --git a/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleNameHelper.java b/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleNameHelper.java index bc971a48767..7881c6dbdd1 100644 --- a/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleNameHelper.java +++ b/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleNameHelper.java @@ -26,12 +26,11 @@ private static MethodHandle resolveModuleNameGetter() { getModuleIdentifierHandle = methodHandles.method(Module.class, "getIdentifier"); if (getModuleIdentifierHandle != null) { // chains the two method handle calls - ret = - java.lang.invoke.MethodHandles.filterReturnValue( - getModuleIdentifierHandle, - methodHandles.method( - Class.forName("org.jboss.modules.ModuleIdentifier", false, classLoader), - "getName")); + ret = java.lang.invoke.MethodHandles.filterReturnValue( + getModuleIdentifierHandle, + methodHandles.method( + Class.forName("org.jboss.modules.ModuleIdentifier", false, classLoader), + "getName")); } } catch (Throwable ignored) { // here for caution. It's already caught and logged on MethodHandles diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java index f24dcb8077a..a5de64aa292 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/AbstractPreparedStatementInstrumentation.java @@ -76,9 +76,8 @@ public static AgentScope onEnter(@Advice.This final Statement statement) { return null; } final AgentSpan span; - final DBInfo dbInfo = - JDBCDecorator.parseDBInfo( - connection, InstrumentationContext.get(Connection.class, DBInfo.class)); + final DBInfo dbInfo = JDBCDecorator.parseDBInfo( + connection, InstrumentationContext.get(Connection.class, DBInfo.class)); final boolean injectTraceContext = DECORATE.shouldInjectTraceContext(dbInfo); if (INJECT_COMMENT && injectTraceContext) { @@ -86,11 +85,10 @@ public static AgentScope onEnter(@Advice.This final Statement statement) { // The span ID is pre-determined so that we can reference it when setting the context final long spanID = DECORATE.setContextInfo(connection, dbInfo); // we then force that pre-determined span ID for the span covering the actual query - span = - AgentTracer.get() - .singleSpanBuilder("java-jdbc-prepared_statement", DATABASE_QUERY) - .withSpanId(spanID) - .start(); + span = AgentTracer.get() + .singleSpanBuilder("java-jdbc-prepared_statement", DATABASE_QUERY) + .withSpanId(spanID) + .start(); span.setTag(DBM_TRACE_INJECTED, true); } else if (DECORATE.isPostgres(dbInfo) && DBM_TRACE_PREPARED_STATEMENTS) { span = startSpan("java-jdbc-prepared_statement", DATABASE_QUERY); diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java index 486a92dcbf7..612cba533d9 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java @@ -120,9 +120,8 @@ public static String onEnter( } final String inputSql = sql; final AgentSpan activeSpan = activeSpan(); - final DBInfo dbInfo = - JDBCDecorator.parseDBInfo( - connection, InstrumentationContext.get(Connection.class, DBInfo.class)); + final DBInfo dbInfo = JDBCDecorator.parseDBInfo( + connection, InstrumentationContext.get(Connection.class, DBInfo.class)); String dbService = DECORATE.getDbService(dbInfo); if (dbService != null) { dbService = traceConfig(activeSpan).getServiceMapping().getOrDefault(dbService, dbService); @@ -130,9 +129,8 @@ public static String onEnter( boolean append = DECORATE.DBM_ALWAYS_APPEND_SQL_COMMENT || "sqlserver".equals(dbInfo.getType()); - sql = - SQLCommenter.inject( - sql, dbService, dbInfo.getType(), dbInfo.getHost(), dbInfo.getDb(), null, append); + sql = SQLCommenter.inject( + sql, dbService, dbInfo.getType(), dbInfo.getHost(), dbInfo.getDb(), null, append); return inputSql; } diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/HikariConcurrentBagInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/HikariConcurrentBagInstrumentation.java index bc60aeb15cb..67eba30f402 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/HikariConcurrentBagInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/HikariConcurrentBagInstrumentation.java @@ -88,11 +88,10 @@ public static void stopSpan( @Advice.Enter final Long startTimeMillis, @Advice.Thrown final Throwable throwable) { if (HikariBlockedTracker.wasBlocked()) { - final AgentSpan span = - startSpan( - JAVA_JDBC_POOL_WAITING.toString(), - POOL_WAITING, - TimeUnit.MILLISECONDS.toMicros(startTimeMillis)); + final AgentSpan span = startSpan( + JAVA_JDBC_POOL_WAITING.toString(), + POOL_WAITING, + TimeUnit.MILLISECONDS.toMicros(startTimeMillis)); DECORATE.afterStart(span); DECORATE.onError(span, throwable); span.setResourceName("hikari.waiting"); diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 2cd7bba1533..fc4c4d29000 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -339,11 +339,10 @@ public long setContextInfo(Connection connection, DBInfo dbInfo) { final byte VERSION = 0; final long spanID = Config.get().getIdGenerationStrategy().generateSpanId(); // potentially get build span like here - AgentSpan instrumentationSpan = - AgentTracer.get() - .singleSpanBuilder("java-jdbc", "set context_info") - .withTag("dd.instrumentation", true) - .start(); + AgentSpan instrumentationSpan = AgentTracer.get() + .singleSpanBuilder("java-jdbc", "set context_info") + .withTag("dd.instrumentation", true) + .start(); DECORATE.afterStart(instrumentationSpan); DECORATE.onConnection(instrumentationSpan, dbInfo); try (ContextScope scope = activateSpan(instrumentationSpan)) { diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java index 5b5ec71b671..efe71cc96cc 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java @@ -85,9 +85,8 @@ public static AgentScope onEnter( } try { final Connection connection = statement.getConnection(); - final DBInfo dbInfo = - JDBCDecorator.parseDBInfo( - connection, InstrumentationContext.get(Connection.class, DBInfo.class)); + final DBInfo dbInfo = JDBCDecorator.parseDBInfo( + connection, InstrumentationContext.get(Connection.class, DBInfo.class)); boolean injectTraceContext = DECORATE.shouldInjectTraceContext(dbInfo); final AgentSpan span; final boolean isSqlServer = DECORATE.isSqlServer(dbInfo); @@ -98,11 +97,10 @@ public static AgentScope onEnter( // The span ID is pre-determined so that we can reference it when setting the context final long spanID = DECORATE.setContextInfo(connection, dbInfo); // we then force that pre-determined span ID for the span covering the actual query - span = - AgentTracer.get() - .singleSpanBuilder("java-jdbc-statement", DATABASE_QUERY) - .withSpanId(spanID) - .start(); + span = AgentTracer.get() + .singleSpanBuilder("java-jdbc-statement", DATABASE_QUERY) + .withSpanId(spanID) + .start(); } else if (isOracle) { span = startSpan("java-jdbc-statement", DATABASE_QUERY); DECORATE.setAction(span, connection); @@ -161,15 +159,14 @@ public static AgentScope onEnter( } else { dbService = span.getServiceName(); } - sql = - SQLCommenter.inject( - sql, - dbService, - dbInfo.getType(), - dbInfo.getHost(), - dbInfo.getDb(), - injectTraceInComment ? traceParent : null, - appendComment); + sql = SQLCommenter.inject( + sql, + dbService, + dbInfo.getType(), + dbInfo.getHost(), + dbInfo.getDb(), + injectTraceInComment ? traceParent : null, + appendComment); } DECORATE.onStatement(span, copy); DECORATE.withBaseHash(span); diff --git a/dd-java-agent/instrumentation/jdbc/src/test/java/datadog/trace/instrumentation/jdbc/SQLCommenterTest.java b/dd-java-agent/instrumentation/jdbc/src/test/java/datadog/trace/instrumentation/jdbc/SQLCommenterTest.java index d2f448ddd66..926bd12fb44 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/java/datadog/trace/instrumentation/jdbc/SQLCommenterTest.java +++ b/dd-java-agent/instrumentation/jdbc/src/test/java/datadog/trace/instrumentation/jdbc/SQLCommenterTest.java @@ -1095,21 +1095,18 @@ void testEncodeSqlCommentWithPeerService( SharedDBCommenter.resetStaticPrefixForTesting(); // when - String sqlWithComment = - runUnderTrace( - "testTrace", - () -> { - AgentSpan currSpan = AgentTracer.activeSpan(); - currSpan.setTag(Tags.PEER_SERVICE, peerService); - return SQLCommenter.inject( - "SELECT * FROM foo", - "my-service", - dbType, - "h", - "n", - "00-00000000000000007fffffffffffffff-000000024cb016ea-00", - true); - }); + String sqlWithComment = runUnderTrace("testTrace", () -> { + AgentSpan currSpan = AgentTracer.activeSpan(); + currSpan.setTag(Tags.PEER_SERVICE, peerService); + return SQLCommenter.inject( + "SELECT * FROM foo", + "my-service", + dbType, + "h", + "n", + "00-00000000000000007fffffffffffffff-000000024cb016ea-00", + true); + }); // then assertEquals(expected, sqlWithComment); diff --git a/dd-java-agent/instrumentation/jdbc/src/test/java/test/DataDogRegistryImageNameSubstitutor.java b/dd-java-agent/instrumentation/jdbc/src/test/java/test/DataDogRegistryImageNameSubstitutor.java index 8f7693f49d1..fda4f583e15 100644 --- a/dd-java-agent/instrumentation/jdbc/src/test/java/test/DataDogRegistryImageNameSubstitutor.java +++ b/dd-java-agent/instrumentation/jdbc/src/test/java/test/DataDogRegistryImageNameSubstitutor.java @@ -20,9 +20,8 @@ public DockerImageName apply(DockerImageName original) { if (System.getenv("CI") != null) { // For now, we need to mirror Microsoft SQL Server images only. - name = - name.replace( - "mcr.microsoft.com/mssql/server:", "registry.ddbuild.io/images/mirror/sqlserver:"); + name = name.replace( + "mcr.microsoft.com/mssql/server:", "registry.ddbuild.io/images/mirror/sqlserver:"); } return DockerImageName.parse(name); diff --git a/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/MultiPartReaderServerSideInstrumentation.java b/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/MultiPartReaderServerSideInstrumentation.java index a1f6658b068..a76cb99afeb 100644 --- a/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/MultiPartReaderServerSideInstrumentation.java +++ b/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/MultiPartReaderServerSideInstrumentation.java @@ -94,9 +94,8 @@ static void after( if (map != null) { Flow flow = callback.apply(reqCtx, map); - BlockingException be = - MultiPartHelper.tryBlock( - reqCtx, flow, "Blocked request (for MultiPartReaderServerSide/readMultiPart)"); + BlockingException be = MultiPartHelper.tryBlock( + reqCtx, flow, "Blocked request (for MultiPartReaderServerSide/readMultiPart)"); if (be != null) { t = be; } @@ -105,9 +104,8 @@ static void after( if (filenames != null && !filenames.isEmpty()) { Flow filenamesFlow = filenamesCallback.apply(reqCtx, filenames); if (t == null) { - BlockingException be = - MultiPartHelper.tryBlock( - reqCtx, filenamesFlow, "Blocked request (multipart file upload)"); + BlockingException be = MultiPartHelper.tryBlock( + reqCtx, filenamesFlow, "Blocked request (multipart file upload)"); if (be != null) { t = be; } @@ -116,9 +114,8 @@ static void after( if (t == null && filesContent != null && !filesContent.isEmpty()) { Flow contentFlow = contentCallback.apply(reqCtx, filesContent); - BlockingException be = - MultiPartHelper.tryBlock( - reqCtx, contentFlow, "Blocked request (multipart file upload content)"); + BlockingException be = MultiPartHelper.tryBlock( + reqCtx, contentFlow, "Blocked request (multipart file upload content)"); if (be != null) { t = be; } diff --git a/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/UriRoutingContextInstrumentation.java b/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/UriRoutingContextInstrumentation.java index 16b155b138a..317e96bd34b 100644 --- a/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/UriRoutingContextInstrumentation.java +++ b/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-2.0/src/main/java/datadog/trace/instrumentation/jersey2/UriRoutingContextInstrumentation.java @@ -71,9 +71,8 @@ static void after( BlockResponseFunction blockResponseFunction = reqCtx.getBlockResponseFunction(); if (blockResponseFunction != null) { blockResponseFunction.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); - t = - new BlockingException( - "Blocked request (for UriRoutingContextInstrumentation/getPathParameters)"); + t = new BlockingException( + "Blocked request (for UriRoutingContextInstrumentation/getPathParameters)"); reqCtx.getTraceSegment().effectivelyBlocked(); } } diff --git a/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-3.0/src/main/java/datadog/trace/instrumentation/jersey3/MultiPartReaderServerSideInstrumentation.java b/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-3.0/src/main/java/datadog/trace/instrumentation/jersey3/MultiPartReaderServerSideInstrumentation.java index 8dbbb6459ea..f3226063732 100644 --- a/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-3.0/src/main/java/datadog/trace/instrumentation/jersey3/MultiPartReaderServerSideInstrumentation.java +++ b/dd-java-agent/instrumentation/jersey/jersey-appsec/jersey-appsec-3.0/src/main/java/datadog/trace/instrumentation/jersey3/MultiPartReaderServerSideInstrumentation.java @@ -94,9 +94,8 @@ static void after( if (map != null) { Flow flow = callback.apply(reqCtx, map); - BlockingException be = - MultiPartHelper.tryBlock( - reqCtx, flow, "Blocked request (for MultiPartReaderServerSide/readMultiPart)"); + BlockingException be = MultiPartHelper.tryBlock( + reqCtx, flow, "Blocked request (for MultiPartReaderServerSide/readMultiPart)"); if (be != null) { t = be; } @@ -105,9 +104,8 @@ static void after( if (filenames != null && !filenames.isEmpty()) { Flow filenamesFlow = filenamesCallback.apply(reqCtx, filenames); if (t == null) { - BlockingException be = - MultiPartHelper.tryBlock( - reqCtx, filenamesFlow, "Blocked request (multipart file upload)"); + BlockingException be = MultiPartHelper.tryBlock( + reqCtx, filenamesFlow, "Blocked request (multipart file upload)"); if (be != null) { t = be; } @@ -116,9 +114,8 @@ static void after( if (t == null && filesContent != null && !filesContent.isEmpty()) { Flow contentFlow = contentCallback.apply(reqCtx, filesContent); - BlockingException be = - MultiPartHelper.tryBlock( - reqCtx, contentFlow, "Blocked request (multipart file upload content)"); + BlockingException be = MultiPartHelper.tryBlock( + reqCtx, contentFlow, "Blocked request (multipart file upload content)"); if (be != null) { t = be; } diff --git a/dd-java-agent/instrumentation/jersey/jersey-client-2.0/src/main/java/datadog/trace/instrumentation/connection_error/jersey/ClientRuntimeInstrumentation.java b/dd-java-agent/instrumentation/jersey/jersey-client-2.0/src/main/java/datadog/trace/instrumentation/connection_error/jersey/ClientRuntimeInstrumentation.java index 96025bc3081..b3110eeb1be 100644 --- a/dd-java-agent/instrumentation/jersey/jersey-client-2.0/src/main/java/datadog/trace/instrumentation/connection_error/jersey/ClientRuntimeInstrumentation.java +++ b/dd-java-agent/instrumentation/jersey/jersey-client-2.0/src/main/java/datadog/trace/instrumentation/connection_error/jersey/ClientRuntimeInstrumentation.java @@ -35,9 +35,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(namedOneOf("submit", "createRunnableForAsyncProcessing")) - .and( - takesArgument(0, named("org.glassfish.jersey.client.ClientRequest")) - .and(takesArgument(1, named("org.glassfish.jersey.client.ResponseCallback")))), + .and(takesArgument(0, named("org.glassfish.jersey.client.ClientRequest")) + .and(takesArgument(1, named("org.glassfish.jersey.client.ResponseCallback")))), "org.glassfish.jersey.client.WrappingResponseCallbackAdvice"); transformer.applyAdvice( isMethod() diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-11.0/src/main/java/datadog/trace/instrumentation/jetty11/RequestExtractContentParametersInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-11.0/src/main/java/datadog/trace/instrumentation/jetty11/RequestExtractContentParametersInstrumentation.java index 9660f7824a7..fd65fce92da 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-11.0/src/main/java/datadog/trace/instrumentation/jetty11/RequestExtractContentParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-11.0/src/main/java/datadog/trace/instrumentation/jetty11/RequestExtractContentParametersInstrumentation.java @@ -61,9 +61,8 @@ public String[] helperClassNames() { public ElementMatcher structureMatcher() { return declaresField( named("_contentParameters").and(fieldType(named("org.eclipse.jetty.util.MultiMap")))) - .and( - declaresField( - named("_dispatcherType").and(fieldType(named("jakarta.servlet.DispatcherType"))))); + .and(declaresField( + named("_dispatcherType").and(fieldType(named("jakarta.servlet.DispatcherType"))))); } @Override diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-7.0/src/main/java/datadog/trace/instrumentation/jetty70/RequestExtractParametersInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-7.0/src/main/java/datadog/trace/instrumentation/jetty70/RequestExtractParametersInstrumentation.java index 30c10f70a15..5cbfe64c5a1 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-7.0/src/main/java/datadog/trace/instrumentation/jetty70/RequestExtractParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-7.0/src/main/java/datadog/trace/instrumentation/jetty70/RequestExtractParametersInstrumentation.java @@ -30,10 +30,10 @@ public void methodAdvice(MethodTransformer transformer) { getClass().getName() + "$ExtractParametersAdvice"); } - static final Reference REQUEST_REFERENCE = - new Reference.Builder("org.eclipse.jetty.server.Request") - .withField(new String[0], 0, "_baseParameters", "Lorg/eclipse/jetty/util/MultiMap;") - .build(); + static final Reference REQUEST_REFERENCE = new Reference.Builder( + "org.eclipse.jetty.server.Request") + .withField(new String[0], 0, "_baseParameters", "Lorg/eclipse/jetty/util/MultiMap;") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/PartHelper.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/PartHelper.java index 468a93a028d..1590ee9c004 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/PartHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/PartHelper.java @@ -54,11 +54,10 @@ private static final class MpiGetPartsHolder { static { MethodHandle h = null; try { - Class cls = - Class.forName( - "org.eclipse.jetty.util.MultiPartInputStream", - false, - MpiGetPartsHolder.class.getClassLoader()); + Class cls = Class.forName( + "org.eclipse.jetty.util.MultiPartInputStream", + false, + MpiGetPartsHolder.class.getClassLoader()); h = MethodHandles.lookup().unreflect(cls.getMethod("getParts")); } catch (Exception ignored) { // class or method not available — getAllParts() falls back to singleton @@ -175,7 +174,8 @@ static String filenameFromPart(Part part) { while (i < len && cd.charAt(i) != '=' && cd.charAt(i) != ';') { i++; } - boolean isFilename = "filename".equalsIgnoreCase(cd.substring(nameStart, i).trim()); + boolean isFilename = + "filename".equalsIgnoreCase(cd.substring(nameStart, i).trim()); if (i >= len || cd.charAt(i) == ';') { // Value-less token (e.g. "form-data") — skip continue; diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/RequestGetPartsInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/RequestGetPartsInstrumentation.java index 96ec5ff528a..4d97511a63b 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/RequestGetPartsInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/RequestGetPartsInstrumentation.java @@ -41,8 +41,7 @@ public String instrumentedType() { @Override public String[] helperClassNames() { - return new String[] { - packageName + ".PartHelper", packageName + ".PartHelper$MpiGetPartsHolder" + return new String[] {packageName + ".PartHelper", packageName + ".PartHelper$MpiGetPartsHolder" }; } @@ -149,10 +148,9 @@ static void after( } BlockingException bodyBlock = PartHelper.fireBodyProcessedEvent(parts, reqCtx); BlockingException filenamesBlock = PartHelper.fireFilenamesEvent(parts, reqCtx); - BlockingException contentBlock = - bodyBlock == null && filenamesBlock == null - ? PartHelper.fireFilesContentEvent(parts, reqCtx) - : null; + BlockingException contentBlock = bodyBlock == null && filenamesBlock == null + ? PartHelper.fireFilesContentEvent(parts, reqCtx) + : null; t = bodyBlock != null ? bodyBlock : (filenamesBlock != null ? filenamesBlock : contentBlock); } } @@ -196,10 +194,9 @@ static void after( } BlockingException bodyBlock = PartHelper.fireBodyProcessedEvent(parts, reqCtx); BlockingException filenamesBlock = PartHelper.fireFilenamesEvent(parts, reqCtx); - BlockingException contentBlock = - bodyBlock == null && filenamesBlock == null - ? PartHelper.fireFilesContentEvent(parts, reqCtx) - : null; + BlockingException contentBlock = bodyBlock == null && filenamesBlock == null + ? PartHelper.fireFilesContentEvent(parts, reqCtx) + : null; t = bodyBlock != null ? bodyBlock : (filenamesBlock != null ? filenamesBlock : contentBlock); } } diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/test/java/datadog/trace/instrumentation/jetty8/PartHelperTest.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/test/java/datadog/trace/instrumentation/jetty8/PartHelperTest.java index 5826698454d..dbc21c2bd93 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/test/java/datadog/trace/instrumentation/jetty8/PartHelperTest.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/test/java/datadog/trace/instrumentation/jetty8/PartHelperTest.java @@ -233,9 +233,8 @@ void extractFormFieldsMixesFieldsAndSkipsFiles() throws IOException { @Test void extractFormFieldsDecodesFieldUsingContentTypeCharset() throws IOException { byte[] iso88591Bytes = "café".getBytes("ISO-8859-1"); - List parts = - singletonList( - fieldWithContentType("drink", iso88591Bytes, "text/plain; charset=ISO-8859-1")); + List parts = singletonList( + fieldWithContentType("drink", iso88591Bytes, "text/plain; charset=ISO-8859-1")); Map> result = PartHelper.extractFormFields(parts); assertEquals(singletonList("café"), result.get("drink")); } diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.2/src/main/java/datadog/trace/instrumentation/jetty92/RequestExtractContentParametersInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.2/src/main/java/datadog/trace/instrumentation/jetty92/RequestExtractContentParametersInstrumentation.java index dcfae4aca4c..7d16735678b 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.2/src/main/java/datadog/trace/instrumentation/jetty92/RequestExtractContentParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.2/src/main/java/datadog/trace/instrumentation/jetty92/RequestExtractContentParametersInstrumentation.java @@ -62,11 +62,11 @@ public void methodAdvice(MethodTransformer transformer) { getClass().getName() + "$GetFilenamesFromMultiPartAdvice"); } - private static final Reference REQUEST_REFERENCE = - new Reference.Builder("org.eclipse.jetty.server.Request") - .withMethod(new String[0], 0, "extractContentParameters", MULTI_MAP_INTERNAL_NAME) - .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) - .build(); + private static final Reference REQUEST_REFERENCE = new Reference.Builder( + "org.eclipse.jetty.server.Request") + .withMethod(new String[0], 0, "extractContentParameters", MULTI_MAP_INTERNAL_NAME) + .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.3/src/main/java/datadog/trace/instrumentation/jetty93/RequestExtractContentParametersInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.3/src/main/java/datadog/trace/instrumentation/jetty93/RequestExtractContentParametersInstrumentation.java index ed769a11d7c..b3b37139c00 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.3/src/main/java/datadog/trace/instrumentation/jetty93/RequestExtractContentParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.3/src/main/java/datadog/trace/instrumentation/jetty93/RequestExtractContentParametersInstrumentation.java @@ -61,16 +61,16 @@ public void methodAdvice(MethodTransformer transformer) { // - _contentParameters + extractContentParameters(void) exist from 9.3+ (excludes 9.2) // - _multiPartInputStream exists in 9.3.x and early 9.4.x (< 9.4.10); replaced by _multiParts // in 9.4.10 (covered by jetty-appsec-9.4) - private static final Reference REQUEST_REFERENCE = - new Reference.Builder("org.eclipse.jetty.server.Request") - .withMethod(new String[0], 0, "extractContentParameters", "V") - .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) - .withField( - new String[0], - 0, - "_multiPartInputStream", - "Lorg/eclipse/jetty/util/MultiPartInputStreamParser;") - .build(); + private static final Reference REQUEST_REFERENCE = new Reference.Builder( + "org.eclipse.jetty.server.Request") + .withMethod(new String[0], 0, "extractContentParameters", "V") + .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) + .withField( + new String[0], + 0, + "_multiPartInputStream", + "Lorg/eclipse/jetty/util/MultiPartInputStreamParser;") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.4/src/main/java/datadog/trace/instrumentation/jetty94/RequestExtractContentParametersInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.4/src/main/java/datadog/trace/instrumentation/jetty94/RequestExtractContentParametersInstrumentation.java index d7c810a511b..e5e91520c40 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.4/src/main/java/datadog/trace/instrumentation/jetty94/RequestExtractContentParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-9.4/src/main/java/datadog/trace/instrumentation/jetty94/RequestExtractContentParametersInstrumentation.java @@ -67,22 +67,19 @@ public void methodAdvice(MethodTransformer transformer) { // Request.class bytecode, NOT just classpath presence, so it works even when both // javax.servlet and jakarta.servlet are on the classpath simultaneously. // Note: GetFilenamesAdvice reads _multiParts with typing=DYNAMIC so it works for all versions. - private static final Reference REQUEST_REFERENCE = - new Reference.Builder("org.eclipse.jetty.server.Request") - .withMethod(new String[0], 0, "extractContentParameters", "V") - .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) - .withField(new String[0], 0, "_multiParts", "Lorg/eclipse/jetty/server/MultiParts;") - .withField(new String[0], 0, "_dispatcherType", "Ljavax/servlet/DispatcherType;") - .or() - .withMethod(new String[0], 0, "extractContentParameters", "V") - .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) - .withField( - new String[0], - 0, - "_multiParts", - "Lorg/eclipse/jetty/server/MultiPartFormInputStream;") - .withField(new String[0], 0, "_dispatcherType", "Ljavax/servlet/DispatcherType;") - .build(); + private static final Reference REQUEST_REFERENCE = new Reference.Builder( + "org.eclipse.jetty.server.Request") + .withMethod(new String[0], 0, "extractContentParameters", "V") + .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) + .withField(new String[0], 0, "_multiParts", "Lorg/eclipse/jetty/server/MultiParts;") + .withField(new String[0], 0, "_dispatcherType", "Ljavax/servlet/DispatcherType;") + .or() + .withMethod(new String[0], 0, "extractContentParameters", "V") + .withField(new String[0], 0, "_contentParameters", MULTI_MAP_INTERNAL_NAME) + .withField( + new String[0], 0, "_multiParts", "Lorg/eclipse/jetty/server/MultiPartFormInputStream;") + .withField(new String[0], 0, "_dispatcherType", "Ljavax/servlet/DispatcherType;") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java/datadog/trace/instrumentation/jetty_client10/JettyClientInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java/datadog/trace/instrumentation/jetty_client10/JettyClientInstrumentation.java index 24a8c15cf53..931334fc1c1 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java/datadog/trace/instrumentation/jetty_client10/JettyClientInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java/datadog/trace/instrumentation/jetty_client10/JettyClientInstrumentation.java @@ -50,12 +50,11 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvices( isMethod() .and(named("send")) - .and( - takesArgument( - 0, - namedOneOf( - "org.eclipse.jetty.client.api.Request", - "org.eclipse.jetty.client.HttpRequest"))) + .and(takesArgument( + 0, + namedOneOf( + "org.eclipse.jetty.client.api.Request", + "org.eclipse.jetty.client.HttpRequest"))) .and(takesArgument(1, List.class)), packageName + ".SendAdvice", packageName + ".SendContextPropagationAdvice"); diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SendContextPropagationAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SendContextPropagationAdvice.java index 1123e8d1cbd..dd4518c7f38 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SendContextPropagationAdvice.java +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SendContextPropagationAdvice.java @@ -16,7 +16,8 @@ public class SendContextPropagationAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter(@Advice.Argument(0) final Request request) { - final AgentSpan span = InstrumentationContext.get(Request.class, AgentSpan.class).get(request); + final AgentSpan span = + InstrumentationContext.get(Request.class, AgentSpan.class).get(request); Context destination = currentContext(); if (span != null) { destination = destination.with(span); diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/RequestCreateAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/RequestCreateAdvice.java index a0e54017e6f..d2161275e3b 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/RequestCreateAdvice.java +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/RequestCreateAdvice.java @@ -9,8 +9,7 @@ public class RequestCreateAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void afterCreate(@Advice.This HttpRequest self) { - self.onComplete( - new SpanFinishingCompleteListener( - InstrumentationContext.get(Request.class, AgentSpan.class))); + self.onComplete(new SpanFinishingCompleteListener( + InstrumentationContext.get(Request.class, AgentSpan.class))); } } diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/WrapListenerAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/WrapListenerAdvice.java index c8062aeba55..ef43c1ad07c 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/WrapListenerAdvice.java +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/src/main/java17/datadog/trace/instrumentation/jetty_client12/WrapListenerAdvice.java @@ -15,11 +15,10 @@ public static void methodEnter( @Advice.Argument(value = 0, readOnly = false, typing = Assigner.Typing.DYNAMIC) Object listener) { if (!(listener instanceof CallbackWrapper)) { - listener = - new CallbackWrapper( - activeSpan(), - InstrumentationContext.get(Request.class, AgentSpan.class).get(request), - listener); + listener = new CallbackWrapper( + activeSpan(), + InstrumentationContext.get(Request.class, AgentSpan.class).get(request), + listener); } } } diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/FutureResponseListenerInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/FutureResponseListenerInstrumentation.java index 901ea526d65..af3ecaa9a2b 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/FutureResponseListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/FutureResponseListenerInstrumentation.java @@ -48,9 +48,8 @@ public String muzzleDirective() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isConstructor() - .and( - takesArgument(0, named("org.eclipse.jetty.client.api.Request")) - .and(takesArguments(2))), + .and(takesArgument(0, named("org.eclipse.jetty.client.api.Request")) + .and(takesArguments(2))), getClass().getName() + "$Link"); } diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyAddListenerInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyAddListenerInstrumentation.java index 1e9c9ed2307..bf0ceefdb69 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyAddListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyAddListenerInstrumentation.java @@ -79,11 +79,10 @@ public static void methodEnter( @Advice.This Request request, @Advice.Argument(value = 0, readOnly = false) Request.RequestListener listener) { if (!(listener instanceof CallbackWrapper)) { - listener = - new CallbackWrapper( - activeSpan(), - InstrumentationContext.get(Request.class, AgentSpan.class).get(request), - listener); + listener = new CallbackWrapper( + activeSpan(), + InstrumentationContext.get(Request.class, AgentSpan.class).get(request), + listener); } } @@ -98,11 +97,10 @@ public static void methodEnter( @Advice.This Request request, @Advice.Argument(value = 0, readOnly = false) Request.FailureListener listener) { if (!(listener instanceof CallbackWrapper)) { - listener = - new CallbackWrapper( - activeSpan(), - InstrumentationContext.get(Request.class, AgentSpan.class).get(request), - listener); + listener = new CallbackWrapper( + activeSpan(), + InstrumentationContext.get(Request.class, AgentSpan.class).get(request), + listener); } } @@ -117,11 +115,10 @@ public static void methodEnter( @Advice.This Request request, @Advice.Argument(value = 0, readOnly = false) Request.SuccessListener listener) { if (!(listener instanceof CallbackWrapper)) { - listener = - new CallbackWrapper( - activeSpan(), - InstrumentationContext.get(Request.class, AgentSpan.class).get(request), - listener); + listener = new CallbackWrapper( + activeSpan(), + InstrumentationContext.get(Request.class, AgentSpan.class).get(request), + listener); } } @@ -136,11 +133,10 @@ public static void methodEnter( @Advice.This Request request, @Advice.Argument(value = 0, readOnly = false) Response.CompleteListener listener) { if (!(listener instanceof CallbackWrapper)) { - listener = - new CallbackWrapper( - activeSpan(), - InstrumentationContext.get(Request.class, AgentSpan.class).get(request), - listener); + listener = new CallbackWrapper( + activeSpan(), + InstrumentationContext.get(Request.class, AgentSpan.class).get(request), + listener); } } diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientInstrumentation.java index eb0ffb52c1e..309102edcf4 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientInstrumentation.java @@ -67,12 +67,11 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvices( isMethod() .and(named("send")) - .and( - takesArgument( - 0, - namedOneOf( - "org.eclipse.jetty.client.api.Request", - "org.eclipse.jetty.client.HttpRequest"))) + .and(takesArgument( + 0, + namedOneOf( + "org.eclipse.jetty.client.api.Request", + "org.eclipse.jetty.client.HttpRequest"))) .and(takesArgument(1, List.class)), JettyClientInstrumentation.class.getName() + "$SendAdvice", JettyClientInstrumentation.class.getName() + "$ContextPropagationAdvice"); diff --git a/dd-java-agent/instrumentation/jetty/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java index c8704f5f895..a868f7ad4ce 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java @@ -65,10 +65,8 @@ public class JettyBlockingHelper { // return value varies between versions Method getAsyncContext = Request.class.getMethod("getAsyncContext"); getAsyncContextMH = lookup().unreflect(getAsyncContext); - completeMH = - lookup() - .findVirtual( - getAsyncContextMH.type().returnType(), "complete", methodType(void.class)); + completeMH = lookup() + .findVirtual(getAsyncContextMH.type().returnType(), "complete", methodType(void.class)); } catch (IllegalAccessException | NoSuchMethodException | RuntimeException e) { log.error("Lookup of getAsyncContext failed. Will be unable to commit blocking response", e); } @@ -79,15 +77,12 @@ public class JettyBlockingHelper { log.debug("Could not find {}#isAsyncStarted()", Request.class.getName()); try { - Class asyncContinuationCls = - Class.forName( - "org.eclipse.jetty.server.AsyncContinuation", - true, - JettyBlockingHelper.class.getClassLoader()); - MethodHandle getAsyncContinuation = - lookup() - .findVirtual( - Request.class, "getAsyncContinuation", methodType(asyncContinuationCls)); + Class asyncContinuationCls = Class.forName( + "org.eclipse.jetty.server.AsyncContinuation", + true, + JettyBlockingHelper.class.getClassLoader()); + MethodHandle getAsyncContinuation = lookup() + .findVirtual(Request.class, "getAsyncContinuation", methodType(asyncContinuationCls)); MethodHandle isAsyncStarted = lookup().findVirtual(asyncContinuationCls, "isAsyncStarted", methodType(boolean.class)); isAsyncStartedMH = MethodHandles.filterArguments(isAsyncStarted, 0, getAsyncContinuation); @@ -101,32 +96,28 @@ public class JettyBlockingHelper { try { Class httpConnectionCls; try { - httpConnectionCls = - Class.forName( - "org.eclipse.jetty.server.AbstractHttpConnection", - true, - JettyBlockingHelper.class.getClassLoader()); + httpConnectionCls = Class.forName( + "org.eclipse.jetty.server.AbstractHttpConnection", + true, + JettyBlockingHelper.class.getClassLoader()); } catch (ClassNotFoundException cnfe) { - httpConnectionCls = - Class.forName( - "org.eclipse.jetty.server.HttpConnection", - true, - JettyBlockingHelper.class.getClassLoader()); + httpConnectionCls = Class.forName( + "org.eclipse.jetty.server.HttpConnection", + true, + JettyBlockingHelper.class.getClassLoader()); } MethodHandle getConnection = lookup().findVirtual(Request.class, "getConnection", methodType(httpConnectionCls)); - MethodHandle getEndPoint = - lookup() - .findVirtual(httpConnectionCls, "getEndPoint", MethodType.methodType(EndPoint.class)); + MethodHandle getEndPoint = lookup() + .findVirtual(httpConnectionCls, "getEndPoint", MethodType.methodType(EndPoint.class)); MethodHandle close = lookup().findVirtual(EndPoint.class, "close", methodType(void.class)); abortMH = collectArguments(collectArguments(close, 0, getEndPoint), 0, getConnection); } catch (NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) { try { - Class httpChannelCls = - Class.forName( - "org.eclipse.jetty.server.HttpChannel", - true, - JettyBlockingHelper.class.getClassLoader()); + Class httpChannelCls = Class.forName( + "org.eclipse.jetty.server.HttpChannel", + true, + JettyBlockingHelper.class.getClassLoader()); MethodHandle getHttpChannel = lookup().findVirtual(Request.class, "getHttpChannel", methodType(httpChannelCls)); MethodHandle getEndPoint = @@ -144,12 +135,11 @@ public class JettyBlockingHelper { COMPLETE = completeMH; IS_ASYNC_STARTED = isAsyncStartedMH; ABORT = abortMH; // excluded from INITIALIZED - INITIALIZED = - getAsyncContextMH != null - && closeOutputMH != null - && getAsyncContextMH != null - && completeMH != null - && isAsyncStartedMH != null; + INITIALIZED = getAsyncContextMH != null + && closeOutputMH != null + && getAsyncContextMH != null + && completeMH != null + && isAsyncStartedMH != null; } private JettyBlockingHelper() {} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java index be0be6eaa3a..3e8bf607267 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java @@ -75,9 +75,8 @@ public class JettyCommitResponseHelper { } Response resp = connection.getResponse(); - Flow flow = - JettyDecorator.DECORATE.callIGCallbackResponseAndHeaders( - span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); + Flow flow = JettyDecorator.DECORATE.callIGCallbackResponseAndHeaders( + span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java index 7b8ccc4fb6e..99e232196ad 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java @@ -93,18 +93,16 @@ public static boolean block( static { MethodHandle mh = null; try { - Class mutableCls = - Class.forName( - "org.eclipse.jetty.http.HttpFields$Mutable", - false, - JettyOnCommitBlockingHelper.class.getClassLoader()); + Class mutableCls = Class.forName( + "org.eclipse.jetty.http.HttpFields$Mutable", + false, + JettyOnCommitBlockingHelper.class.getClassLoader()); Method put = mutableCls.getDeclaredMethod("put", String.class, String.class); put.setAccessible(true); mh = MethodHandles.lookup().unreflect(put); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { - log.warn( - "Could not find method HttpFields$Mutable.put(String,String). " - + "Blocking on responses will be unavailable"); + log.warn("Could not find method HttpFields$Mutable.put(String,String). " + + "Blocking on responses will be unavailable"); } PUT_HEADER = mh; } diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/src/main/java11/datadog/trace/instrumentation/jetty11/SetContextPathAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/src/main/java11/datadog/trace/instrumentation/jetty11/SetContextPathAdvice.java index 8308ade5098..c9e9db3c72c 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/src/main/java11/datadog/trace/instrumentation/jetty11/SetContextPathAdvice.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/src/main/java11/datadog/trace/instrumentation/jetty11/SetContextPathAdvice.java @@ -38,10 +38,9 @@ public static void updateContextPath( span.setTag(SERVLET_CONTEXT, servletContext); req.setAttribute(DD_CONTEXT_PATH_ATTRIBUTE, servletContext); if (pathInContext != null) { - final String relativePath = - pathInContext.startsWith(servletContext) - ? pathInContext.substring(servletContext.length()) - : pathInContext; + final String relativePath = pathInContext.startsWith(servletContext) + ? pathInContext.substring(servletContext.length()) + : pathInContext; span.setTag(SERVLET_PATH, relativePath); req.setAttribute(DD_SERVLET_PATH_ATTRIBUTE, relativePath); } diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-12.0/src/main/java17/datadog/trace/instrumentation/jetty12/SetContextPathAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-12.0/src/main/java17/datadog/trace/instrumentation/jetty12/SetContextPathAdvice.java index 0db494383ec..5a95d996082 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-12.0/src/main/java17/datadog/trace/instrumentation/jetty12/SetContextPathAdvice.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-12.0/src/main/java17/datadog/trace/instrumentation/jetty12/SetContextPathAdvice.java @@ -47,10 +47,9 @@ public static void updateContextPath( // the following can be cached however than can be issues for application having // dynamically generated URL // since a bounded cache might collide - String relativePath = - pathInContext.startsWith(servletContext) - ? pathInContext.substring(servletContext.length()) - : pathInContext; + String relativePath = pathInContext.startsWith(servletContext) + ? pathInContext.substring(servletContext.length()) + : pathInContext; if (relativePath.isEmpty() || relativePath.charAt(0) != '/') { relativePath = "/" + relativePath; } diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyCommitResponseInstrumentation.java index 85a7b630035..43216d1c315 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyCommitResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyCommitResponseInstrumentation.java @@ -88,9 +88,8 @@ static class CommitResponseAdvice { Response resp = connection.getResponse(); - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyCommitResponseInstrumentation.java index fbe8fd6cf6f..dff63376e22 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyCommitResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyCommitResponseInstrumentation.java @@ -99,9 +99,8 @@ static class CommitResponseAdvice { return false; } - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java index 964f6e7a524..90271289461 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java @@ -72,9 +72,8 @@ public class JettyCommitResponseHelper { Response resp = connection.getResponse(); - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java index 1f2f770170a..45a4d34aaf7 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java @@ -59,9 +59,8 @@ public static boolean block( byte[] template = BlockingActionHelper.getTemplate(type, rba.getSecurityResponseId()); fields.put("Content-length", Integer.toString(template.length)); - info = - new HttpGenerator.ResponseInfo( - request.getHttpVersion(), fields, template.length, statusCode, null, false); + info = new HttpGenerator.ResponseInfo( + request.getHttpVersion(), fields, template.length, statusCode, null, false); // we need to update the upper layers too // so that the correct status code/headers get reported correctly on the span` @@ -73,9 +72,8 @@ public static boolean block( log.debug("Sending blocking response (non-empty body)"); transport.send(info, ByteBuffer.wrap(template), true, closeCb); } else { - info = - new HttpGenerator.ResponseInfo( - request.getHttpVersion(), fields, 0, statusCode, null, request.isHead()); + info = new HttpGenerator.ResponseInfo( + request.getHttpVersion(), fields, 0, statusCode, null, request.isHead()); response.reset(); response.setStatus(statusCode); diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java index ebb0c9e1eec..29cf6d9904c 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java @@ -114,9 +114,8 @@ static class CommitResponseAdvice { Response resp = connection.getResponse(); - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java index 67a6e85d9d4..a7599ae1d49 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java @@ -92,13 +92,12 @@ public void typeAdvice(TypeTransformer transformer) { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvices( takesNoArguments() - .and( - named("handle") - .or( - // In 9.0.3 the handle logic was extracted out to "handle" - // but we still want to instrument run in case handle is missing - // (without the risk of double instrumenting). - named("run").and(isDeclaredBy(not(declaresMethod(named("handle"))))))), + .and(named("handle") + .or( + // In 9.0.3 the handle logic was extracted out to "handle" + // but we still want to instrument run in case handle is missing + // (without the risk of double instrumenting). + named("run").and(isDeclaredBy(not(declaresMethod(named("handle"))))))), JettyServerInstrumentation.class.getName() + "$ContextTrackingAdvice", JettyServerInstrumentation.class.getName() + "$HandleAdvice"); transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java index 61fd9cc8c17..449af8a3609 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java @@ -67,12 +67,10 @@ public static AgentScope before( // that class is not implementing javax.websocket.Session but hides the close() method // hence we need an ad hoc advice - handlerContext = - (HandlerContext.Sender) - InstrumentationContext.get( - "javax.websocket.Session", - "datadog.trace.bootstrap.instrumentation.websocket.HandlerContext$Sender") - .remove(session); + handlerContext = (HandlerContext.Sender) InstrumentationContext.get( + "javax.websocket.Session", + "datadog.trace.bootstrap.instrumentation.websocket.HandlerContext$Sender") + .remove(session); if (handlerContext == null) { return null; } diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java index 9eb5a286891..fd9db13438e 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java @@ -62,9 +62,8 @@ public class JettyCommitResponseHelper { } Response resp = connection.getResponse(); - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java index c51be7f1b20..f3428a9f30c 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java @@ -65,9 +65,8 @@ public class JettyCommitResponseHelper { } Response resp = connection.getResponse(); - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, resp, resp.getStatus(), ExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java index 10282df2415..a64d428068f 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java @@ -98,9 +98,8 @@ public static boolean block( commit.setAccessible(true); commitMh = MethodHandles.lookup().unreflect(commit); } catch (NoSuchMethodException | IllegalAccessException e) { - log.warn( - "Could not find method HttpChannel#commit(MetaData.Response). " - + "Blocking on responses will be unavailable"); + log.warn("Could not find method HttpChannel#commit(MetaData.Response). " + + "Blocking on responses will be unavailable"); } COMMIT_METADATA = commitMh; } @@ -148,17 +147,15 @@ private void close() { static { MethodHandle mh = null; try { - mh = - MethodHandles.lookup() - .findVirtual(HttpOutput.class, "closed", MethodType.methodType(void.class)); + mh = MethodHandles.lookup() + .findVirtual(HttpOutput.class, "closed", MethodType.methodType(void.class)); } catch (NoSuchMethodException | IllegalAccessException e) { try { - mh = - MethodHandles.lookup() - .findVirtual( - HttpOutput.class, - "completed", - MethodType.methodType(void.class, Throwable.class)); + mh = MethodHandles.lookup() + .findVirtual( + HttpOutput.class, + "completed", + MethodType.methodType(void.class, Throwable.class)); mh = MethodHandles.insertArguments(mh, 1, new Object[] {null}); } catch (NoSuchMethodException | IllegalAccessException e2) { log.warn( diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java index c9dd753b3da..6f85001c146 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java @@ -33,12 +33,10 @@ public final class JMSDecorator extends MessagingClientDecorator { private static final Logger log = LoggerFactory.getLogger(JMSDecorator.class); public static final CharSequence JMS = UTF8BytesString.create("jms"); - public static final CharSequence JMS_CONSUME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation(JMS.toString())); - public static final CharSequence JMS_PRODUCE = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().outboundOperation(JMS.toString())); + public static final CharSequence JMS_CONSUME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation(JMS.toString())); + public static final CharSequence JMS_PRODUCE = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().outboundOperation(JMS.toString())); public static final CharSequence JMS_DELIVER = UTF8BytesString.create("jms.deliver"); public static final boolean JMS_LEGACY_TRACING = Config.get().isJmsLegacyTracingEnabled(); @@ -66,32 +64,23 @@ public final class JMSDecorator extends MessagingClientDecorator { private final CharSequence spanType; private final Supplier serviceNameSupplier; - public static final JMSDecorator PRODUCER_DECORATE = - new JMSDecorator( - "Produced for ", - Tags.SPAN_KIND_PRODUCER, - InternalSpanTypes.MESSAGE_PRODUCER, - SpanNaming.instance() - .namingSchema() - .messaging() - .outboundService("jms", JMS_LEGACY_TRACING)); - - public static final JMSDecorator CONSUMER_DECORATE = - new JMSDecorator( - "Consumed from ", - Tags.SPAN_KIND_CONSUMER, - InternalSpanTypes.MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService("jms", JMS_LEGACY_TRACING)); - - public static final JMSDecorator BROKER_DECORATE = - new JMSDecorator( - "", - Tags.SPAN_KIND_BROKER, - InternalSpanTypes.MESSAGE_BROKER, - SpanNaming.instance().namingSchema().messaging().timeInQueueService(JMS.toString())); + public static final JMSDecorator PRODUCER_DECORATE = new JMSDecorator( + "Produced for ", + Tags.SPAN_KIND_PRODUCER, + InternalSpanTypes.MESSAGE_PRODUCER, + SpanNaming.instance().namingSchema().messaging().outboundService("jms", JMS_LEGACY_TRACING)); + + public static final JMSDecorator CONSUMER_DECORATE = new JMSDecorator( + "Consumed from ", + Tags.SPAN_KIND_CONSUMER, + InternalSpanTypes.MESSAGE_CONSUMER, + SpanNaming.instance().namingSchema().messaging().inboundService("jms", JMS_LEGACY_TRACING)); + + public static final JMSDecorator BROKER_DECORATE = new JMSDecorator( + "", + Tags.SPAN_KIND_BROKER, + InternalSpanTypes.MESSAGE_BROKER, + SpanNaming.instance().namingSchema().messaging().timeInQueueService(JMS.toString())); public JMSDecorator( String resourcePrefix, diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java index 06d53e1ba3b..1b94f4d6881 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java @@ -83,9 +83,9 @@ public static class ConsumerAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static MessageConsumerState beforeReceive(@Advice.This final MessageConsumer consumer) { - MessageConsumerState consumerState = - InstrumentationContext.get(MessageConsumer.class, MessageConsumerState.class) - .get(consumer); + MessageConsumerState consumerState = InstrumentationContext.get( + MessageConsumer.class, MessageConsumerState.class) + .get(consumer); // ignore consumers who aren't bound to a tracked session via consumerState if (null == consumerState) { @@ -201,9 +201,9 @@ public static void afterReceive( public static class Close { @Advice.OnMethodEnter(suppress = Throwable.class) public static void beforeClose(@Advice.This final MessageConsumer consumer) { - MessageConsumerState consumerState = - InstrumentationContext.get(MessageConsumer.class, MessageConsumerState.class) - .get(consumer); + MessageConsumerState consumerState = InstrumentationContext.get( + MessageConsumer.class, MessageConsumerState.class) + .get(consumer); if (null != consumerState) { boolean finishSpan = consumerState.getSessionState().isAutoAcknowledge(); if (InstrumenterConfig.get().isLegacyContextManagerEnabled()) { @@ -228,15 +228,14 @@ public static void setMessageListener( @Advice.This MessageConsumer messageConsumer, @Advice.Argument(value = 0, readOnly = false) MessageListener listener) { if (null != listener && !(listener instanceof DatadogMessageListener)) { - MessageConsumerState consumerState = - InstrumentationContext.get(MessageConsumer.class, MessageConsumerState.class) - .get(messageConsumer); + MessageConsumerState consumerState = InstrumentationContext.get( + MessageConsumer.class, MessageConsumerState.class) + .get(messageConsumer); if (null != consumerState) { - listener = - new DatadogMessageListener( - InstrumentationContext.get(Message.class, SessionState.class), - consumerState, - listener); + listener = new DatadogMessageListener( + InstrumentationContext.get(Message.class, SessionState.class), + consumerState, + listener); } } } diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java index 3dbfa0579f5..c5400b26cf8 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java @@ -80,9 +80,9 @@ public static AgentScope beforeSend( return null; } - MessageProducerState producerState = - InstrumentationContext.get(MessageProducer.class, MessageProducerState.class) - .get(producer); + MessageProducerState producerState = InstrumentationContext.get( + MessageProducer.class, MessageProducerState.class) + .get(producer); CharSequence resourceName; String destinationName; @@ -147,9 +147,9 @@ public static void onEnter( AgentSpan span = activeSpan(); if (span == null) return; if (JMSDecorator.canInject(message) && Config.get().isJmsPropagationEnabled()) { - MessageProducerState producerState = - InstrumentationContext.get(MessageProducer.class, MessageProducerState.class) - .get(producer); + MessageProducerState producerState = InstrumentationContext.get( + MessageProducer.class, MessageProducerState.class) + .get(producer); if (null == producerState || !producerState.isPropagationDisabled()) { defaultPropagator().inject(span, message, SETTER); } @@ -189,9 +189,9 @@ public static AgentScope beforeSend( } if (JMSDecorator.canInject(message) && TIME_IN_QUEUE_ENABLED) { - MessageProducerState producerState = - InstrumentationContext.get(MessageProducer.class, MessageProducerState.class) - .get(producer); + MessageProducerState producerState = InstrumentationContext.get( + MessageProducer.class, MessageProducerState.class) + .get(producer); if (null != producerState) { SETTER.injectTimeInQueue(message, producerState); } diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MDBMessageConsumerInstrumentation.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MDBMessageConsumerInstrumentation.java index 9ae776c7ed4..d93a182eaf8 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MDBMessageConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MDBMessageConsumerInstrumentation.java @@ -48,9 +48,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return implementsInterface(named(hierarchyMarkerType())) - .and( - hasSuperType(declaresAnnotation(named(namespace + ".ejb.MessageDriven"))) - .or(implementsInterface(named(namespace + ".ejb.MessageDrivenBean")))); + .and(hasSuperType(declaresAnnotation(named(namespace + ".ejb.MessageDriven"))) + .or(implementsInterface(named(namespace + ".ejb.MessageDrivenBean")))); } @Override diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MessageExtractAdapter.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MessageExtractAdapter.java index 6d233e3c276..98117f6ff28 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MessageExtractAdapter.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/MessageExtractAdapter.java @@ -17,14 +17,13 @@ public final class MessageExtractAdapter implements AgentPropagation.ContextVisitor { private static final Logger log = LoggerFactory.getLogger(MessageExtractAdapter.class); - private static final Function KEY_MAPPER = - new Function() { - @SuppressForbidden - @Override - public String apply(String key) { - return key.replace("__dash__", "-").replace('$', '-').toLowerCase(Locale.ROOT); - } - }; + private static final Function KEY_MAPPER = new Function() { + @SuppressForbidden + @Override + public String apply(String key) { + return key.replace("__dash__", "-").replace('$', '-').toLowerCase(Locale.ROOT); + } + }; private final DDCache cache = DDCaches.newFixedSizeCache(32); diff --git a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPDecorator.java b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPDecorator.java index 89efa564eb8..cf8a25971c7 100644 --- a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPDecorator.java +++ b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPDecorator.java @@ -40,7 +40,8 @@ public void onCompile(final AgentScope scope, final JspCompilationContext jspCom } if (jspCompilationContext.getCompiler() != null) { - span.setTag("jsp.compiler", jspCompilationContext.getCompiler().getClass().getName()); + span.setTag( + "jsp.compiler", jspCompilationContext.getCompiler().getClass().getName()); } span.setTag("jsp.classFQCN", jspCompilationContext.getFQCN()); } @@ -69,7 +70,8 @@ public void onRender(final AgentSpan span, final HttpServletRequest req) { // and we never know if ever this can happen final StringBuffer requestURL = req.getRequestURL(); if (requestURL != null && requestURL.length() > 0) { - span.setTag("jsp.requestURL", (new URI(requestURL.toString())).normalize().toString()); + span.setTag( + "jsp.requestURL", (new URI(requestURL.toString())).normalize().toString()); } } catch (final Throwable ignored) { // logging here will be too verbose diff --git a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java index ce2d37251b6..106e81b3137 100644 --- a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java +++ b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java @@ -60,9 +60,8 @@ public static class HttpJspPageAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static AgentScope onEnter( @Advice.This final Object obj, @Advice.Argument(0) final HttpServletRequest req) { - final AgentSpan span = - startSpan(JSP_HTTP_SERVLET.toString(), JSP_RENDER) - .setTag("servlet.context", req.getContextPath()); + final AgentSpan span = startSpan(JSP_HTTP_SERVLET.toString(), JSP_RENDER) + .setTag("servlet.context", req.getContextPath()); DECORATE.afterStart(span); DECORATE.onRender(span, req); return activateSpan(span); diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/CucumberUtils.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/CucumberUtils.java index 7587e58373d..ddcbcf9f2e2 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/CucumberUtils.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/CucumberUtils.java @@ -32,9 +32,8 @@ public abstract class CucumberUtils { private static final ClassLoader CUCUMBER_CLASS_LOADER = ClassLoaders.getDefaultClassLoader(); public static String getVersion() { - try (InputStream cucumberPropsStream = - CUCUMBER_CLASS_LOADER.getResourceAsStream( - "META-INF/maven/io.cucumber/cucumber-junit/pom.properties")) { + try (InputStream cucumberPropsStream = CUCUMBER_CLASS_LOADER.getResourceAsStream( + "META-INF/maven/io.cucumber/cucumber-junit/pom.properties")) { Properties cucumberProps = new Properties(); cucumberProps.load(cucumberPropsStream); String version = cucumberProps.getProperty("version"); @@ -68,15 +67,14 @@ public static String getVersion() { private static final MethodHandle PICKLE_RUNNER_WITH_STEP_GET_PICKLE = REFLECTION.privateFieldGetter(WITH_STEP_PICKLE_RUNNER_CLASSNAME, "pickle"); - public static final List CAPABILITIES = - Arrays.asList( - LibraryCapability.TIA, - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.DISABLED, - LibraryCapability.ATTEMPT_TO_FIX); + public static final List CAPABILITIES = Arrays.asList( + LibraryCapability.TIA, + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.DISABLED, + LibraryCapability.ATTEMPT_TO_FIX); private CucumberUtils() {} diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberInstrumentation.java index 165adcfc144..8053fb632fb 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberInstrumentation.java @@ -86,9 +86,8 @@ public static void addTracingListener( TestEventsHandlerHolder.start( TestFrameworkInstrumentation.CUCUMBER, CucumberUtils.CAPABILITIES); - replacedNotifier.addListener( - new CucumberTracingListener( - InstrumentationContext.get(Description.class, TestExecutionTracker.class), children)); + replacedNotifier.addListener(new CucumberTracingListener( + InstrumentationContext.get(Description.class, TestExecutionTracker.class), children)); runNotifier = replacedNotifier; } } diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberSkipInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberSkipInstrumentation.java index c4bd3ed6df6..5d85d2284ac 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberSkipInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberSkipInstrumentation.java @@ -83,10 +83,9 @@ public static Boolean run( @Advice.Argument(0) RunNotifier notifier) { TestIdentifier test = CucumberUtils.toTestIdentifier(description); - SkipReason skipReason = - TestEventsHandlerHolder.HANDLERS - .get(TestFrameworkInstrumentation.CUCUMBER) - .skipReason(test); + SkipReason skipReason = TestEventsHandlerHolder.HANDLERS + .get(TestFrameworkInstrumentation.CUCUMBER) + .skipReason(test); if (skipReason == null) { return null; } diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/execution/Cucumber4ExecutionInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/execution/Cucumber4ExecutionInstrumentation.java index b2a6d90c4e9..e32b1d1a9e1 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/execution/Cucumber4ExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit4/execution/Cucumber4ExecutionInstrumentation.java @@ -97,10 +97,9 @@ public static Boolean execute( Description description = CucumberUtils.getPickleRunnerDescription(pickleRunner); TestIdentifier testIdentifier = CucumberUtils.toTestIdentifier(description); Collection testTags = CucumberUtils.getPickleRunnerTags(pickleRunner); - TestExecutionPolicy executionPolicy = - TestEventsHandlerHolder.HANDLERS - .get(TestFrameworkInstrumentation.CUCUMBER) - .executionPolicy(testIdentifier, TestSourceData.UNKNOWN, testTags); + TestExecutionPolicy executionPolicy = TestEventsHandlerHolder.HANDLERS + .get(TestFrameworkInstrumentation.CUCUMBER) + .executionPolicy(testIdentifier, TestSourceData.UNKNOWN, testTags); if (!executionPolicy.applicable()) { // retries not applicable, run original method return null; diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitInstrumentation.java index c45dc29e054..7cfe9396002 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitInstrumentation.java @@ -76,9 +76,8 @@ public static void addTracingListener( TestEventsHandlerHolder.start(TestFrameworkInstrumentation.MUNIT, MUnitUtils.CAPABILITIES); - replacedNotifier.addListener( - new MUnitTracingListener( - InstrumentationContext.get(Description.class, TestExecutionTracker.class))); + replacedNotifier.addListener(new MUnitTracingListener( + InstrumentationContext.get(Description.class, TestExecutionTracker.class))); runNotifier = replacedNotifier; } } diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitUtils.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitUtils.java index 3ba001c3ba4..52be2655db1 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitUtils.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/MUnitUtils.java @@ -17,19 +17,17 @@ public abstract class MUnitUtils { private static final MethodHandles METHOD_HANDLES = new MethodHandles(MUnitRunner.class.getClassLoader()); - private static final MethodHandle RUNNER_CREATE_TEST_DESCRIPTION = - METHOD_HANDLES.method( - MUnitRunner.class, - m -> "createTestDescription".equals(m.getName()) && m.getParameterCount() == 1); - - public static final List CAPABILITIES = - Arrays.asList( - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.IMPACTED, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.ATTEMPT_TO_FIX); + private static final MethodHandle RUNNER_CREATE_TEST_DESCRIPTION = METHOD_HANDLES.method( + MUnitRunner.class, + m -> "createTestDescription".equals(m.getName()) && m.getParameterCount() == 1); + + public static final List CAPABILITIES = Arrays.asList( + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.IMPACTED, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.ATTEMPT_TO_FIX); private MUnitUtils() {} diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java index 8016269af6a..df1b6c710d2 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4-munit-0.7.28/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java @@ -90,10 +90,9 @@ public static Future apply( TestSourceData testSourceData = JUnit4Utils.toTestSourceData(description); Collection testTags = MUnitUtils.getCategories(description); - TestExecutionPolicy executionPolicy = - TestEventsHandlerHolder.HANDLERS - .get(TestFrameworkInstrumentation.MUNIT) - .executionPolicy(testIdentifier, testSourceData, testTags); + TestExecutionPolicy executionPolicy = TestEventsHandlerHolder.HANDLERS + .get(TestFrameworkInstrumentation.MUNIT) + .executionPolicy(testIdentifier, testSourceData, testTags); if (!executionPolicy.applicable()) { // retries not applicable, run original method return null; diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Instrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Instrumentation.java index 840ea9cc196..6e239284859 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Instrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Instrumentation.java @@ -60,11 +60,8 @@ public ElementMatcher hierarchyMatcher() { .and(not(extendsClass(nameStartsWith("munit")))) // PowerMock runner is being instrumented, // so do not instrument its internal delegates - .and( - not( - implementsInterface( - named( - "org.powermock.modules.junit4.common.internal.PowerMockJUnitRunnerDelegate")))); + .and(not(implementsInterface( + named("org.powermock.modules.junit4.common.internal.PowerMockJUnitRunnerDelegate")))); } @Override @@ -134,9 +131,8 @@ public static void addTracingListener( } } - final TracingListener tracingListener = - new JUnit4TracingListener( - InstrumentationContext.get(Description.class, TestExecutionTracker.class)); + final TracingListener tracingListener = new JUnit4TracingListener( + InstrumentationContext.get(Description.class, TestExecutionTracker.class)); runNotifier.addListener(tracingListener); } diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SkipInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SkipInstrumentation.java index 6c836900614..d3c7acffe0d 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SkipInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SkipInstrumentation.java @@ -93,10 +93,9 @@ public static Boolean runChild( } TestIdentifier test = JUnit4Utils.toTestIdentifier(description); - SkipReason skipReason = - TestEventsHandlerHolder.HANDLERS - .get(TestFrameworkInstrumentation.JUNIT4) - .skipReason(test); + SkipReason skipReason = TestEventsHandlerHolder.HANDLERS + .get(TestFrameworkInstrumentation.JUNIT4) + .skipReason(test); if (skipReason == null) { return null; } diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SuiteEventsInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SuiteEventsInstrumentation.java index 37c4f3d5fe5..a87c645eb5f 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SuiteEventsInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4SuiteEventsInstrumentation.java @@ -51,11 +51,10 @@ public String[] helperClassNames() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("run") - .and( - takesArgument( - 0, - named("org.junit.runner.notification.RunNotifier") - .and(not(declaresMethod(named("fireTestSuiteStarted")))))), + .and(takesArgument( + 0, + named("org.junit.runner.notification.RunNotifier") + .and(not(declaresMethod(named("fireTestSuiteStarted")))))), JUnit4SuiteEventsInstrumentation.class.getName() + "$JUnit4SuiteEventsAdvice"); } diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Utils.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Utils.java index ca6f383c2cf..3102b268935 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Utils.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4Utils.java @@ -63,16 +63,15 @@ public abstract class JUnit4Utils { METHOD_HANDLES.privateFieldGetter(Description.class, "fUniqueId"); public static final ComparableVersion junitV413 = new ComparableVersion("4.13"); - public static final List BASE_CAPABILITIES = - Arrays.asList( - LibraryCapability.TIA, - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.IMPACTED, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.DISABLED, - LibraryCapability.ATTEMPT_TO_FIX); + public static final List BASE_CAPABILITIES = Arrays.asList( + LibraryCapability.TIA, + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.IMPACTED, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.DISABLED, + LibraryCapability.ATTEMPT_TO_FIX); private static MethodHandle accessListenersFieldInRunNotifier() { MethodHandle listeners = METHOD_HANDLES.privateFieldGetter(RunNotifier.class, "listeners"); @@ -165,8 +164,8 @@ public static Method getTestMethod(final Description description) { } RunWith runWith = testClass.getAnnotation(RunWith.class); - boolean isJunitParamsTestCase = - runWith != null && "junitparams.JUnitParamsRunner".equals(runWith.value().getName()); + boolean isJunitParamsTestCase = runWith != null + && "junitparams.JUnitParamsRunner".equals(runWith.value().getName()); int junitParamsStartIdx; if (isJunitParamsTestCase && (junitParamsStartIdx = methodName.indexOf('(')) >= 0) { // assuming this is a parameterized test case that uses use pl.pragmatists.JUnitParams diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/execution/JUnit4ExecutionInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/execution/JUnit4ExecutionInstrumentation.java index c998f772275..2e13fcfaeaa 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/execution/JUnit4ExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/execution/JUnit4ExecutionInstrumentation.java @@ -102,10 +102,9 @@ public static Boolean apply( TestSourceData testSourceData = JUnit4Utils.toTestSourceData(description); Collection testTags = JUnit4Utils.getCategories(testSourceData.getTestClass(), testSourceData.getTestMethod()); - TestExecutionPolicy executionPolicy = - TestEventsHandlerHolder.HANDLERS - .get(TestFrameworkInstrumentation.JUNIT4) - .executionPolicy(testIdentifier, testSourceData, testTags); + TestExecutionPolicy executionPolicy = TestEventsHandlerHolder.HANDLERS + .get(TestFrameworkInstrumentation.JUNIT4) + .executionPolicy(testIdentifier, testSourceData, testTags); if (!executionPolicy.applicable()) { // retries not applicable, run original method return null; diff --git a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/order/JUnit4FailFastClassOrderer.java b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/order/JUnit4FailFastClassOrderer.java index 90cef497140..46934319d24 100644 --- a/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/order/JUnit4FailFastClassOrderer.java +++ b/dd-java-agent/instrumentation/junit/junit-4/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/order/JUnit4FailFastClassOrderer.java @@ -14,7 +14,8 @@ public class JUnit4FailFastClassOrderer implements Comparator> { - @Nullable private final TestEventsHandler testEventsHandler; + @Nullable + private final TestEventsHandler testEventsHandler; public JUnit4FailFastClassOrderer( @Nullable TestEventsHandler testEventsHandler) { diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberRetryDescriptorFactory.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberRetryDescriptorFactory.java index 449f3068ec2..ed019b1f707 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberRetryDescriptorFactory.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberRetryDescriptorFactory.java @@ -22,42 +22,33 @@ public final class CucumberRetryDescriptorFactory implements RetryDescriptorFact private static final String PACKAGE = "io.cucumber.junit.platform.engine."; - private static final MethodHandle CONSTRUCTOR_7_24 = - METHOD_HANDLES.constructor( - PACKAGE + "CucumberTestDescriptor$PickleDescriptor", - JUnitPlatformUtils.loadClass(PACKAGE + "CucumberConfiguration"), - UniqueId.class, - String.class, - TestSource.class, - Pickle.class); - private static final MethodHandle CONSTRUCTOR_7_7 = - METHOD_HANDLES.constructor( - PACKAGE + "NodeDescriptor$PickleDescriptor", - ConfigurationParameters.class, - UniqueId.class, - String.class, - TestSource.class, - Pickle.class); - private static final MethodHandle CONSTRUCTOR_6_0 = - METHOD_HANDLES.constructor( - PACKAGE + "PickleDescriptor", - ConfigurationParameters.class, - UniqueId.class, - String.class, - TestSource.class, - Pickle.class); - private static final MethodHandle CONSTRUCTOR_5_4 = - METHOD_HANDLES.constructor( - PACKAGE + "PickleDescriptor", - UniqueId.class, - String.class, - TestSource.class, - Pickle.class); + private static final MethodHandle CONSTRUCTOR_7_24 = METHOD_HANDLES.constructor( + PACKAGE + "CucumberTestDescriptor$PickleDescriptor", + JUnitPlatformUtils.loadClass(PACKAGE + "CucumberConfiguration"), + UniqueId.class, + String.class, + TestSource.class, + Pickle.class); + private static final MethodHandle CONSTRUCTOR_7_7 = METHOD_HANDLES.constructor( + PACKAGE + "NodeDescriptor$PickleDescriptor", + ConfigurationParameters.class, + UniqueId.class, + String.class, + TestSource.class, + Pickle.class); + private static final MethodHandle CONSTRUCTOR_6_0 = METHOD_HANDLES.constructor( + PACKAGE + "PickleDescriptor", + ConfigurationParameters.class, + UniqueId.class, + String.class, + TestSource.class, + Pickle.class); + private static final MethodHandle CONSTRUCTOR_5_4 = METHOD_HANDLES.constructor( + PACKAGE + "PickleDescriptor", UniqueId.class, String.class, TestSource.class, Pickle.class); // 7.24+ stores the configuration on the descriptor, read it back for the reconstruction. - private static final MethodHandle CONFIGURATION_GETTER = - METHOD_HANDLES.privateFieldGetter( - PACKAGE + "CucumberTestDescriptor$PickleDescriptor", "configuration"); + private static final MethodHandle CONFIGURATION_GETTER = METHOD_HANDLES.privateFieldGetter( + PACKAGE + "CucumberTestDescriptor$PickleDescriptor", "configuration"); // The Pickle field was renamed pickleEvent -> pickle; resolved lazily off the descriptor's class. private volatile MethodHandle pickleGetter; diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberUtils.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberUtils.java index c199f4be4e1..c6103629639 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberUtils.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/CucumberUtils.java @@ -31,12 +31,11 @@ public abstract class CucumberUtils { } public static @Nullable String getCucumberVersion(TestEngine cucumberEngine) { - try (InputStream cucumberPropsStream = - cucumberEngine - .getClass() - .getClassLoader() - .getResourceAsStream( - "META-INF/maven/io.cucumber/cucumber-junit-platform-engine/pom.properties")) { + try (InputStream cucumberPropsStream = cucumberEngine + .getClass() + .getClassLoader() + .getResourceAsStream( + "META-INF/maven/io.cucumber/cucumber-junit-platform-engine/pom.properties")) { Properties cucumberProps = new Properties(); cucumberProps.load(cucumberPropsStream); String version = cucumberProps.getProperty("version"); diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberInstrumentation.java index 2ddb230ea86..3f2e4472fb9 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberInstrumentation.java @@ -85,11 +85,10 @@ public static void addTracingListener( EngineExecutionListener originalListener = executionRequest.getEngineExecutionListener(); EngineExecutionListener compositeListener = new CompositeEngineListener(tracingListener, originalListener); - executionRequest = - new ExecutionRequest( - executionRequest.getRootTestDescriptor(), - compositeListener, - executionRequest.getConfigurationParameters()); + executionRequest = new ExecutionRequest( + executionRequest.getRootTestDescriptor(), + compositeListener, + executionRequest.getConfigurationParameters()); } // JUnit 5.3.0 and above diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java index 1833f955f40..9a8a8644ad0 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5-cucumber-5.4/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java @@ -54,10 +54,8 @@ public ElementMatcher hierarchyMatcher() { // legacy Cucumber versions .or(extendsClass(named("io.cucumber.junit.platform.engine.PickleDescriptor"))) // Cucumber 7.24+ - .or( - extendsClass( - named( - "io.cucumber.junit.platform.engine.CucumberTestDescriptor$PickleDescriptor"))); + .or(extendsClass( + named("io.cucumber.junit.platform.engine.CucumberTestDescriptor$PickleDescriptor"))); } @Override diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockInstrumentation.java index 2871d8ff26d..147f791c1f5 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockInstrumentation.java @@ -84,11 +84,10 @@ public static void addTracingListener( EngineExecutionListener originalListener = executionRequest.getEngineExecutionListener(); EngineExecutionListener compositeListener = new CompositeEngineListener(tracingListener, originalListener); - executionRequest = - new ExecutionRequest( - executionRequest.getRootTestDescriptor(), - compositeListener, - executionRequest.getConfigurationParameters()); + executionRequest = new ExecutionRequest( + executionRequest.getRootTestDescriptor(), + compositeListener, + executionRequest.getConfigurationParameters()); } // JUnit 5.3.0 and above diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockRetryDescriptorFactory.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockRetryDescriptorFactory.java index 8c87bf0b775..92b4b4ff3d8 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockRetryDescriptorFactory.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockRetryDescriptorFactory.java @@ -26,17 +26,15 @@ public final class SpockRetryDescriptorFactory implements RetryDescriptorFactory private static final MethodHandles METHOD_HANDLES = new MethodHandles(ClassLoaderUtils.getDefaultClassLoader()); - private static final MethodHandle SIMPLE_FEATURE_NODE_CONSTRUCTOR = - METHOD_HANDLES.constructor( - SimpleFeatureNode.class, - UniqueId.class, - RunnerConfiguration.class, - FeatureInfo.class, - IterationNode.class); + private static final MethodHandle SIMPLE_FEATURE_NODE_CONSTRUCTOR = METHOD_HANDLES.constructor( + SimpleFeatureNode.class, + UniqueId.class, + RunnerConfiguration.class, + FeatureInfo.class, + IterationNode.class); - private static final MethodHandle ITERATION_NODE_CONSTRUCTOR = - METHOD_HANDLES.constructor( - IterationNode.class, UniqueId.class, RunnerConfiguration.class, IterationInfo.class); + private static final MethodHandle ITERATION_NODE_CONSTRUCTOR = METHOD_HANDLES.constructor( + IterationNode.class, UniqueId.class, RunnerConfiguration.class, IterationInfo.class); private static final MethodHandle SIMPLE_FEATURE_NODE_DELEGATE = METHOD_HANDLES.privateFieldGetter(SimpleFeatureNode.class, "delegate"); @@ -73,9 +71,8 @@ private static TestDescriptor copySimpleFeatureNode( UniqueId.Segment delegateSegment = originalDelegate.getUniqueId().getLastSegment(); UniqueId newDelegateId = newId.append(delegateSegment.getType(), delegateSegment.getValue()); - IterationNode delegate = - METHOD_HANDLES.invoke( - ITERATION_NODE_CONSTRUCTOR, newDelegateId, configuration, iterationInfo); + IterationNode delegate = METHOD_HANDLES.invoke( + ITERATION_NODE_CONSTRUCTOR, newDelegateId, configuration, iterationInfo); if (delegate == null) { return null; } diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockUtils.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockUtils.java index 19796973732..2586f65e2e4 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockUtils.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5-spock-2.0/src/main/java/datadog/trace/instrumentation/junit5/SpockUtils.java @@ -119,7 +119,10 @@ public static boolean shouldBeTraced(TestDescriptor testDescriptor) { // We want to filter out iteration nodes to avoid reporting the same test twice, // but keep them for parameterized tests to report each set of parameters as a separate test. return !(testDescriptor instanceof IterationNode) - || testDescriptor.getParent().map(c -> c instanceof ParameterizedFeatureNode).orElse(false); + || testDescriptor + .getParent() + .map(c -> c instanceof ParameterizedFeatureNode) + .orElse(false); } private static Method getTestMethod(MethodSource methodSource) { diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/ExecutionRequestFactory.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/ExecutionRequestFactory.java index 41c8bc4d78e..1ba3996ec05 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/ExecutionRequestFactory.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/ExecutionRequestFactory.java @@ -36,40 +36,36 @@ public class ExecutionRequestFactory { private static final MethodHandle GET_OUTPUT_DIRECTORY_CREATOR = METHOD_HANDLES.method(ExecutionRequest.class, "getOutputDirectoryCreator"); - private static final String[] PARAMETERS_JUNIT6 = - new String[] { - "org.junit.platform.engine.TestDescriptor", - "org.junit.platform.engine.EngineExecutionListener", - "org.junit.platform.engine.ConfigurationParameters", - "org.junit.platform.engine.OutputDirectoryCreator", - "org.junit.platform.engine.support.store.NamespacedHierarchicalStore", - "org.junit.platform.engine.CancellationToken" - }; - - private static final String[] PARAMETERS_JUNIT514 = - new String[] { - "org.junit.platform.engine.TestDescriptor", - "org.junit.platform.engine.EngineExecutionListener", - "org.junit.platform.engine.ConfigurationParameters", - "org.junit.platform.engine.OutputDirectoryCreator", - "org.junit.platform.engine.support.store.NamespacedHierarchicalStore", - }; - - private static final String[] PARAMETERS_JUNIT513 = - new String[] { - "org.junit.platform.engine.TestDescriptor", - "org.junit.platform.engine.EngineExecutionListener", - "org.junit.platform.engine.ConfigurationParameters", - "org.junit.platform.engine.reporting.OutputDirectoryProvider", - "org.junit.platform.engine.support.store.NamespacedHierarchicalStore", - }; - - private static final String[] PARAMETERS_FALLBACK = - new String[] { - "org.junit.platform.engine.TestDescriptor", - "org.junit.platform.engine.EngineExecutionListener", - "org.junit.platform.engine.ConfigurationParameters", - }; + private static final String[] PARAMETERS_JUNIT6 = new String[] { + "org.junit.platform.engine.TestDescriptor", + "org.junit.platform.engine.EngineExecutionListener", + "org.junit.platform.engine.ConfigurationParameters", + "org.junit.platform.engine.OutputDirectoryCreator", + "org.junit.platform.engine.support.store.NamespacedHierarchicalStore", + "org.junit.platform.engine.CancellationToken" + }; + + private static final String[] PARAMETERS_JUNIT514 = new String[] { + "org.junit.platform.engine.TestDescriptor", + "org.junit.platform.engine.EngineExecutionListener", + "org.junit.platform.engine.ConfigurationParameters", + "org.junit.platform.engine.OutputDirectoryCreator", + "org.junit.platform.engine.support.store.NamespacedHierarchicalStore", + }; + + private static final String[] PARAMETERS_JUNIT513 = new String[] { + "org.junit.platform.engine.TestDescriptor", + "org.junit.platform.engine.EngineExecutionListener", + "org.junit.platform.engine.ConfigurationParameters", + "org.junit.platform.engine.reporting.OutputDirectoryProvider", + "org.junit.platform.engine.support.store.NamespacedHierarchicalStore", + }; + + private static final String[] PARAMETERS_FALLBACK = new String[] { + "org.junit.platform.engine.TestDescriptor", + "org.junit.platform.engine.EngineExecutionListener", + "org.junit.platform.engine.ConfigurationParameters", + }; private static final BiFunction EXECUTION_REQUEST_CREATE = createExecutionRequestHandle(); @@ -174,31 +170,28 @@ public class ExecutionRequestFactory { private static BiFunction fallbackFactory() { - MethodHandle constructor = - METHOD_HANDLES.constructor( - ExecutionRequest.class, - TestDescriptor.class, - EngineExecutionListener.class, - ConfigurationParameters.class); - - return (request, listener) -> - METHOD_HANDLES.invoke( - constructor, - request.getRootTestDescriptor(), - listener, - request.getConfigurationParameters()); + MethodHandle constructor = METHOD_HANDLES.constructor( + ExecutionRequest.class, + TestDescriptor.class, + EngineExecutionListener.class, + ConfigurationParameters.class); + + return (request, listener) -> METHOD_HANDLES.invoke( + constructor, + request.getRootTestDescriptor(), + listener, + request.getConfigurationParameters()); } @Nullable private static MethodHandle findCreateMethod(String... parameterTypes) { return METHOD_HANDLES.method( ExecutionRequest.class, - m -> - "create".equals(m.getName()) - && m.getParameterCount() == parameterTypes.length - && Arrays.equals( - Arrays.stream(m.getParameterTypes()).map(Class::getName).toArray(), - parameterTypes)); + m -> "create".equals(m.getName()) + && m.getParameterCount() == parameterTypes.length + && Arrays.equals( + Arrays.stream(m.getParameterTypes()).map(Class::getName).toArray(), + parameterTypes)); } public static ExecutionRequest createExecutionRequest( diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java index bacbafe3464..9b67c5db567 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java @@ -65,9 +65,8 @@ public Map contextStore() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("discover") - .and( - takesArgument(0, named("org.junit.platform.engine.EngineDiscoveryRequest")) - .and(takesArgument(1, named("org.junit.platform.engine.UniqueId")))), + .and(takesArgument(0, named("org.junit.platform.engine.EngineDiscoveryRequest")) + .and(takesArgument(1, named("org.junit.platform.engine.UniqueId")))), JUnit5Instrumentation.class.getName() + "$ContextStoreAdvice"); transformer.applyAdvice( named("execute").and(takesArgument(0, named("org.junit.platform.engine.ExecutionRequest"))), diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java index e3bd1d58eca..0265eb0e2f6 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java @@ -50,49 +50,45 @@ public abstract class JUnitPlatformUtils { public static final ComparableVersion junitV58 = new ComparableVersion("5.8"); - public static final List JUNIT_CAPABILITIES_BASE = - Arrays.asList( - LibraryCapability.TIA, - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.IMPACTED, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.DISABLED, - LibraryCapability.ATTEMPT_TO_FIX); - - public static final List JUNIT_CAPABILITIES_ORDERING = - Arrays.asList( - LibraryCapability.TIA, - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.IMPACTED, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.DISABLED, - LibraryCapability.ATTEMPT_TO_FIX, - LibraryCapability.FAIL_FAST); - - public static final List SPOCK_CAPABILITIES = - Arrays.asList( - LibraryCapability.TIA, - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.IMPACTED, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.DISABLED, - LibraryCapability.ATTEMPT_TO_FIX); - - public static final List CUCUMBER_CAPABILITIES = - Arrays.asList( - LibraryCapability.TIA, - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.DISABLED, - LibraryCapability.ATTEMPT_TO_FIX); + public static final List JUNIT_CAPABILITIES_BASE = Arrays.asList( + LibraryCapability.TIA, + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.IMPACTED, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.DISABLED, + LibraryCapability.ATTEMPT_TO_FIX); + + public static final List JUNIT_CAPABILITIES_ORDERING = Arrays.asList( + LibraryCapability.TIA, + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.IMPACTED, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.DISABLED, + LibraryCapability.ATTEMPT_TO_FIX, + LibraryCapability.FAIL_FAST); + + public static final List SPOCK_CAPABILITIES = Arrays.asList( + LibraryCapability.TIA, + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.IMPACTED, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.DISABLED, + LibraryCapability.ATTEMPT_TO_FIX); + + public static final List CUCUMBER_CAPABILITIES = Arrays.asList( + LibraryCapability.TIA, + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.DISABLED, + LibraryCapability.ATTEMPT_TO_FIX); private JUnitPlatformUtils() {} diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/TestEventsHandlerHolder.java index 1c8656a07cd..1acf123177e 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/TestEventsHandlerHolder.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/TestEventsHandlerHolder.java @@ -58,12 +58,11 @@ public static synchronized void start( TestFrameworkInstrumentation framework = JUnitPlatformUtils.engineToFramework(testEngine); TestEventsHandler handler = HANDLERS.get(framework); if (handler == null) { - handler = - InstrumentationBridge.createTestEventsHandler( - framework.name().toLowerCase(), - suiteStore, - testStore, - JUnitPlatformUtils.capabilities(testEngine)); + handler = InstrumentationBridge.createTestEventsHandler( + framework.name().toLowerCase(), + suiteStore, + testStore, + JUnitPlatformUtils.capabilities(testEngine)); HANDLERS.put(framework, handler); } } diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionInstrumentation.java index 2961aed44e6..e6e4ae41fcc 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionInstrumentation.java @@ -89,11 +89,10 @@ public Reference[] additionalMuzzleReferences() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isConstructor() - .and( - takesArgument( - 3, - named( - "org.junit.platform.engine.support.hierarchical.ThrowableCollector.Factory"))), + .and(takesArgument( + 3, + named( + "org.junit.platform.engine.support.hierarchical.ThrowableCollector.Factory"))), JUnit5ExecutionInstrumentation.class.getName() + "$BeforeTaskConstructor"); transformer.applyAdvice( named("execute").and(takesNoArguments()), @@ -147,10 +146,9 @@ public static Boolean execute(@Advice.This HierarchicalTestExecutorService.TestT TestIdentifier testIdentifier = TestDataFactory.createTestIdentifier(testDescriptor); TestSourceData testSource = TestDataFactory.createTestSourceData(testDescriptor); Collection testTags = JUnitPlatformUtils.getTags(testDescriptor); - TestExecutionPolicy executionPolicy = - TestEventsHandlerHolder.HANDLERS - .get(framework) - .executionPolicy(testIdentifier, testSource, testTags); + TestExecutionPolicy executionPolicy = TestEventsHandlerHolder.HANDLERS + .get(framework) + .executionPolicy(testIdentifier, testSource, testTags); if (!executionPolicy.applicable()) { return null; } @@ -182,9 +180,8 @@ public static Boolean execute(@Advice.This HierarchicalTestExecutorService.TestT * require every test execution to have a distinct unique ID. * Rerunning a test with the ID that was executed previously will cause errors. */ - Map suffix = - Collections.singletonMap( - JUnitPlatformUtils.RETRY_DESCRIPTOR_ID_SUFFIX, String.valueOf(++retryAttemptIdx)); + Map suffix = Collections.singletonMap( + JUnitPlatformUtils.RETRY_DESCRIPTOR_ID_SUFFIX, String.valueOf(++retryAttemptIdx)); TestDescriptor retryDescriptor = descriptorHandle.withIdSuffix(suffix); taskHandle.getListener().dynamicTestRegistered(retryDescriptor); diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java index 7fc86bdf1d5..e4d86ddb4f1 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java @@ -65,9 +65,8 @@ public Map contextStore() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("discover") - .and( - takesArgument(0, named("org.junit.platform.engine.EngineDiscoveryRequest")) - .and(takesArgument(1, named("org.junit.platform.engine.UniqueId")))), + .and(takesArgument(0, named("org.junit.platform.engine.EngineDiscoveryRequest")) + .and(takesArgument(1, named("org.junit.platform.engine.UniqueId")))), JUnit5ExecutionStoreInstrumentation.class.getName() + "$ContextStoreAdvice"); } diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestDescriptorHandle.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestDescriptorHandle.java index 63de4af1367..b8efbbf8387 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestDescriptorHandle.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestDescriptorHandle.java @@ -25,9 +25,8 @@ public class TestDescriptorHandle { JUnitPlatformUtils.loadClass(JUPITER_TEST_DESCRIPTOR); /** {@code JupiterTestDescriptor#copyIncludingDescendants(UnaryOperator)} (5.13+) */ - private static final MethodHandle COPY_INCLUDING_DESCENDANTS = - METHOD_HANDLES.method( - JUPITER_TEST_DESCRIPTOR, "copyIncludingDescendants", UnaryOperator.class); + private static final MethodHandle COPY_INCLUDING_DESCENDANTS = METHOD_HANDLES.method( + JUPITER_TEST_DESCRIPTOR, "copyIncludingDescendants", UnaryOperator.class); // Legacy fallback used when copyIncludingDescendants is unavailable. // Overwrites the final unique ID field by reflection. Lazily created to avoid JEP 500 warnings. @@ -44,10 +43,9 @@ private static MethodHandle uniqueIdSetter() { public static final class MuzzleHelper { public static Collection compileReferences() { - return Collections.singletonList( - new Reference.Builder(AbstractTestDescriptor.class.getName()) - .withField(new String[0], 0, "uniqueId", "Lorg/junit/platform/engine/UniqueId;") - .build()); + return Collections.singletonList(new Reference.Builder(AbstractTestDescriptor.class.getName()) + .withField(new String[0], 0, "uniqueId", "Lorg/junit/platform/engine/UniqueId;") + .build()); } } @@ -66,15 +64,13 @@ public TestDescriptorHandle(TestDescriptor testDescriptor) { } public TestDescriptor withIdSuffix(Map suffices) { - return copy( - testDescriptor, - id -> { - UniqueId updatedId = id; - for (Map.Entry e : suffices.entrySet()) { - updatedId = updatedId.append(e.getKey(), String.valueOf(e.getValue())); - } - return updatedId; - }); + return copy(testDescriptor, id -> { + UniqueId updatedId = id; + for (Map.Entry e : suffices.entrySet()) { + updatedId = updatedId.append(e.getKey(), String.valueOf(e.getValue())); + } + return updatedId; + }); } private static TestDescriptor copy( diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestTaskHandle.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestTaskHandle.java index adf7c364ea5..5be0ed1674c 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestTaskHandle.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/TestTaskHandle.java @@ -38,11 +38,10 @@ public class TestTaskHandle { private static final Class TEST_TASK_CONTEXT_CLASS_REF = JUnitPlatformUtils.loadClass(TEST_TASK_CONTEXT_CLASS); - private static final MethodHandle TEST_TASK_CONSTRUCTOR = - TEST_TASK_CONTEXT_CLASS_REF != null - ? METHOD_HANDLES.constructor( - TEST_TASK_CLASS, TEST_TASK_CONTEXT_CLASS_REF, TestDescriptor.class) - : null; + private static final MethodHandle TEST_TASK_CONSTRUCTOR = TEST_TASK_CONTEXT_CLASS_REF != null + ? METHOD_HANDLES.constructor( + TEST_TASK_CLASS, TEST_TASK_CONTEXT_CLASS_REF, TestDescriptor.class) + : null; // Legacy fallback setters, lazily created to avoid JEP 500 warnings, only used on 1.3.0 private static volatile MethodHandle testDescriptorSetter; @@ -100,35 +99,30 @@ public Iterable buildReferences(TypePool typePool) { .build()); } else { // junit-platform-engine 1.3.0 and earlier - return Collections.singletonList( - new Reference.Builder(TEST_TASK_CLASS) - .withField( - new String[0], - 0, - "listener", - "Lorg/junit/platform/engine/EngineExecutionListener;") - .build()); + return Collections.singletonList(new Reference.Builder(TEST_TASK_CLASS) + .withField( + new String[0], 0, "listener", "Lorg/junit/platform/engine/EngineExecutionListener;") + .build()); } } public static Collection compileReferences() { - return Collections.singletonList( - new Reference.Builder(TEST_TASK_CLASS) - .withField( - new String[0], 0, "testDescriptor", "Lorg/junit/platform/engine/TestDescriptor;") - .withField( - new String[0], 0, "node", "Lorg/junit/platform/engine/support/hierarchical/Node;") - .withField( - new String[0], - 0, - "parentContext", - "Lorg/junit/platform/engine/support/hierarchical/EngineExecutionContext;") - .withField( - new String[0], - 0, - "throwableCollector", - "Lorg/junit/platform/engine/support/hierarchical/ThrowableCollector;") - .build()); + return Collections.singletonList(new Reference.Builder(TEST_TASK_CLASS) + .withField( + new String[0], 0, "testDescriptor", "Lorg/junit/platform/engine/TestDescriptor;") + .withField( + new String[0], 0, "node", "Lorg/junit/platform/engine/support/hierarchical/Node;") + .withField( + new String[0], + 0, + "parentContext", + "Lorg/junit/platform/engine/support/hierarchical/EngineExecutionContext;") + .withField( + new String[0], + 0, + "throwableCollector", + "Lorg/junit/platform/engine/support/hierarchical/ThrowableCollector;") + .build()); } } diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestParameterized.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestParameterized.java index c905257da9d..01acade2d82 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestParameterized.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestParameterized.java @@ -12,9 +12,8 @@ public class TestParameterized { static List parameters() { - return Arrays.asList( - () -> new Object[] {0, 0, "0", "some:\"parameter\""}, - () -> new Object[] {1, 1, 2, "some:\"parameter\""}); + return Arrays.asList(() -> new Object[] {0, 0, "0", "some:\"parameter\""}, () -> + new Object[] {1, 1, 2, "some:\"parameter\""}); } @ParameterizedTest diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSkippedClass.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSkippedClass.java index cdc084f7ba8..c1173b0924a 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSkippedClass.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSkippedClass.java @@ -37,9 +37,8 @@ public void test_parameterized_skipped( } static List parameters() { - return Arrays.asList( - () -> new Object[] {0, 0, "0", "some:\"parameter\""}, - () -> new Object[] {1, 1, 2, "some:\"parameter\""}); + return Arrays.asList(() -> new Object[] {0, 0, "0", "some:\"parameter\""}, () -> + new Object[] {1, 1, 2, "some:\"parameter\""}); } @RepeatedTest(2) diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSucceedExpectedException.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSucceedExpectedException.java index 899235c95e0..7b84beed057 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSucceedExpectedException.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.3/src/test/java/org/example/TestSucceedExpectedException.java @@ -8,10 +8,8 @@ public class TestSucceedExpectedException { @Test public void test_succeed() { - assertThrows( - IllegalArgumentException.class, - () -> { - throw new IllegalArgumentException("expected exception"); - }); + assertThrows(IllegalArgumentException.class, () -> { + throw new IllegalArgumentException("expected exception"); + }); } } diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastClassOrderer.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastClassOrderer.java index 01709b6211f..41f594361fd 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastClassOrderer.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastClassOrderer.java @@ -23,7 +23,8 @@ public FailFastClassOrderer( @Nullable ClassOrderer delegate) { this.testEventsHandler = testEventsHandler; this.delegate = delegate; - this.executionOrderComparator = Comparator.comparing(this::classExecutionPriority).reversed(); + this.executionOrderComparator = + Comparator.comparing(this::classExecutionPriority).reversed(); } private int classExecutionPriority(ClassDescriptor classDescriptor) { diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastMethodOrderer.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastMethodOrderer.java index 4c990fec64f..e0645589627 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastMethodOrderer.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/FailFastMethodOrderer.java @@ -22,7 +22,8 @@ public FailFastMethodOrderer( @Nullable MethodOrderer delegate) { this.testEventsHandler = testEventsHandler; this.delegate = delegate; - this.executionOrderComparator = Comparator.comparing(this::executionPriority).reversed(); + this.executionOrderComparator = + Comparator.comparing(this::executionPriority).reversed(); } private int executionPriority(MethodDescriptor methodDescriptor) { diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5OrderUtils.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5OrderUtils.java index 8fcd20ef126..c954a00b770 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5OrderUtils.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5OrderUtils.java @@ -12,10 +12,8 @@ public class JUnit5OrderUtils { private static final MethodHandles METHOD_HANDLES = new MethodHandles(ClassLoaderUtils.getDefaultClassLoader()); - private static final MethodHandle GET_TEST_DESCRIPTOR = - METHOD_HANDLES.privateFieldGetter( - "org.junit.jupiter.engine.discovery.AbstractAnnotatedDescriptorWrapper", - "testDescriptor"); + private static final MethodHandle GET_TEST_DESCRIPTOR = METHOD_HANDLES.privateFieldGetter( + "org.junit.jupiter.engine.discovery.AbstractAnnotatedDescriptorWrapper", "testDescriptor"); public static TestDescriptor getTestDescriptor(ClassDescriptor classDescriptor) { return METHOD_HANDLES.invoke(GET_TEST_DESCRIPTOR, classDescriptor); diff --git a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java index e0945439d74..832a8e162a2 100644 --- a/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java @@ -83,11 +83,9 @@ public static void onGetClassOrdererExit( } String testOrder = Config.get().getCiVisibilityTestOrder(); if (CIConstants.FAIL_FAST_TEST_ORDER.equalsIgnoreCase(testOrder)) { - classOrderer = - Optional.of( - new FailFastClassOrderer( - TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT5), - classOrderer.orElse(null))); + classOrderer = Optional.of(new FailFastClassOrderer( + TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT5), + classOrderer.orElse(null))); } else { throw new IllegalArgumentException("Unknown test order: " + testOrder); } @@ -109,11 +107,9 @@ public static void onGetMethodOrdererExit( } String testOrder = Config.get().getCiVisibilityTestOrder(); if (CIConstants.FAIL_FAST_TEST_ORDER.equalsIgnoreCase(testOrder)) { - methodOrderer = - Optional.of( - new FailFastMethodOrderer( - TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT5), - methodOrderer.orElse(null))); + methodOrderer = Optional.of(new FailFastMethodOrderer( + TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT5), + methodOrderer.orElse(null))); } else { throw new IllegalArgumentException("Unknown test order: " + testOrder); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/ConsumerCoordinatorInstrumentation.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/ConsumerCoordinatorInstrumentation.java index 57de8c42ff3..3f97a6286ea 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/ConsumerCoordinatorInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/ConsumerCoordinatorInstrumentation.java @@ -92,9 +92,9 @@ public static void trackCommitOffset( if (offsets == null) { return; } - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerCoordinator.class, KafkaConsumerInfo.class) - .get(coordinator); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerCoordinator.class, KafkaConsumerInfo.class) + .get(coordinator); if (kafkaConsumerInfo == null) { return; @@ -117,14 +117,15 @@ public static void trackCommitOffset( continue; } - DataStreamsTags tags = - DataStreamsTags.createWithPartition( - "kafka_commit", - entry.getKey().topic(), - String.valueOf(entry.getKey().partition()), - clusterId, - consumerGroup); - AgentTracer.get().getDataStreamsMonitoring().trackBacklog(tags, entry.getValue().offset()); + DataStreamsTags tags = DataStreamsTags.createWithPartition( + "kafka_commit", + entry.getKey().topic(), + String.valueOf(entry.getKey().partition()), + clusterId, + consumerGroup); + AgentTracer.get() + .getDataStreamsMonitoring() + .trackBacklog(tags, entry.getValue().offset()); } } @@ -145,9 +146,9 @@ public static void trackJoinGroup( if (memberId == null || memberId.isEmpty()) { return; } - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerCoordinator.class, KafkaConsumerInfo.class) - .get(coordinator); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerCoordinator.class, KafkaConsumerInfo.class) + .get(coordinator); if (kafkaConsumerInfo == null) { return; } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInfoInstrumentation.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInfoInstrumentation.java index e428a73d94b..7f1d8913528 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInfoInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInfoInstrumentation.java @@ -159,9 +159,8 @@ public static void captureGroup( } if (Config.get().isDataStreamsEnabled()) { - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); KafkaConfigHelper.storePendingConsumerConfig( state, normalizedConsumerGroup, @@ -212,9 +211,8 @@ public static void captureGroup( } if (Config.get().isDataStreamsEnabled()) { - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); KafkaConfigHelper.storePendingConsumerConfig( state, normalizedConsumerGroup, @@ -238,8 +236,9 @@ public static class RecordsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static AgentScope onEnter(@Advice.This KafkaConsumer consumer) { // Set cluster ID in ClusterIdHolder for Schema Registry instrumentation - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(KafkaConsumer.class, KafkaConsumerInfo.class).get(consumer); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + KafkaConsumer.class, KafkaConsumerInfo.class) + .get(consumer); if (kafkaConsumerInfo != null && Config.get().isDataStreamsEnabled()) { Metadata consumerMetadata = kafkaConsumerInfo.getClientMetadata(); if (consumerMetadata != null) { @@ -267,8 +266,9 @@ public static void captureGroup( @Advice.Thrown Throwable throwable) { int recordsCount = 0; if (records != null) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(KafkaConsumer.class, KafkaConsumerInfo.class).get(consumer); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + KafkaConsumer.class, KafkaConsumerInfo.class) + .get(consumer); if (kafkaConsumerInfo != null) { InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class) .put(records, kafkaConsumerInfo); diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java index 756f59aad4b..d8036552469 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java @@ -113,17 +113,16 @@ public static void wrap( @Advice.Return(readOnly = false) Iterable> iterable, @Advice.This ConsumerRecords records) { if (iterable != null) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class).get(records); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerRecords.class, KafkaConsumerInfo.class) + .get(records); String group = KafkaConsumerInstrumentationHelper.extractGroup(kafkaConsumerInfo); - String clusterId = - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); + String clusterId = KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); String bootstrapServers = KafkaConsumerInstrumentationHelper.extractBootstrapServers(kafkaConsumerInfo); - iterable = - new TracingIterable( - iterable, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); + iterable = new TracingIterable( + iterable, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); } } } @@ -135,17 +134,16 @@ public static void wrap( @Advice.Return(readOnly = false) List> iterable, @Advice.This ConsumerRecords records) { if (iterable != null) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class).get(records); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerRecords.class, KafkaConsumerInfo.class) + .get(records); String group = KafkaConsumerInstrumentationHelper.extractGroup(kafkaConsumerInfo); - String clusterId = - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); + String clusterId = KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); String bootstrapServers = KafkaConsumerInstrumentationHelper.extractBootstrapServers(kafkaConsumerInfo); - iterable = - new TracingList( - iterable, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); + iterable = new TracingList( + iterable, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); } } } @@ -157,17 +155,16 @@ public static void wrap( @Advice.Return(readOnly = false) Iterator> iterator, @Advice.This ConsumerRecords records) { if (iterator != null) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class).get(records); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerRecords.class, KafkaConsumerInfo.class) + .get(records); String group = KafkaConsumerInstrumentationHelper.extractGroup(kafkaConsumerInfo); - String clusterId = - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); + String clusterId = KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); String bootstrapServers = KafkaConsumerInstrumentationHelper.extractBootstrapServers(kafkaConsumerInfo); - iterator = - new TracingIterator( - iterator, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); + iterator = new TracingIterator( + iterator, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java index 53c579a4dee..d8bb227e2a1 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java @@ -30,14 +30,12 @@ public class KafkaDecorator extends MessagingClientDecorator { private static final String KAFKA = "kafka"; public static final CharSequence JAVA_KAFKA = UTF8BytesString.create("java-kafka"); - public static final CharSequence KAFKA_CONSUME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation(KAFKA)); + public static final CharSequence KAFKA_CONSUME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation(KAFKA)); public static final CharSequence KAFKA_POLL = UTF8BytesString.create("kafka.poll"); - public static final CharSequence KAFKA_PRODUCE = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().outboundOperation(KAFKA)); + public static final CharSequence KAFKA_PRODUCE = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().outboundOperation(KAFKA)); public static final CharSequence KAFKA_DELIVER = UTF8BytesString.create("kafka.deliver"); public static final boolean KAFKA_LEGACY_TRACING = Config.get().isKafkaLegacyTracingEnabled(); public static final boolean TIME_IN_QUEUE_ENABLED = @@ -58,29 +56,23 @@ public class KafkaDecorator extends MessagingClientDecorator { pc -> String.join(",", pc.getList(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG)); private static final Functions.Prefix CONSUMER_PREFIX = new Functions.Prefix("Consume Topic "); - public static final KafkaDecorator PRODUCER_DECORATE = - new KafkaDecorator( - Tags.SPAN_KIND_PRODUCER, - InternalSpanTypes.MESSAGE_PRODUCER, - SpanNaming.instance() - .namingSchema() - .messaging() - .outboundService(KAFKA, KAFKA_LEGACY_TRACING)); - - public static final KafkaDecorator CONSUMER_DECORATE = - new KafkaDecorator( - Tags.SPAN_KIND_CONSUMER, - InternalSpanTypes.MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService(KAFKA, KAFKA_LEGACY_TRACING)); - - public static final KafkaDecorator BROKER_DECORATE = - new KafkaDecorator( - Tags.SPAN_KIND_BROKER, - InternalSpanTypes.MESSAGE_BROKER, - SpanNaming.instance().namingSchema().messaging().timeInQueueService(KAFKA)); + public static final KafkaDecorator PRODUCER_DECORATE = new KafkaDecorator( + Tags.SPAN_KIND_PRODUCER, + InternalSpanTypes.MESSAGE_PRODUCER, + SpanNaming.instance() + .namingSchema() + .messaging() + .outboundService(KAFKA, KAFKA_LEGACY_TRACING)); + + public static final KafkaDecorator CONSUMER_DECORATE = new KafkaDecorator( + Tags.SPAN_KIND_CONSUMER, + InternalSpanTypes.MESSAGE_CONSUMER, + SpanNaming.instance().namingSchema().messaging().inboundService(KAFKA, KAFKA_LEGACY_TRACING)); + + public static final KafkaDecorator BROKER_DECORATE = new KafkaDecorator( + Tags.SPAN_KIND_BROKER, + InternalSpanTypes.MESSAGE_BROKER, + SpanNaming.instance().namingSchema().messaging().timeInQueueService(KAFKA)); protected KafkaDecorator( String spanKind, CharSequence spanType, Supplier serviceNameSupplier) { diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerCallback.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerCallback.java index c536e147e77..3ed7a6080a6 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerCallback.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerCallback.java @@ -17,7 +17,9 @@ public class KafkaProducerCallback implements Callback { private final Callback callback; private final AgentSpan parent; private final AgentSpan span; - @Nullable private final String clusterId; + + @Nullable + private final String clusterId; public KafkaProducerCallback( final Callback callback, @@ -52,13 +54,8 @@ public void onCompletion(final RecordMetadata metadata, final Exception exceptio return; } - DataStreamsTags tags = - DataStreamsTags.createWithPartition( - "kafka_produce", - metadata.topic(), - String.valueOf(metadata.partition()), - clusterId, - null); + DataStreamsTags tags = DataStreamsTags.createWithPartition( + "kafka_produce", metadata.topic(), String.valueOf(metadata.partition()), clusterId, null); AgentTracer.get().getDataStreamsMonitoring().trackBacklog(tags, metadata.offset()); } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerInstrumentation.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerInstrumentation.java index f0309fbcb84..479a7276c51 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerInstrumentation.java @@ -230,14 +230,13 @@ public static void onEnter( } } catch (final IllegalStateException e) { // headers must be read-only from reused record. try again with new one. - record = - new ProducerRecord<>( - record.topic(), - record.partition(), - record.timestamp(), - record.key(), - record.value(), - record.headers()); + record = new ProducerRecord<>( + record.topic(), + record.partition(), + record.timestamp(), + record.key(), + record.value(), + record.headers()); defaultPropagator().inject(span, record.headers(), setter); if (STREAMING_CONTEXT.isDisabledForTopic(record.topic()) @@ -265,9 +264,8 @@ public static class ProducerConstructorAdvice { public static void captureConfiguration( @Advice.FieldValue("metadata") Metadata metadata, @Advice.Argument(0) ProducerConfig producerConfig) { - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); if (Config.get().isDataStreamsEnabled()) { KafkaConfigHelper.storePendingProducerConfig( state, KafkaConfigHelper.extractProducerConfig(producerConfig)); @@ -287,17 +285,16 @@ public static void onEnter(@Advice.Argument(value = 0) int estimatedPayloadSize) StatsPoint saved = activeSpan().spanContext().getPathwayContext().getSavedStats(); if (saved != null) { // create new stats including the payload size - StatsPoint updated = - new StatsPoint( - saved.getTags(), - saved.getHash(), - saved.getParentHash(), - saved.getAggregationHash(), - saved.getTimestampNanos(), - saved.getPathwayLatencyNano(), - saved.getEdgeLatencyNano(), - estimatedPayloadSize, - saved.getServiceNameOverride()); + StatsPoint updated = new StatsPoint( + saved.getTags(), + saved.getHash(), + saved.getParentHash(), + saved.getAggregationHash(), + saved.getTimestampNanos(), + saved.getPathwayLatencyNano(), + saved.getEdgeLatencyNano(), + estimatedPayloadSize, + saved.getServiceNameOverride()); // then send the point AgentTracer.get().getDataStreamsMonitoring().add(updated); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/MetadataInstrumentation.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/MetadataInstrumentation.java index 94063de4412..91f259b531c 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/MetadataInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/MetadataInstrumentation.java @@ -88,9 +88,8 @@ public static void onEnter( @Advice.This final Metadata metadata, @Advice.Argument(0) final Cluster newCluster) { if (newCluster != null && !newCluster.isBootstrapConfigured()) { String clusterId = newCluster.clusterResource().clusterId(); - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); state.clusterId = clusterId; KafkaConfigHelper.reportPendingConfig(state, clusterId); } @@ -109,9 +108,8 @@ public static void onEnter( @Advice.This final Metadata metadata, @Advice.Argument(1) final MetadataResponse response) { if (response != null) { String clusterId = response.clusterId(); - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); state.clusterId = clusterId; KafkaConfigHelper.reportPendingConfig(state, clusterId); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterator.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterator.java index 93179e4e3f2..d6508d9fa66 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterator.java @@ -106,12 +106,11 @@ protected void startNewRecordSpan(ConsumerRecord val) { if (timeInQueueStart == 0 || !TIME_IN_QUEUE_ENABLED) { span = startSpan(JAVA_KAFKA.toString(), operationName, spanContext); } else { - queueSpan = - startSpan( - JAVA_KAFKA.toString(), - KAFKA_DELIVER, - spanContext, - MILLISECONDS.toMicros(timeInQueueStart)); + queueSpan = startSpan( + JAVA_KAFKA.toString(), + KAFKA_DELIVER, + spanContext, + MILLISECONDS.toMicros(timeInQueueStart)); BROKER_DECORATE.afterStart(queueSpan); BROKER_DECORATE.onTimeInQueue(queueSpan, val); span = startSpan(JAVA_KAFKA.toString(), operationName, queueSpan.spanContext()); diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConstructorAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConstructorAdvice.java index 085fb7ba866..c0046937a67 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConstructorAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConstructorAdvice.java @@ -57,9 +57,8 @@ public static void captureGroup( } if (Config.get().isDataStreamsEnabled()) { - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); KafkaConfigHelper.storePendingConsumerConfig( state, normalizedConsumerGroup, KafkaConfigHelper.extractConsumerConfig(consumerConfig)); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConsumerCoordinatorAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConsumerCoordinatorAdvice.java index 075590d2206..a3365a3f190 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConsumerCoordinatorAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ConsumerCoordinatorAdvice.java @@ -25,9 +25,9 @@ public static void trackCommitOffset( if (offsets == null) { return; } - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerCoordinator.class, KafkaConsumerInfo.class) - .get(coordinator); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerCoordinator.class, KafkaConsumerInfo.class) + .get(coordinator); if (kafkaConsumerInfo == null) { return; @@ -49,14 +49,15 @@ public static void trackCommitOffset( if (entry.getKey() == null || entry.getValue() == null) { continue; } - DataStreamsTags tags = - DataStreamsTags.createWithPartition( - "kafka_commit", - entry.getKey().topic(), - String.valueOf(entry.getKey().partition()), - clusterId, - consumerGroup); - AgentTracer.get().getDataStreamsMonitoring().trackBacklog(tags, entry.getValue().offset()); + DataStreamsTags tags = DataStreamsTags.createWithPartition( + "kafka_commit", + entry.getKey().topic(), + String.valueOf(entry.getKey().partition()), + clusterId, + consumerGroup); + AgentTracer.get() + .getDataStreamsMonitoring() + .trackBacklog(tags, entry.getValue().offset()); } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/DDOffsetCommitCallback.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/DDOffsetCommitCallback.java index c1eeb0141d0..79b4015fb1b 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/DDOffsetCommitCallback.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/DDOffsetCommitCallback.java @@ -42,14 +42,15 @@ public void onComplete(Map map, Exception e) } } - DataStreamsTags tags = - DataStreamsTags.createWithPartition( - "kafka_commit", - entry.getKey().topic(), - String.valueOf(entry.getKey().partition()), - clusterId, - consumerGroup); - AgentTracer.get().getDataStreamsMonitoring().trackBacklog(tags, entry.getValue().offset()); + DataStreamsTags tags = DataStreamsTags.createWithPartition( + "kafka_commit", + entry.getKey().topic(), + String.valueOf(entry.getKey().partition()), + clusterId, + consumerGroup); + AgentTracer.get() + .getDataStreamsMonitoring() + .trackBacklog(tags, entry.getValue().offset()); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IterableAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IterableAdvice.java index c6cc52a3d9e..9558ce85548 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IterableAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IterableAdvice.java @@ -14,22 +14,21 @@ public static void wrap( @Advice.Return(readOnly = false) Iterable> iterable, @Advice.This ConsumerRecords records) { if (iterable != null) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class).get(records); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerRecords.class, KafkaConsumerInfo.class) + .get(records); String group = KafkaConsumerInstrumentationHelper.extractGroup(kafkaConsumerInfo); - String clusterId = - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); + String clusterId = KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); String bootstrapServers = KafkaConsumerInstrumentationHelper.extractBootstrapServers(kafkaConsumerInfo); - iterable = - new TracingIterable( - iterable, - KafkaDecorator.KAFKA_CONSUME, - KafkaDecorator.CONSUMER_DECORATE, - group, - clusterId, - bootstrapServers); + iterable = new TracingIterable( + iterable, + KafkaDecorator.KAFKA_CONSUME, + KafkaDecorator.CONSUMER_DECORATE, + group, + clusterId, + bootstrapServers); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IteratorAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IteratorAdvice.java index 39859c20e19..8296aa36dff 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IteratorAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/IteratorAdvice.java @@ -15,22 +15,21 @@ public static void wrap( @Advice.Return(readOnly = false) Iterator> iterator, @Advice.This ConsumerRecords records) { if (iterator != null) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class).get(records); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerRecords.class, KafkaConsumerInfo.class) + .get(records); String group = KafkaConsumerInstrumentationHelper.extractGroup(kafkaConsumerInfo); - String clusterId = - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); + String clusterId = KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); String bootstrapServers = KafkaConsumerInstrumentationHelper.extractBootstrapServers(kafkaConsumerInfo); - iterator = - new TracingIterator( - iterator, - KafkaDecorator.KAFKA_CONSUME, - KafkaDecorator.CONSUMER_DECORATE, - group, - clusterId, - bootstrapServers); + iterator = new TracingIterator( + iterator, + KafkaDecorator.KAFKA_CONSUME, + KafkaDecorator.CONSUMER_DECORATE, + group, + clusterId, + bootstrapServers); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/JoinGroupAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/JoinGroupAdvice.java index 41a3ed170be..43b65091865 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/JoinGroupAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/JoinGroupAdvice.java @@ -18,9 +18,9 @@ public static void trackJoinGroup( if (memberId == null || memberId.isEmpty()) { return; } - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerCoordinator.class, KafkaConsumerInfo.class) - .get(coordinator); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerCoordinator.class, KafkaConsumerInfo.class) + .get(coordinator); if (kafkaConsumerInfo == null) { return; } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelper.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelper.java index 57e0baa7edd..9cda9364afe 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelper.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelper.java @@ -27,6 +27,8 @@ public static String extractClusterId( } public static String extractBootstrapServers(KafkaConsumerInfo kafkaConsumerInfo) { - return kafkaConsumerInfo == null ? null : kafkaConsumerInfo.getBootstrapServers().orElse(null); + return kafkaConsumerInfo == null + ? null + : kafkaConsumerInfo.getBootstrapServers().orElse(null); } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java index d2d6f53b8a9..62732f57cad 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java @@ -30,14 +30,12 @@ public class KafkaDecorator extends MessagingClientDecorator { private static final String KAFKA = "kafka"; public static final CharSequence JAVA_KAFKA = UTF8BytesString.create("java-kafka"); - public static final CharSequence KAFKA_CONSUME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation(KAFKA)); + public static final CharSequence KAFKA_CONSUME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation(KAFKA)); public static final CharSequence KAFKA_POLL = UTF8BytesString.create("kafka.poll"); - public static final CharSequence KAFKA_PRODUCE = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().outboundOperation(KAFKA)); + public static final CharSequence KAFKA_PRODUCE = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().outboundOperation(KAFKA)); public static final CharSequence KAFKA_DELIVER = UTF8BytesString.create("kafka.deliver"); public static final boolean KAFKA_LEGACY_TRACING = Config.get().isKafkaLegacyTracingEnabled(); public static final boolean TIME_IN_QUEUE_ENABLED = @@ -58,29 +56,23 @@ public class KafkaDecorator extends MessagingClientDecorator { pc -> String.join(",", pc.getList(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG)); private static final Functions.Prefix CONSUMER_PREFIX = new Functions.Prefix("Consume Topic "); - public static final KafkaDecorator PRODUCER_DECORATE = - new KafkaDecorator( - Tags.SPAN_KIND_PRODUCER, - InternalSpanTypes.MESSAGE_PRODUCER, - SpanNaming.instance() - .namingSchema() - .messaging() - .outboundService(KAFKA, KAFKA_LEGACY_TRACING)); - - public static final KafkaDecorator CONSUMER_DECORATE = - new KafkaDecorator( - Tags.SPAN_KIND_CONSUMER, - InternalSpanTypes.MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService(KAFKA, KAFKA_LEGACY_TRACING)); - - public static final KafkaDecorator BROKER_DECORATE = - new KafkaDecorator( - Tags.SPAN_KIND_BROKER, - InternalSpanTypes.MESSAGE_BROKER, - SpanNaming.instance().namingSchema().messaging().timeInQueueService(KAFKA)); + public static final KafkaDecorator PRODUCER_DECORATE = new KafkaDecorator( + Tags.SPAN_KIND_PRODUCER, + InternalSpanTypes.MESSAGE_PRODUCER, + SpanNaming.instance() + .namingSchema() + .messaging() + .outboundService(KAFKA, KAFKA_LEGACY_TRACING)); + + public static final KafkaDecorator CONSUMER_DECORATE = new KafkaDecorator( + Tags.SPAN_KIND_CONSUMER, + InternalSpanTypes.MESSAGE_CONSUMER, + SpanNaming.instance().namingSchema().messaging().inboundService(KAFKA, KAFKA_LEGACY_TRACING)); + + public static final KafkaDecorator BROKER_DECORATE = new KafkaDecorator( + Tags.SPAN_KIND_BROKER, + InternalSpanTypes.MESSAGE_BROKER, + SpanNaming.instance().namingSchema().messaging().timeInQueueService(KAFKA)); protected KafkaDecorator( String spanKind, CharSequence spanType, Supplier serviceNameSupplier) { diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaProducerCallback.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaProducerCallback.java index dd7bb52989c..179def8f01b 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaProducerCallback.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaProducerCallback.java @@ -50,13 +50,8 @@ public void onCompletion(final RecordMetadata metadata, final Exception exceptio if (metadata == null) { return; } - DataStreamsTags tags = - DataStreamsTags.createWithPartition( - "kafka_produce", - metadata.topic(), - String.valueOf(metadata.partition()), - clusterId, - null); + DataStreamsTags tags = DataStreamsTags.createWithPartition( + "kafka_produce", metadata.topic(), String.valueOf(metadata.partition()), clusterId, null); AgentTracer.get().getDataStreamsMonitoring().trackBacklog(tags, metadata.offset()); } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/LegacyConstructorAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/LegacyConstructorAdvice.java index 35ebb9f8564..ea17859d2cd 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/LegacyConstructorAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/LegacyConstructorAdvice.java @@ -50,9 +50,8 @@ public static void captureGroup( } if (Config.get().isDataStreamsEnabled()) { - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); KafkaConfigHelper.storePendingConsumerConfig( state, normalizedConsumerGroup, KafkaConfigHelper.extractConsumerConfig(consumerConfig)); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ListAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ListAdvice.java index 1c65b8a2ccd..804a75f59c9 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ListAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ListAdvice.java @@ -18,17 +18,16 @@ public static void wrap( @Advice.Return(readOnly = false) List> iterable, @Advice.This ConsumerRecords records) { if (iterable != null) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class).get(records); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerRecords.class, KafkaConsumerInfo.class) + .get(records); String group = KafkaConsumerInstrumentationHelper.extractGroup(kafkaConsumerInfo); - String clusterId = - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); + String clusterId = KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); String bootstrapServers = KafkaConsumerInstrumentationHelper.extractBootstrapServers(kafkaConsumerInfo); - iterable = - new TracingList( - iterable, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); + iterable = new TracingList( + iterable, KAFKA_CONSUME, CONSUMER_DECORATE, group, clusterId, bootstrapServers); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdate22AndAfterAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdate22AndAfterAdvice.java index af2a8ce62ee..7c30c95d063 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdate22AndAfterAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdate22AndAfterAdvice.java @@ -14,9 +14,8 @@ public static void onEnter( @Advice.This final Metadata metadata, @Advice.Argument(1) final MetadataResponse response) { if (response != null) { String clusterId = response.clusterId(); - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); state.clusterId = clusterId; KafkaConfigHelper.reportPendingConfig(state, clusterId); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdateBefore22Advice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdateBefore22Advice.java index f5eab61835c..4440457ae24 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdateBefore22Advice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/MetadataUpdateBefore22Advice.java @@ -14,9 +14,8 @@ public static void onEnter( @Advice.This final Metadata metadata, @Advice.Argument(0) final Cluster newCluster) { if (newCluster != null && !newCluster.isBootstrapConfigured()) { String clusterId = newCluster.clusterResource().clusterId(); - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); state.clusterId = clusterId; KafkaConfigHelper.reportPendingConfig(state, clusterId); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/OffsetCommitCallbackInvokerAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/OffsetCommitCallbackInvokerAdvice.java index fc58fff319d..36f5b037678 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/OffsetCommitCallbackInvokerAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/OffsetCommitCallbackInvokerAdvice.java @@ -10,9 +10,9 @@ public class OffsetCommitCallbackInvokerAdvice { public static void onEnqueue( @Advice.Argument(value = 0, readOnly = false) OffsetCommitCallback callback, @Advice.This OffsetCommitCallbackInvoker callbackInvoker) { - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(OffsetCommitCallbackInvoker.class, KafkaConsumerInfo.class) - .get(callbackInvoker); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + OffsetCommitCallbackInvoker.class, KafkaConsumerInfo.class) + .get(callbackInvoker); callback = new DDOffsetCommitCallback(callback, kafkaConsumerInfo); } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/PayloadSizeAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/PayloadSizeAdvice.java index 3b4effb3979..eb0e3820914 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/PayloadSizeAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/PayloadSizeAdvice.java @@ -18,17 +18,16 @@ public static void onEnter(@Advice.Argument(value = 0) int estimatedPayloadSize) StatsPoint saved = activeSpan().spanContext().getPathwayContext().getSavedStats(); if (saved != null) { // create new stats including the payload size - StatsPoint updated = - new StatsPoint( - saved.getTags(), - saved.getHash(), - saved.getParentHash(), - saved.getAggregationHash(), - saved.getTimestampNanos(), - saved.getPathwayLatencyNano(), - saved.getEdgeLatencyNano(), - estimatedPayloadSize, - saved.getServiceNameOverride()); + StatsPoint updated = new StatsPoint( + saved.getTags(), + saved.getHash(), + saved.getParentHash(), + saved.getAggregationHash(), + saved.getTimestampNanos(), + saved.getPathwayLatencyNano(), + saved.getEdgeLatencyNano(), + estimatedPayloadSize, + saved.getServiceNameOverride()); // then send the point AgentTracer.get().getDataStreamsMonitoring().add(updated); } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerConstructorAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerConstructorAdvice.java index ddff8190bcb..3ac4cb4448d 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerConstructorAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerConstructorAdvice.java @@ -14,9 +14,8 @@ public class ProducerConstructorAdvice { public static void captureConfiguration( @Advice.FieldValue("metadata") Metadata metadata, @Advice.Argument(0) ProducerConfig producerConfig) { - MetadataState state = - InstrumentationContext.get(Metadata.class, MetadataState.class) - .getOrCreate(metadata, MetadataState::new); + MetadataState state = InstrumentationContext.get(Metadata.class, MetadataState.class) + .getOrCreate(metadata, MetadataState::new); if (Config.get().isDataStreamsEnabled()) { KafkaConfigHelper.storePendingProducerConfig( state, KafkaConfigHelper.extractProducerConfig(producerConfig)); diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerContextPropagationAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerContextPropagationAdvice.java index e3094e44e0d..34460299614 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerContextPropagationAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/ProducerContextPropagationAdvice.java @@ -55,14 +55,13 @@ public static void onEnter( } } catch (final IllegalStateException e) { // headers must be read-only from reused record. try again with new one. - record = - new ProducerRecord<>( - record.topic(), - record.partition(), - record.timestamp(), - record.key(), - record.value(), - record.headers()); + record = new ProducerRecord<>( + record.topic(), + record.partition(), + record.timestamp(), + record.key(), + record.value(), + record.headers()); defaultPropagator().inject(span, record.headers(), setter); if (STREAMING_CONTEXT.isDisabledForTopic(record.topic()) diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/RecordsAdvice.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/RecordsAdvice.java index b8f3dff049a..88329e06020 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/RecordsAdvice.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/RecordsAdvice.java @@ -28,12 +28,12 @@ public class RecordsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static AgentScope onEnter(@Advice.This ConsumerDelegate consumer) { // Set cluster ID in ClusterIdHolder for Schema Registry instrumentation - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerDelegate.class, KafkaConsumerInfo.class).get(consumer); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerDelegate.class, KafkaConsumerInfo.class) + .get(consumer); if (kafkaConsumerInfo != null && Config.get().isDataStreamsEnabled()) { - String clusterId = - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); + String clusterId = KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, InstrumentationContext.get(Metadata.class, MetadataState.class)); if (clusterId != null) { ClusterIdHolder.set(clusterId); } @@ -56,8 +56,9 @@ public static void captureGroup( if (records != null) { // new - we are getting the KafkaConsumerInfo from the ConsumerDelegate instead of // KafkaConsumer - KafkaConsumerInfo kafkaConsumerInfo = - InstrumentationContext.get(ConsumerDelegate.class, KafkaConsumerInfo.class).get(consumer); + KafkaConsumerInfo kafkaConsumerInfo = InstrumentationContext.get( + ConsumerDelegate.class, KafkaConsumerInfo.class) + .get(consumer); if (kafkaConsumerInfo != null) { InstrumentationContext.get(ConsumerRecords.class, KafkaConsumerInfo.class) .put(records, kafkaConsumerInfo); diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/TracingIterator.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/TracingIterator.java index 7beba848473..e6af391b34b 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/TracingIterator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/TracingIterator.java @@ -102,12 +102,11 @@ protected void startNewRecordSpan(ConsumerRecord val) { if (timeInQueueStart == 0 || !KafkaDecorator.TIME_IN_QUEUE_ENABLED) { span = startSpan(JAVA_KAFKA.toString(), operationName, spanContext); } else { - queueSpan = - startSpan( - JAVA_KAFKA.toString(), - KafkaDecorator.KAFKA_DELIVER, - spanContext, - MILLISECONDS.toMicros(timeInQueueStart)); + queueSpan = startSpan( + JAVA_KAFKA.toString(), + KafkaDecorator.KAFKA_DELIVER, + spanContext, + MILLISECONDS.toMicros(timeInQueueStart)); KafkaDecorator.BROKER_DECORATE.afterStart(queueSpan); KafkaDecorator.BROKER_DECORATE.onTimeInQueue(queueSpan, val); span = startSpan(JAVA_KAFKA.toString(), operationName, queueSpan.spanContext()); diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/java/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelperTest.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/java/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelperTest.java index dee19831317..bffc2a74887 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/java/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelperTest.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/java/datadog/trace/instrumentation/kafka_clients38/KafkaConsumerInstrumentationHelperTest.java @@ -62,9 +62,8 @@ void extractClusterIdReturnsNullForNullKafkaConsumerInfo() { @Test void extractClusterIdReturnsNullWhenMetadataIsNull() { KafkaConsumerInfo kafkaConsumerInfo = new KafkaConsumerInfo("test-group", "localhost:9092"); - assertNull( - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, metadataContextStore)); + assertNull(KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, metadataContextStore)); } @Test @@ -73,9 +72,8 @@ void extractClusterIdReturnsNullWhenNoStateForMetadata() { KafkaConsumerInfo kafkaConsumerInfo = new KafkaConsumerInfo("test-group", metadata, "localhost:9092"); when(metadataContextStore.get(metadata)).thenReturn(null); - assertNull( - KafkaConsumerInstrumentationHelper.extractClusterId( - kafkaConsumerInfo, metadataContextStore)); + assertNull(KafkaConsumerInstrumentationHelper.extractClusterId( + kafkaConsumerInfo, metadataContextStore)); } @Test diff --git a/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/KafkaConfigHelper.java b/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/KafkaConfigHelper.java index 2ffbf11f46f..8d737fd3aed 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/KafkaConfigHelper.java +++ b/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/KafkaConfigHelper.java @@ -22,74 +22,72 @@ public class KafkaConfigHelper { * Config keys that are safe to capture with their values. Other keys are captured with masked * values. */ - public static final Set ALLOWED_KEYS = - new HashSet<>( - Arrays.asList( - // Common client configs - "bootstrap.servers", - "client.id", - "client.dns.lookup", - "client.rack", - "metadata.max.age.ms", - "metadata.max.idle.ms", - "request.timeout.ms", - "connections.max.idle.ms", - "reconnect.backoff.ms", - "reconnect.backoff.max.ms", - "retry.backoff.ms", - "retry.backoff.max.ms", - "send.buffer.bytes", - "receive.buffer.bytes", - "socket.connection.setup.timeout.ms", - "socket.connection.setup.timeout.max.ms", - "security.protocol", - "metrics.sample.window.ms", - "metrics.num.samples", - "metrics.recording.level", - // Producer configs - "batch.size", - "acks", - "linger.ms", - "buffer.memory", - "max.request.size", - "max.block.ms", - "compression.type", - "delivery.timeout.ms", - "enable.idempotence", - "max.in.flight.requests.per.connection", - "transaction.timeout.ms", - "transactional.id", - "retries", - "partitioner.class", - "partitioner.ignore.keys", - "partitioner.adaptive.partitioning.enable", - "partitioner.availability.timeout.ms", - "key.serializer", - "value.serializer", - // Consumer configs - "group.id", - "group.instance.id", - "group.protocol", - "group.remote.assignor", - "max.poll.records", - "max.poll.interval.ms", - "session.timeout.ms", - "heartbeat.interval.ms", - "enable.auto.commit", - "auto.commit.interval.ms", - "auto.offset.reset", - "partition.assignment.strategy", - "fetch.min.bytes", - "fetch.max.bytes", - "fetch.max.wait.ms", - "max.partition.fetch.bytes", - "check.crcs", - "key.deserializer", - "value.deserializer", - "exclude.internal.topics", - "isolation.level", - "allow.auto.create.topics", - "default.api.timeout.ms")); + public static final Set ALLOWED_KEYS = new HashSet<>(Arrays.asList( + // Common client configs + "bootstrap.servers", + "client.id", + "client.dns.lookup", + "client.rack", + "metadata.max.age.ms", + "metadata.max.idle.ms", + "request.timeout.ms", + "connections.max.idle.ms", + "reconnect.backoff.ms", + "reconnect.backoff.max.ms", + "retry.backoff.ms", + "retry.backoff.max.ms", + "send.buffer.bytes", + "receive.buffer.bytes", + "socket.connection.setup.timeout.ms", + "socket.connection.setup.timeout.max.ms", + "security.protocol", + "metrics.sample.window.ms", + "metrics.num.samples", + "metrics.recording.level", + // Producer configs + "batch.size", + "acks", + "linger.ms", + "buffer.memory", + "max.request.size", + "max.block.ms", + "compression.type", + "delivery.timeout.ms", + "enable.idempotence", + "max.in.flight.requests.per.connection", + "transaction.timeout.ms", + "transactional.id", + "retries", + "partitioner.class", + "partitioner.ignore.keys", + "partitioner.adaptive.partitioning.enable", + "partitioner.availability.timeout.ms", + "key.serializer", + "value.serializer", + // Consumer configs + "group.id", + "group.instance.id", + "group.protocol", + "group.remote.assignor", + "max.poll.records", + "max.poll.interval.ms", + "session.timeout.ms", + "heartbeat.interval.ms", + "enable.auto.commit", + "auto.commit.interval.ms", + "auto.offset.reset", + "partition.assignment.strategy", + "fetch.min.bytes", + "fetch.max.bytes", + "fetch.max.wait.ms", + "max.partition.fetch.bytes", + "check.crcs", + "key.deserializer", + "value.deserializer", + "exclude.internal.topics", + "isolation.level", + "allow.auto.create.topics", + "default.api.timeout.ms")); /** Store a producer config to be reported once the cluster ID is known from metadata. */ public static void storePendingProducerConfig(MetadataState state, Map config) { diff --git a/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/Utils.java b/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/Utils.java index d0f7eb4fcea..6431cb2646a 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/Utils.java +++ b/dd-java-agent/instrumentation/kafka/kafka-common/src/main/java/datadog/trace/instrumentation/kafka_common/Utils.java @@ -10,14 +10,13 @@ public final class Utils { private Utils() {} // prevent instantiation public static DataStreamsTransactionTracker.TransactionSourceReader - DSM_TRANSACTION_SOURCE_READER = - (source, headerName) -> { - try { - return new String(((Headers) source).lastHeader(headerName).value()); - } catch (Throwable ignored) { - return null; - } - }; + DSM_TRANSACTION_SOURCE_READER = (source, headerName) -> { + try { + return new String(((Headers) source).lastHeader(headerName).value()); + } catch (Throwable ignored) { + return null; + } + }; // this method is used in kafka-clients and kafka-streams instrumentations public static long computePayloadSizeBytes(ConsumerRecord val) { diff --git a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamTaskInstrumentation.java b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamTaskInstrumentation.java index 81ddfd4202f..5d55d6627d5 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamTaskInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamTaskInstrumentation.java @@ -122,25 +122,20 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvices( isMethod() .and(named("updateProcessorContext")) - .and( - takesArgument( - 0, named("org.apache.kafka.streams.processor.internals.StampedRecord"))) - .and( - takesArgument( - 1, named("org.apache.kafka.streams.processor.internals.ProcessorNode"))), + .and(takesArgument( + 0, named("org.apache.kafka.streams.processor.internals.StampedRecord"))) + .and(takesArgument( + 1, named("org.apache.kafka.streams.processor.internals.ProcessorNode"))), KafkaStreamTaskInstrumentation.class.getName() + "$ContextPropagationAdvice", KafkaStreamTaskInstrumentation.class.getName() + "$StartSpanAdvice"); // After 2.7 transformer.applyAdvices( isMethod() .and(named("updateProcessorContext")) - .and( - takesArgument( - 0, named("org.apache.kafka.streams.processor.internals.ProcessorNode"))) - .and( - takesArgument( - 2, - named("org.apache.kafka.streams.processor.internals.ProcessorRecordContext"))), + .and(takesArgument( + 0, named("org.apache.kafka.streams.processor.internals.ProcessorNode"))) + .and(takesArgument( + 2, named("org.apache.kafka.streams.processor.internals.ProcessorRecordContext"))), KafkaStreamTaskInstrumentation.class.getName() + "$ContextPropagationAdvice27", KafkaStreamTaskInstrumentation.class.getName() + "$StartSpanAdvice27"); @@ -160,8 +155,9 @@ public static void captureGroup( String applicationId = streamsConfig.getString(StreamsConfig.APPLICATION_ID_CONFIG); if (applicationId != null && !applicationId.isEmpty()) { - StreamTaskContext context = - InstrumentationContext.get(StreamTask.class, StreamTaskContext.class).get(task); + StreamTaskContext context = InstrumentationContext.get( + StreamTask.class, StreamTaskContext.class) + .get(task); if (context == null) { context = new StreamTaskContext(); } @@ -178,8 +174,9 @@ public static void captureGroup( String applicationId = streamsConfig.getString(StreamsConfig.APPLICATION_ID_CONFIG); if (applicationId != null && !applicationId.isEmpty()) { - StreamTaskContext context = - InstrumentationContext.get(StreamTask.class, StreamTaskContext.class).get(task); + StreamTaskContext context = InstrumentationContext.get( + StreamTask.class, StreamTaskContext.class) + .get(task); if (context == null) { context = new StreamTaskContext(); } @@ -196,8 +193,9 @@ public static void captureGroup( String applicationId = streamsConfig.getString(StreamsConfig.APPLICATION_ID_CONFIG); if (applicationId != null && !applicationId.isEmpty()) { - StreamTaskContext context = - InstrumentationContext.get(StreamTask.class, StreamTaskContext.class).get(task); + StreamTaskContext context = InstrumentationContext.get( + StreamTask.class, StreamTaskContext.class) + .get(task); if (context == null) { context = new StreamTaskContext(); } @@ -283,9 +281,8 @@ public static void start( if (timeInQueueStart == 0 || !TIME_IN_QUEUE_ENABLED) { span = startSpan(JAVA_KAFKA.toString(), KAFKA_CONSUME); } else { - queueSpan = - startSpan( - JAVA_KAFKA.toString(), KAFKA_DELIVER, MILLISECONDS.toMicros(timeInQueueStart)); + queueSpan = startSpan( + JAVA_KAFKA.toString(), KAFKA_DELIVER, MILLISECONDS.toMicros(timeInQueueStart)); BROKER_DECORATE.afterStart(queueSpan); BROKER_DECORATE.onTimeInQueue(queueSpan, record); span = startSpan(JAVA_KAFKA.toString(), KAFKA_CONSUME, queueSpan.spanContext()); @@ -349,9 +346,8 @@ public static void start( if (timeInQueueStart == 0 || !TIME_IN_QUEUE_ENABLED) { span = startSpan(JAVA_KAFKA.toString(), KAFKA_CONSUME); } else { - queueSpan = - startSpan( - JAVA_KAFKA.toString(), KAFKA_DELIVER, MILLISECONDS.toMicros(timeInQueueStart)); + queueSpan = startSpan( + JAVA_KAFKA.toString(), KAFKA_DELIVER, MILLISECONDS.toMicros(timeInQueueStart)); BROKER_DECORATE.afterStart(queueSpan); BROKER_DECORATE.onTimeInQueue(queueSpan, record); span = startSpan(JAVA_KAFKA.toString(), KAFKA_CONSUME, queueSpan.spanContext()); diff --git a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java index 97f52bae52c..f0542c5403f 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java @@ -23,9 +23,8 @@ public class KafkaStreamsDecorator extends MessagingClientDecorator { private static final String KAFKA = "kafka"; public static final CharSequence JAVA_KAFKA = UTF8BytesString.create("java-kafka-streams"); - public static final CharSequence KAFKA_CONSUME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation(KAFKA)); + public static final CharSequence KAFKA_CONSUME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation(KAFKA)); public static final CharSequence KAFKA_DELIVER = UTF8BytesString.create("kafka.deliver"); public static final boolean KAFKA_LEGACY_TRACING = Config.get().isKafkaLegacyTracingEnabled(); @@ -41,20 +40,15 @@ public class KafkaStreamsDecorator extends MessagingClientDecorator { DDCaches.newFixedSizeCache(32); private static final Functions.Prefix PREFIX = new Functions.Prefix("Consume Topic "); - public static final KafkaStreamsDecorator CONSUMER_DECORATE = - new KafkaStreamsDecorator( - Tags.SPAN_KIND_CONSUMER, - InternalSpanTypes.MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService(KAFKA, KAFKA_LEGACY_TRACING)); - - public static final KafkaStreamsDecorator BROKER_DECORATE = - new KafkaStreamsDecorator( - Tags.SPAN_KIND_BROKER, - InternalSpanTypes.MESSAGE_BROKER, - SpanNaming.instance().namingSchema().messaging().timeInQueueService(KAFKA)); + public static final KafkaStreamsDecorator CONSUMER_DECORATE = new KafkaStreamsDecorator( + Tags.SPAN_KIND_CONSUMER, + InternalSpanTypes.MESSAGE_CONSUMER, + SpanNaming.instance().namingSchema().messaging().inboundService(KAFKA, KAFKA_LEGACY_TRACING)); + + public static final KafkaStreamsDecorator BROKER_DECORATE = new KafkaStreamsDecorator( + Tags.SPAN_KIND_BROKER, + InternalSpanTypes.MESSAGE_BROKER, + SpanNaming.instance().namingSchema().messaging().timeInQueueService(KAFKA)); protected KafkaStreamsDecorator( String spanKind, CharSequence spanType, Supplier serviceNameSupplier) { diff --git a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsSourceNodeRecordDeserializerInstrumentation.java b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsSourceNodeRecordDeserializerInstrumentation.java index 81348490676..3ec06060f21 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsSourceNodeRecordDeserializerInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsSourceNodeRecordDeserializerInstrumentation.java @@ -46,19 +46,18 @@ public static class SaveHeadersAdvice { public static void saveHeaders( @Advice.Argument(0) final ConsumerRecord incoming, @Advice.Return(readOnly = false) ConsumerRecord result) { - result = - new ConsumerRecord<>( - result.topic(), - result.partition(), - result.offset(), - result.timestamp(), - TimestampType.CREATE_TIME, - result.checksum(), - result.serializedKeySize(), - result.serializedValueSize(), - result.key(), - result.value(), - incoming.headers()); + result = new ConsumerRecord<>( + result.topic(), + result.partition(), + result.offset(), + result.timestamp(), + TimestampType.CREATE_TIME, + result.checksum(), + result.serializedKeySize(), + result.serializedValueSize(), + result.key(), + result.value(), + incoming.headers()); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/ProcessorRecordContextHeadersAccess.java b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/ProcessorRecordContextHeadersAccess.java index 8cde81d5775..ee00d493516 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/ProcessorRecordContextHeadersAccess.java +++ b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/ProcessorRecordContextHeadersAccess.java @@ -17,10 +17,9 @@ public class ProcessorRecordContextHeadersAccess { static { MethodHandle method; try { - method = - MethodHandles.publicLookup() - .findVirtual( - ProcessorRecordContext.class, "headers", MethodType.methodType(Headers.class)); + method = MethodHandles.publicLookup() + .findVirtual( + ProcessorRecordContext.class, "headers", MethodType.methodType(Headers.class)); } catch (Throwable e) { log.debug("Exception loading MethodHandle", e); method = null; diff --git a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java index cf909a85e89..9a64475c67b 100644 --- a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java +++ b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java @@ -30,8 +30,7 @@ public TestExecutionPolicy getExecutionPolicy() { public static ExecutionContext create(Scenario scenario) { TestIdentifier testIdentifier = KarateUtils.toTestIdentifier(scenario); Collection testTags = scenario.getTagsEffective().getTagKeys(); - return new ExecutionContext( - TestEventsHandlerHolder.TEST_EVENTS_HANDLER.executionPolicy( - testIdentifier, TestSourceData.UNKNOWN, testTags)); + return new ExecutionContext(TestEventsHandlerHolder.TEST_EVENTS_HANDLER.executionPolicy( + testIdentifier, TestSourceData.UNKNOWN, testTags)); } } diff --git a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java index 84f3feaff63..9160eeb5c92 100644 --- a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java @@ -80,9 +80,9 @@ public static void beforeExecute(@Advice.This ScenarioRuntime scenarioRuntime) { return; } - ExecutionContext executionContext = - InstrumentationContext.get(Scenario.class, ExecutionContext.class) - .getOrCompute(scenarioRuntime.scenario, ExecutionContext::create); + ExecutionContext executionContext = InstrumentationContext.get( + Scenario.class, ExecutionContext.class) + .getOrCompute(scenarioRuntime.scenario, ExecutionContext::create); // Indicate beforehand if the failures should be suppressed. This aligns the ordering with the // rest of the frameworks diff --git a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java index 4542e816c92..f663caaaf6b 100644 --- a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java +++ b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java @@ -120,9 +120,8 @@ public boolean beforeScenario(ScenarioRuntime sr) { if (skipReason != null && !(skipReason == SkipReason.ITR && categories.contains(CIConstants.Tags.ITR_UNSKIPPABLE_TAG))) { - TestExecutionTracker executionTracker = - (TestExecutionTracker) - sr.magicVariables.get(KarateUtils.EXECUTION_TRACKER_MAGICVARIABLE); + TestExecutionTracker executionTracker = (TestExecutionTracker) + sr.magicVariables.get(KarateUtils.EXECUTION_TRACKER_MAGICVARIABLE); TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestIgnore( suiteDescriptor, testDescriptor, diff --git a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java index 1525d5dd741..2d6e548a272 100644 --- a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java +++ b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java @@ -49,23 +49,21 @@ private KarateUtils() {} private static final ComparableVersion karateV12 = new ComparableVersion("1.2.0"); private static final ComparableVersion karateV13 = new ComparableVersion("1.3.0"); - public static final List CAPABILITIES_BASE = - Arrays.asList( - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.ATTEMPT_TO_FIX); - - public static final List CAPABILITIES_SKIPPING = - Arrays.asList( - LibraryCapability.ATR, - LibraryCapability.EFD, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.ATTEMPT_TO_FIX, - LibraryCapability.TIA, - LibraryCapability.DISABLED); + public static final List CAPABILITIES_BASE = Arrays.asList( + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.ATTEMPT_TO_FIX); + + public static final List CAPABILITIES_SKIPPING = Arrays.asList( + LibraryCapability.ATR, + LibraryCapability.EFD, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.ATTEMPT_TO_FIX, + LibraryCapability.TIA, + LibraryCapability.DISABLED); public static Feature getFeature(FeatureRuntime featureRuntime) { if (FEATURE_RUNTIME_FEATURE_CALL_GETTER != null) { diff --git a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java index 6d9c65cd400..dd96c488ef6 100644 --- a/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java +++ b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java @@ -16,9 +16,8 @@ public abstract class TestEventsHandlerHolder { } public static void start() { - TEST_EVENTS_HANDLER = - InstrumentationBridge.createTestEventsHandler( - "karate", null, null, KarateUtils.capabilities(KarateTracingHook.FRAMEWORK_VERSION)); + TEST_EVENTS_HANDLER = InstrumentationBridge.createTestEventsHandler( + "karate", null, null, KarateUtils.capabilities(KarateTracingHook.FRAMEWORK_VERSION)); } /** Used by instrumentation tests */ diff --git a/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java index 74d246bd98f..f7f5b13fa43 100644 --- a/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java @@ -10,10 +10,9 @@ public class TestSkippedFeatureKarate { @Test void testParallel() { - Results results = - Runner.path("classpath:org/example/test_succeed.feature") - .systemProperty("karate.options", "--tags ~@foo") - .parallel(1); + Results results = Runner.path("classpath:org/example/test_succeed.feature") + .systemProperty("karate.options", "--tags ~@foo") + .parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/ExecutionContext.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/ExecutionContext.java index 3057e6b8ca2..cc131e3a148 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/ExecutionContext.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/ExecutionContext.java @@ -58,8 +58,7 @@ public Throwable getAndClearSuppressedError() { public static ExecutionContext create(Scenario scenario) { TestIdentifier testIdentifier = KarateUtils.toTestIdentifier(scenario); Collection testTags = KarateUtils.getCategories(scenario.getTagsEffective()); - return new ExecutionContext( - TestEventsHandlerHolder.TEST_EVENTS_HANDLER.executionPolicy( - testIdentifier, TestSourceData.UNKNOWN, testTags)); + return new ExecutionContext(TestEventsHandlerHolder.TEST_EVENTS_HANDLER.executionPolicy( + testIdentifier, TestSourceData.UNKNOWN, testTags)); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateScenarioAdvice.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateScenarioAdvice.java index f950a077085..013583affae 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateScenarioAdvice.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateScenarioAdvice.java @@ -21,9 +21,9 @@ public static void beforeExecute(@Advice.This ScenarioRuntime scenarioRuntime) { return; } - ExecutionContext executionContext = - InstrumentationContext.get(Scenario.class, ExecutionContext.class) - .getOrCompute(scenarioRuntime.getScenario(), ExecutionContext::create); + ExecutionContext executionContext = InstrumentationContext.get( + Scenario.class, ExecutionContext.class) + .getOrCompute(scenarioRuntime.getScenario(), ExecutionContext::create); executionContext.setTestStarted(false); // Indicate beforehand whether failures should be suppressed. This aligns the ordering with diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/TestEventsHandlerHolder.java index d2c4c495cab..0c6632ffdfc 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/TestEventsHandlerHolder.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/TestEventsHandlerHolder.java @@ -15,9 +15,8 @@ public abstract class TestEventsHandlerHolder { } public static void start() { - TEST_EVENTS_HANDLER = - InstrumentationBridge.createTestEventsHandler( - "karate", null, null, KarateUtils.capabilities()); + TEST_EVENTS_HANDLER = InstrumentationBridge.createTestEventsHandler( + "karate", null, null, KarateUtils.capabilities()); } @VisibleForTesting diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedAbortSuiteKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedAbortSuiteKarate.java index 3f1547afafa..03aa218c9fa 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedAbortSuiteKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedAbortSuiteKarate.java @@ -10,7 +10,8 @@ public class TestFailedAbortSuiteKarate { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_abort_suite.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_abort_suite.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedExpectedKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedExpectedKarate.java index 06febe5e671..d762d2a3b8c 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedExpectedKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedExpectedKarate.java @@ -10,7 +10,8 @@ public class TestFailedExpectedKarate { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_fail_expected.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_fail_expected.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedUnexpectedKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedUnexpectedKarate.java index acb5c40c5aa..8e778052a29 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedUnexpectedKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedUnexpectedKarate.java @@ -10,7 +10,8 @@ public class TestFailedUnexpectedKarate { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_fail_unexpected.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_fail_unexpected.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedKarate.java index 3d849359504..16463795787 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedKarate.java @@ -10,7 +10,8 @@ public class TestParameterizedKarate { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_parameterized.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_parameterized.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java index 7a0a9af41a4..df2cfa9dd60 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java @@ -10,8 +10,8 @@ public class TestParameterizedMoreCasesKarate { @Test public void test() { - Results results = - Runner.path("classpath:org/example/test_parameterized_more_cases.feature").parallel(1); + Results results = Runner.path("classpath:org/example/test_parameterized_more_cases.feature") + .parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSkippedFeatureKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSkippedFeatureKarate.java index 74d246bd98f..f7f5b13fa43 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSkippedFeatureKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSkippedFeatureKarate.java @@ -10,10 +10,9 @@ public class TestSkippedFeatureKarate { @Test void testParallel() { - Results results = - Runner.path("classpath:org/example/test_succeed.feature") - .systemProperty("karate.options", "--tags ~@foo") - .parallel(1); + Results results = Runner.path("classpath:org/example/test_succeed.feature") + .systemProperty("karate.options", "--tags ~@foo") + .parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedCalledFeatureKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedCalledFeatureKarate.java index df87c42a593..06cbbb61fa2 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedCalledFeatureKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedCalledFeatureKarate.java @@ -10,7 +10,8 @@ public class TestSucceedCalledFeatureKarate { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_called_feature.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_called_feature.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedKarateSlow.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedKarateSlow.java index b5b41c94657..977e9ba9cfe 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedKarateSlow.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedKarateSlow.java @@ -10,7 +10,8 @@ public class TestSucceedKarateSlow { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_succeed_slow.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_succeed_slow.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestUnskippableKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestUnskippableKarate.java index fd82915bc7b..28266907cad 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestUnskippableKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestUnskippableKarate.java @@ -10,7 +10,8 @@ public class TestUnskippableKarate { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_unskippable.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_unskippable.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestWithSetupKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestWithSetupKarate.java index 86a5d703884..88243bc125b 100644 --- a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestWithSetupKarate.java +++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestWithSetupKarate.java @@ -10,7 +10,8 @@ public class TestWithSetupKarate { @Test public void test() { - Results results = Runner.path("classpath:org/example/test_with_setup.feature").parallel(1); + Results results = + Runner.path("classpath:org/example/test_with_setup.feature").parallel(1); assertEquals(0, results.getFailCount(), results.getErrorMessages()); } } diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/InstrumentationPoints.java b/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/InstrumentationPoints.java index 338222cfbc0..9a8717802d2 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/InstrumentationPoints.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/InstrumentationPoints.java @@ -57,17 +57,16 @@ public static void afterCommand( } else if (expectsResponse(command)) { // Register the callback before closing the scope so the active span is correct when // the CompletableFuture instrumentation captures context for the finishing lambda. - asyncCommand.handleAsync( - (value, ex) -> { - if (ex instanceof CancellationException) { - span.setTag("db.command.cancelled", true); - } else { - DECORATE.onError(span, ex); - } - DECORATE.beforeFinish(span); - span.finish(); - return null; - }); + asyncCommand.handleAsync((value, ex) -> { + if (ex instanceof CancellationException) { + span.setTag("db.command.cancelled", true); + } else { + DECORATE.onError(span, ex); + } + DECORATE.beforeFinish(span); + span.finish(); + return null; + }); scope.close(); } else { // No response is expected, so we must finish the span now. diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/LettuceClientDecorator.java b/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/LettuceClientDecorator.java index f05371cdab8..5e0725ab8e6 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/LettuceClientDecorator.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-4.0/src/main/java/datadog/trace/instrumentation/lettuce4/LettuceClientDecorator.java @@ -75,11 +75,7 @@ public void onCommand(final AgentSpan span, final RedisCommand command) } public String resourceNameForConnection(final RedisURI redisURI) { - return "CONNECT:" - + redisURI.getHost() - + ":" - + redisURI.getPort() - + "/" + return "CONNECT:" + redisURI.getHost() + ":" + redisURI.getPort() + "/" + redisURI.getDatabase(); } } diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/jmh/java/datadog/trace/instrumentation/lettuce5/LettuceCommandMatchingBenchmark.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/jmh/java/datadog/trace/instrumentation/lettuce5/LettuceCommandMatchingBenchmark.java index cb25f25e216..9c47142c38b 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/jmh/java/datadog/trace/instrumentation/lettuce5/LettuceCommandMatchingBenchmark.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/jmh/java/datadog/trace/instrumentation/lettuce5/LettuceCommandMatchingBenchmark.java @@ -114,26 +114,24 @@ public void setOutput(final CommandOutput output) { // Representative production traffic: ordinary data commands, none of which ever match // NON_INSTRUMENTING_COMMANDS. - private static final RedisCommand[] MISS_COMMANDS = - Arrays.stream( - new CommandType[] { - CommandType.GET, - CommandType.SET, - CommandType.EXISTS, - CommandType.EXPIRE, - CommandType.HSET, - CommandType.LPUSH, - CommandType.INCR, - }) - .map(FakeRedisCommand::new) - .toArray(RedisCommand[]::new); + private static final RedisCommand[] MISS_COMMANDS = Arrays.stream(new CommandType[] { + CommandType.GET, + CommandType.SET, + CommandType.EXISTS, + CommandType.EXPIRE, + CommandType.HSET, + CommandType.LPUSH, + CommandType.INCR, + }) + .map(FakeRedisCommand::new) + .toArray(RedisCommand[]::new); // Rare admin commands that always match NON_INSTRUMENTING_COMMANDS. Not representative of real // traffic volume -- included only to exercise the hit path. - private static final RedisCommand[] HIT_COMMANDS = - Arrays.stream(new CommandType[] {CommandType.DEBUG, CommandType.SHUTDOWN}) - .map(FakeRedisCommand::new) - .toArray(RedisCommand[]::new); + private static final RedisCommand[] HIT_COMMANDS = Arrays.stream( + new CommandType[] {CommandType.DEBUG, CommandType.SHUTDOWN}) + .map(FakeRedisCommand::new) + .toArray(RedisCommand[]::new); private abstract static class Cursor { int index = 0; diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/AsyncCommandInstrumentation.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/AsyncCommandInstrumentation.java index c427ac15a14..3e8e4fa22d1 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/AsyncCommandInstrumentation.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/AsyncCommandInstrumentation.java @@ -48,9 +48,8 @@ public Map contextStore() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isConstructor() - .and( - takesArguments(1) - .and(takesArgument(0, named("io.lettuce.core.protocol.RedisCommand")))), + .and(takesArguments(1) + .and(takesArgument(0, named("io.lettuce.core.protocol.RedisCommand")))), getClass().getName() + "$Capture"); transformer.applyAdvice( isMethod().and(namedOneOf("complete", "completeExceptionally", "onComplete", "encode")), diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/ConnectionFutureAdvice.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/ConnectionFutureAdvice.java index fd9c335af54..7b3add8be8f 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/ConnectionFutureAdvice.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/ConnectionFutureAdvice.java @@ -15,9 +15,8 @@ public class ConnectionFutureAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static AgentScope onEnter(@Advice.Argument(1) final RedisURI redisUri) { - final AgentSpan span = - startSpan( - LettuceClientDecorator.REDIS_CLIENT.toString(), LettuceClientDecorator.OPERATION_NAME); + final AgentSpan span = startSpan( + LettuceClientDecorator.REDIS_CLIENT.toString(), LettuceClientDecorator.OPERATION_NAME); DECORATE.afterStart(span); span.setResourceName(DECORATE.resourceNameForConnection(redisUri)); DECORATE.onConnection(span, redisUri); @@ -39,11 +38,9 @@ public static void stopSpan( span.finish(); return; } - connectionFuture = - connectionFuture.whenComplete( - new ConnectionContextBiConsumer( - redisUri, InstrumentationContext.get(StatefulConnection.class, RedisURI.class)) - .andThen(new LettuceAsyncBiConsumer<>(span))); + connectionFuture = connectionFuture.whenComplete(new ConnectionContextBiConsumer( + redisUri, InstrumentationContext.get(StatefulConnection.class, RedisURI.class)) + .andThen(new LettuceAsyncBiConsumer<>(span))); scope.close(); // span finished by LettuceAsyncBiConsumer } diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceAsyncCommandsAdvice.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceAsyncCommandsAdvice.java index 8c201abd048..65a09508cd5 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceAsyncCommandsAdvice.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceAsyncCommandsAdvice.java @@ -22,9 +22,8 @@ public static AgentScope onEnter( @Advice.Argument(0) final RedisCommand command, @Advice.This final AbstractRedisAsyncCommands thiz) { - final AgentSpan span = - startSpan( - LettuceClientDecorator.REDIS_CLIENT.toString(), LettuceClientDecorator.OPERATION_NAME); + final AgentSpan span = startSpan( + LettuceClientDecorator.REDIS_CLIENT.toString(), LettuceClientDecorator.OPERATION_NAME); DECORATE.afterStart(span); DECORATE.onConnection( span, diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceClientDecorator.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceClientDecorator.java index 2107b74faa5..ded74c9a8d0 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceClientDecorator.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceClientDecorator.java @@ -71,11 +71,7 @@ public void onCommand(final AgentSpan span, final RedisCommand command) { } public String resourceNameForConnection(final RedisURI redisURI) { - return "CONNECT:" - + redisURI.getHost() - + ":" - + redisURI.getPort() - + "/" + return "CONNECT:" + redisURI.getHost() + ":" + redisURI.getPort() + "/" + redisURI.getDatabase(); } } diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceInstrumentationUtil.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceInstrumentationUtil.java index 92d89d97ecc..bdf9b3175db 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceInstrumentationUtil.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/LettuceInstrumentationUtil.java @@ -14,14 +14,13 @@ public class LettuceInstrumentationUtil { public static final Set NON_INSTRUMENTING_COMMANDS = EnumSet.of(CommandType.SHUTDOWN, CommandType.DEBUG); - public static final Set AGENT_CRASHING_COMMANDS = - EnumSet.of( - CommandType.CLIENT, - CommandType.CLUSTER, - CommandType.COMMAND, - CommandType.CONFIG, - CommandType.DEBUG, - CommandType.SCRIPT); + public static final Set AGENT_CRASHING_COMMANDS = EnumSet.of( + CommandType.CLIENT, + CommandType.CLUSTER, + CommandType.COMMAND, + CommandType.CONFIG, + CommandType.DEBUG, + CommandType.SCRIPT); public static final String AGENT_CRASHING_COMMAND_PREFIX = "COMMAND-NAME:"; @@ -76,10 +75,9 @@ public static boolean expectsResponse(final RedisCommand command) { public static String getCommandResourceName(final RedisCommand command) { final String commandName = getCommandName(command); final ProtocolKeyword type = command == null ? null : command.getType(); - final boolean crashesAgent = - type instanceof CommandType - ? AGENT_CRASHING_COMMANDS.contains(type) - : type != null && AGENT_CRASHING_COMMAND_NAMES.contains(commandName); + final boolean crashesAgent = type instanceof CommandType + ? AGENT_CRASHING_COMMANDS.contains(type) + : type != null && AGENT_CRASHING_COMMAND_NAMES.contains(commandName); if (crashesAgent) { return AGENT_CRASHING_COMMAND_PREFIX + commandName; } diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/MasterReplicaConnectionProviderInstrumentation.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/MasterReplicaConnectionProviderInstrumentation.java index e0f93f7bc20..4630afcd1e9 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/MasterReplicaConnectionProviderInstrumentation.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/MasterReplicaConnectionProviderInstrumentation.java @@ -105,9 +105,8 @@ public static void onExit( return; } - connectionFuture.whenComplete( - MasterReplicaConnectionHelper.onConnectionComplete( - span, InstrumentationContext.get(StatefulConnection.class, RedisURI.class))); + connectionFuture.whenComplete(MasterReplicaConnectionHelper.onConnectionComplete( + span, InstrumentationContext.get(StatefulConnection.class, RedisURI.class))); } } } diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionAdvanceAdvice.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionAdvanceAdvice.java index fd518c7331f..62a0f6ccf63 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionAdvanceAdvice.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionAdvanceAdvice.java @@ -12,10 +12,9 @@ public class RedisSubscriptionAdvanceAdvice { public static void beforeOnNext( @Advice.This Subscription subscription, @Advice.FieldValue("command") RedisCommand command) { - ContextStore store = - InstrumentationContext.get( - "io.lettuce.core.RedisPublisher$RedisSubscription", - "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); + ContextStore store = InstrumentationContext.get( + "io.lettuce.core.RedisPublisher$RedisSubscription", + "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); RedisSubscriptionState value = store.get(subscription); if (value == null) { value = new RedisSubscriptionState(); diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandCompleteAdvice.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandCompleteAdvice.java index ea04ed01cbf..fd9a183b454 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandCompleteAdvice.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandCompleteAdvice.java @@ -18,13 +18,13 @@ public static void afterComplete( @Advice.This RedisCommand command, @Advice.FieldValue("subscription") Subscription subscription) { - AgentSpan span = InstrumentationContext.get(RedisCommand.class, AgentSpan.class).get(command); + AgentSpan span = + InstrumentationContext.get(RedisCommand.class, AgentSpan.class).get(command); if (span != null) { - ContextStore store = - InstrumentationContext.get( - "io.lettuce.core.RedisPublisher$RedisSubscription", - "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); + ContextStore store = InstrumentationContext.get( + "io.lettuce.core.RedisPublisher$RedisSubscription", + "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); RedisSubscriptionState state = store.get(subscription); if (state != null) { diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandOnCompleteAdvice.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandOnCompleteAdvice.java index ca0951bc1ca..44286e09e11 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandOnCompleteAdvice.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandOnCompleteAdvice.java @@ -18,13 +18,13 @@ public static void afterComplete( @Advice.This RedisCommand command, @Advice.FieldValue("subscription") Subscription subscription) { - AgentSpan span = InstrumentationContext.get(RedisCommand.class, AgentSpan.class).get(command); + AgentSpan span = + InstrumentationContext.get(RedisCommand.class, AgentSpan.class).get(command); if (span != null) { - ContextStore store = - InstrumentationContext.get( - "io.lettuce.core.RedisPublisher$RedisSubscription", - "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); + ContextStore store = InstrumentationContext.get( + "io.lettuce.core.RedisPublisher$RedisSubscription", + "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); RedisSubscriptionState state = store.get(subscription); if (state != null) { if (state.count > 1) { diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionConnectionContextAdvice.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionConnectionContextAdvice.java index a973f8a2be7..40efcb45b2f 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionConnectionContextAdvice.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionConnectionContextAdvice.java @@ -11,10 +11,9 @@ public class RedisSubscriptionConnectionContextAdvice { public static void afterConstruct( @Advice.This final Subscription subscription, @Advice.Argument(0) final StatefulConnection connection) { - final ContextStore store = - InstrumentationContext.get( - "io.lettuce.core.RedisPublisher$RedisSubscription", - "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); + final ContextStore store = InstrumentationContext.get( + "io.lettuce.core.RedisPublisher$RedisSubscription", + "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState"); RedisSubscriptionState value = store.get(subscription); if (value == null) { value = new RedisSubscriptionState(); diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionSubscribeAdvice.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionSubscribeAdvice.java index d10800f5d94..9f8054cd4a8 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionSubscribeAdvice.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionSubscribeAdvice.java @@ -33,19 +33,16 @@ public static State beforeSubscribe( @Advice.FieldValue("subscriptionCommand") RedisCommand subscriptionCommand) { AgentScope parentScope = null; - RedisSubscriptionState state = - (RedisSubscriptionState) - InstrumentationContext.get( - "io.lettuce.core.RedisPublisher$RedisSubscription", - "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState") - .get(subscription); + RedisSubscriptionState state = (RedisSubscriptionState) InstrumentationContext.get( + "io.lettuce.core.RedisPublisher$RedisSubscription", + "datadog.trace.instrumentation.lettuce5.rx.RedisSubscriptionState") + .get(subscription); AgentSpan parentSpan = state != null ? state.parentSpan : null; if (parentSpan != null) { parentScope = activateSpan(parentSpan); } - AgentSpan span = - startSpan( - LettuceClientDecorator.REDIS_CLIENT.toString(), LettuceClientDecorator.OPERATION_NAME); + AgentSpan span = startSpan( + LettuceClientDecorator.REDIS_CLIENT.toString(), LettuceClientDecorator.OPERATION_NAME); InstrumentationContext.get(RedisCommand.class, AgentSpan.class).put(subscriptionCommand, span); DECORATE.afterStart(span); if (state != null && state.connection != null) { diff --git a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/test/java/Lettuce5MasterReplicaTest.java b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/test/java/Lettuce5MasterReplicaTest.java index 40d8564e34c..afed28d5b20 100644 --- a/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/test/java/Lettuce5MasterReplicaTest.java +++ b/dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/test/java/Lettuce5MasterReplicaTest.java @@ -32,9 +32,8 @@ class Lettuce5MasterReplicaTest extends AbstractInstrumentationTest { @BeforeEach void setUpRedis() throws Exception { - redisServer = - new RedisContainer(DockerImageName.parse("redis:6.2.6")) - .waitingFor(Wait.forListeningPort()); + redisServer = new RedisContainer(DockerImageName.parse("redis:6.2.6")) + .waitingFor(Wait.forListeningPort()); redisServer.start(); host = redisServer.getHost(); diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/HttpInboundServiceContextImplInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/HttpInboundServiceContextImplInstrumentation.java index e866c638f8b..2583d133049 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/HttpInboundServiceContextImplInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/HttpInboundServiceContextImplInstrumentation.java @@ -74,9 +74,8 @@ static class SyncAdviceBuffer { if (callDepth > 0) { return null; } - ContextStore store = - InstrumentationContext.get( - REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); + ContextStore store = InstrumentationContext.get( + REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); Object o = store.get(thiz.getRequest()); if (o == null) { return null; diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyBlockingHelper.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyBlockingHelper.java index 719ba39378b..f11afcfbfb4 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyBlockingHelper.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyBlockingHelper.java @@ -87,9 +87,8 @@ public static BlockingException syncBufferEnter( BlockingContentType bct = rba.getBlockingContentType(); final WsByteBuffer[] bufferArray; if (bct != BlockingContentType.NONE) { - BlockingActionHelper.TemplateType type = - BlockingActionHelper.determineTemplateType( - bct, thiz.getRequest().getHeader("Accept").asString()); + BlockingActionHelper.TemplateType type = BlockingActionHelper.determineTemplateType( + bct, thiz.getRequest().getHeader("Accept").asString()); byte[] template = BlockingActionHelper.getTemplate(type, rba.getSecurityResponseId()); response.setHeader("Content-length", Integer.toString(template.length)); response.setHeader("Content-type", BlockingActionHelper.getContentType(type)); diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java index 162a13970f4..96ae3106268 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java @@ -162,9 +162,8 @@ public static class HandleRequestAdvice { request.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); if (ActiveSubsystems.APPSEC_ACTIVE) { - ContextStore store = - InstrumentationContext.get( - REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); + ContextStore store = InstrumentationContext.get( + REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); // Provide the span to lower layers // The span is associated with the c.i.w.http.channel.internal.HttpRequestMessageImpl object store.put(RequestMessageFromServletRequestHelper.getHttpRequestMessage(request), span); diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestMessageFromServletRequestHelper.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestMessageFromServletRequestHelper.java index fb5bd70780e..6970d981e06 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestMessageFromServletRequestHelper.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestMessageFromServletRequestHelper.java @@ -20,18 +20,16 @@ public static Object getHttpRequestMessage(SRTServletRequest request) { ((IRequestExtended) iRequest).getHttpInboundConnection().getRequest(); try { MethodHandle messageGetter = - FIELD_CACHE.computeIfAbsent( - transportRequest.getClass(), - clazz -> { - Field messageField; - try { - messageField = clazz.getDeclaredField("message"); - messageField.setAccessible(true); - return MethodHandles.lookup().unreflectGetter(messageField); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - }); + FIELD_CACHE.computeIfAbsent(transportRequest.getClass(), clazz -> { + Field messageField; + try { + messageField = clazz.getDeclaredField("message"); + messageField.setAccessible(true); + return MethodHandles.lookup().unreflectGetter(messageField); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + }); return messageGetter.invoke(transportRequest); } catch (Throwable e) { throw new RuntimeException(e); diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/webapp/java/datadog/trace/instrumentation/liberty20/AsyncServlet3.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/webapp/java/datadog/trace/instrumentation/liberty20/AsyncServlet3.java index 5fe02eef377..1d93b9e1375 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/webapp/java/datadog/trace/instrumentation/liberty20/AsyncServlet3.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/webapp/java/datadog/trace/instrumentation/liberty20/AsyncServlet3.java @@ -61,14 +61,13 @@ public class AsyncServlet3 extends HttpServlet { { try { - delegate = - new datadog.trace.instrumentation.servlet3.TestServlet3.Sync() { - @Override - public HttpServerTest.ServerEndpoint determineEndpoint(HttpServletRequest req) { - return HttpServerTest.ServerEndpoint.forPath( - req.getRequestURI().substring(req.getRequestURI().lastIndexOf('/'))); - } - }; + delegate = new datadog.trace.instrumentation.servlet3.TestServlet3.Sync() { + @Override + public HttpServerTest.ServerEndpoint determineEndpoint(HttpServletRequest req) { + return HttpServerTest.ServerEndpoint.forPath( + req.getRequestURI().substring(req.getRequestURI().lastIndexOf('/'))); + } + }; } catch (Exception e) { throw new RuntimeException(e); } @@ -111,28 +110,27 @@ public PrintWriter getWriter() throws IOException { AsyncContext asyncContext = req.startAsync(); asyncContext.setTimeout(1000); - asyncContext.addListener( - new AsyncListener() { - @Override - public void onComplete(AsyncEvent event) throws IOException { - log("onComplete"); - } - - @Override - public void onTimeout(AsyncEvent event) throws IOException { - log("onTimeout"); - } - - @Override - public void onError(AsyncEvent event) throws IOException { - log("onError", event.getThrowable()); - } - - @Override - public void onStartAsync(AsyncEvent event) throws IOException { - event.getAsyncContext().addListener(this); - } - }); + asyncContext.addListener(new AsyncListener() { + @Override + public void onComplete(AsyncEvent event) throws IOException { + log("onComplete"); + } + + @Override + public void onTimeout(AsyncEvent event) throws IOException { + log("onTimeout"); + } + + @Override + public void onError(AsyncEvent event) throws IOException { + log("onError", event.getThrowable()); + } + + @Override + public void onStartAsync(AsyncEvent event) throws IOException { + event.getAsyncContext().addListener(this); + } + }); ServletOutputStream outputStream; try { @@ -141,20 +139,19 @@ public void onStartAsync(AsyncEvent event) throws IOException { throw new RuntimeException(e); } - WriteListener listener = - new WriteListener() { - @Override - public void onWritePossible() throws IOException { - outputStream.write(baos.toByteArray()); - asyncContext.complete(); - } - - @Override - public void onError(Throwable e) { - log("onError", e); - asyncContext.complete(); - } - }; + WriteListener listener = new WriteListener() { + @Override + public void onWritePossible() throws IOException { + outputStream.write(baos.toByteArray()); + asyncContext.complete(); + } + + @Override + public void onError(Throwable e) { + log("onError", e); + asyncContext.complete(); + } + }; try { Method setWriteListener = diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/HttpInboundServiceContextImplInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/HttpInboundServiceContextImplInstrumentation.java index f9f3da82162..3b0b6faa885 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/HttpInboundServiceContextImplInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/HttpInboundServiceContextImplInstrumentation.java @@ -74,9 +74,8 @@ static class SyncAdviceBuffer { if (callDepth > 0) { return null; } - ContextStore store = - InstrumentationContext.get( - REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); + ContextStore store = InstrumentationContext.get( + REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); Object o = store.get(thiz.getRequest()); if (o == null) { return null; diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyBlockingHelper.java b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyBlockingHelper.java index bc35ec1ef3c..2b225afbf88 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyBlockingHelper.java +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyBlockingHelper.java @@ -87,9 +87,8 @@ public static BlockingException syncBufferEnter( BlockingContentType bct = rba.getBlockingContentType(); final WsByteBuffer[] bufferArray; if (bct != BlockingContentType.NONE) { - BlockingActionHelper.TemplateType type = - BlockingActionHelper.determineTemplateType( - bct, thiz.getRequest().getHeader("Accept").asString()); + BlockingActionHelper.TemplateType type = BlockingActionHelper.determineTemplateType( + bct, thiz.getRequest().getHeader("Accept").asString()); byte[] template = BlockingActionHelper.getTemplate(type, rba.getSecurityResponseId()); response.setHeader("Content-length", Integer.toString(template.length)); response.setHeader("Content-type", BlockingActionHelper.getContentType(type)); diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java index 220085c4d55..a37fdc70632 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java @@ -163,9 +163,8 @@ public static class HandleRequestAdvice { CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); request.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); if (ActiveSubsystems.APPSEC_ACTIVE) { - ContextStore store = - InstrumentationContext.get( - REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); + ContextStore store = InstrumentationContext.get( + REQUEST_MSG_TYPE, "datadog.trace.bootstrap.instrumentation.api.AgentSpan"); // Provide the span to lower layers // The span is associated with the c.i.w.http.channel.internal.HttpRequestMessageImpl object store.put(RequestMessageFromServletRequestHelper.getHttpRequestMessage(request), span); diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestMessageFromServletRequestHelper.java b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestMessageFromServletRequestHelper.java index feb6ac7c6af..8b589be193e 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestMessageFromServletRequestHelper.java +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestMessageFromServletRequestHelper.java @@ -20,18 +20,16 @@ public static Object getHttpRequestMessage(SRTServletRequest request) { ((IRequestExtended) iRequest).getHttpInboundConnection().getRequest(); try { MethodHandle messageGetter = - FIELD_CACHE.computeIfAbsent( - transportRequest.getClass(), - clazz -> { - Field messageField; - try { - messageField = clazz.getDeclaredField("message"); - messageField.setAccessible(true); - return MethodHandles.lookup().unreflectGetter(messageField); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - }); + FIELD_CACHE.computeIfAbsent(transportRequest.getClass(), clazz -> { + Field messageField; + try { + messageField = clazz.getDeclaredField("message"); + messageField.setAccessible(true); + return MethodHandles.lookup().unreflectGetter(messageField); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + }); return messageGetter.invoke(transportRequest); } catch (Throwable e) { throw new RuntimeException(e); diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/webapp/java/datadog/trace/instrumentation/liberty23/AsyncServlet5.java b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/webapp/java/datadog/trace/instrumentation/liberty23/AsyncServlet5.java index e18e38d308a..8600e153dc5 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/webapp/java/datadog/trace/instrumentation/liberty23/AsyncServlet5.java +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/webapp/java/datadog/trace/instrumentation/liberty23/AsyncServlet5.java @@ -61,14 +61,13 @@ public class AsyncServlet5 extends HttpServlet { { try { - delegate = - new datadog.trace.instrumentation.servlet5.TestServlet5() { - @Override - public HttpServerTest.ServerEndpoint determineEndpoint(HttpServletRequest req) { - return HttpServerTest.ServerEndpoint.forPath( - req.getRequestURI().substring(req.getRequestURI().lastIndexOf('/'))); - } - }; + delegate = new datadog.trace.instrumentation.servlet5.TestServlet5() { + @Override + public HttpServerTest.ServerEndpoint determineEndpoint(HttpServletRequest req) { + return HttpServerTest.ServerEndpoint.forPath( + req.getRequestURI().substring(req.getRequestURI().lastIndexOf('/'))); + } + }; } catch (Exception e) { throw new RuntimeException(e); } @@ -111,28 +110,27 @@ public PrintWriter getWriter() throws IOException { AsyncContext asyncContext = req.startAsync(); asyncContext.setTimeout(1000); - asyncContext.addListener( - new AsyncListener() { - @Override - public void onComplete(AsyncEvent event) throws IOException { - log("onComplete"); - } - - @Override - public void onTimeout(AsyncEvent event) throws IOException { - log("onTimeout"); - } - - @Override - public void onError(AsyncEvent event) throws IOException { - log("onError", event.getThrowable()); - } - - @Override - public void onStartAsync(AsyncEvent event) throws IOException { - event.getAsyncContext().addListener(this); - } - }); + asyncContext.addListener(new AsyncListener() { + @Override + public void onComplete(AsyncEvent event) throws IOException { + log("onComplete"); + } + + @Override + public void onTimeout(AsyncEvent event) throws IOException { + log("onTimeout"); + } + + @Override + public void onError(AsyncEvent event) throws IOException { + log("onError", event.getThrowable()); + } + + @Override + public void onStartAsync(AsyncEvent event) throws IOException { + event.getAsyncContext().addListener(this); + } + }); ServletOutputStream outputStream; try { @@ -141,20 +139,19 @@ public void onStartAsync(AsyncEvent event) throws IOException { throw new RuntimeException(e); } - WriteListener listener = - new WriteListener() { - @Override - public void onWritePossible() throws IOException { - outputStream.write(baos.toByteArray()); - asyncContext.complete(); - } - - @Override - public void onError(Throwable e) { - log("onError", e); - asyncContext.complete(); - } - }; + WriteListener listener = new WriteListener() { + @Override + public void onWritePossible() throws IOException { + outputStream.write(baos.toByteArray()); + asyncContext.complete(); + } + + @Override + public void onError(Throwable e) { + log("onError", e); + asyncContext.complete(); + } + }; try { Method setWriteListener = diff --git a/dd-java-agent/instrumentation/log4j/log4j-2.0/src/main/java/datadog/trace/instrumentation/log4j2/DatadogAppender.java b/dd-java-agent/instrumentation/log4j/log4j-2.0/src/main/java/datadog/trace/instrumentation/log4j2/DatadogAppender.java index 5a151f90d11..95098737c24 100644 --- a/dd-java-agent/instrumentation/log4j/log4j-2.0/src/main/java/datadog/trace/instrumentation/log4j2/DatadogAppender.java +++ b/dd-java-agent/instrumentation/log4j/log4j-2.0/src/main/java/datadog/trace/instrumentation/log4j2/DatadogAppender.java @@ -52,9 +52,8 @@ private Map map(final LogEvent event) { PrintWriter printWriter = new PrintWriter(stringWriter); thrown.printStackTrace(printWriter); StringBuffer stackTraceBuffer = stringWriter.getBuffer(); - String stackTraceString = - stackTraceBuffer.substring( - 0, Math.min(stackTraceBuffer.length(), MAX_STACKTRACE_STRING_LENGTH)); + String stackTraceString = stackTraceBuffer.substring( + 0, Math.min(stackTraceBuffer.length(), MAX_STACKTRACE_STRING_LENGTH)); thrownLog.put("extendedStackTrace", stackTraceString); log.put("thrown", thrownLog); diff --git a/dd-java-agent/instrumentation/log4j/log4j-2.7/src/main/java/datadog/trace/instrumentation/log4j27/SpanDecoratingContextDataInjector.java b/dd-java-agent/instrumentation/log4j/log4j-2.7/src/main/java/datadog/trace/instrumentation/log4j27/SpanDecoratingContextDataInjector.java index f3e73b6e6d2..0303be5627a 100644 --- a/dd-java-agent/instrumentation/log4j/log4j-2.7/src/main/java/datadog/trace/instrumentation/log4j27/SpanDecoratingContextDataInjector.java +++ b/dd-java-agent/instrumentation/log4j/log4j-2.7/src/main/java/datadog/trace/instrumentation/log4j27/SpanDecoratingContextDataInjector.java @@ -61,7 +61,8 @@ public StringMap injectContextData(List list, StringMap reusable) { : traceId.toString(); newContextData.putValue(CorrelationIdentifier.getTraceIdKey(), traceIdValue); newContextData.putValue( - CorrelationIdentifier.getSpanIdKey(), DDSpanId.toString(span.spanContext().getSpanId())); + CorrelationIdentifier.getSpanIdKey(), + DDSpanId.toString(span.spanContext().getSpanId())); } newContextData.putAll(contextData); diff --git a/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LoggingEventInstrumentation.java b/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LoggingEventInstrumentation.java index 2d78ccb8336..b3404031162 100644 --- a/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LoggingEventInstrumentation.java +++ b/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LoggingEventInstrumentation.java @@ -67,8 +67,9 @@ public static void onExit( return; } - AgentSpanContext context = - InstrumentationContext.get(ILoggingEvent.class, AgentSpanContext.class).get(event); + AgentSpanContext context = InstrumentationContext.get( + ILoggingEvent.class, AgentSpanContext.class) + .get(event); // Nothing to add so return early if (context == null && !AgentTracer.traceConfig().isLogsInjectionEnabled()) { diff --git a/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LogsIntakeHelper.java b/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LogsIntakeHelper.java index 593acd82508..9d73caabe70 100644 --- a/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LogsIntakeHelper.java +++ b/dd-java-agent/instrumentation/logback-1.0/src/main/java/datadog/trace/instrumentation/logback/LogsIntakeHelper.java @@ -25,10 +25,10 @@ private static Map map(ILoggingEvent event) { Map thrownLog = new HashMap<>(); thrownLog.put("message", event.getThrowableProxy().getMessage()); thrownLog.put("name", event.getThrowableProxy().getClassName()); - String stackTraceString = - Arrays.stream(event.getThrowableProxy().getStackTraceElementProxyArray()) - .map(StackTraceElementProxy::getSTEAsString) - .collect(Collectors.joining(" ")); + String stackTraceString = Arrays.stream( + event.getThrowableProxy().getStackTraceElementProxyArray()) + .map(StackTraceElementProxy::getSTEAsString) + .collect(Collectors.joining(" ")); thrownLog.put("extendedStackTrace", stackTraceString); log.put("thrown", thrownLog); } diff --git a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenExecutionListener.java b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenExecutionListener.java index acbe78f7946..67873ff2383 100644 --- a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenExecutionListener.java +++ b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenExecutionListener.java @@ -88,31 +88,22 @@ public void mojoStarted(ExecutionEvent event) { Build build = project.getBuild(); SourceSet classes = getSourceSet(SourceSet.Type.CODE, build.getSourceDirectory(), build.getOutputDirectory()); - SourceSet tests = - getSourceSet( - SourceSet.Type.TEST, build.getTestSourceDirectory(), build.getTestOutputDirectory()); + SourceSet tests = getSourceSet( + SourceSet.Type.TEST, build.getTestSourceDirectory(), build.getTestOutputDirectory()); BuildModuleLayout moduleLayout = new BuildModuleLayout(Arrays.asList(classes, tests)); Path forkedJvmPath = MavenUtils.getForkedJvmPath(session, mojoExecution); List classpath = MavenUtils.getClasspath(session, mojoExecution); - String executionId = - mojoExecution.getPlugin().getArtifactId() - + ":" - + mojoExecution.getGoal() - + ":" - + mojoExecution.getExecutionId(); + String executionId = mojoExecution.getPlugin().getArtifactId() + + ":" + + mojoExecution.getGoal() + + ":" + + mojoExecution.getExecutionId(); Map additionalTags = Collections.singletonMap(Tags.TEST_EXECUTION, executionId); JavaAgent jacocoAgent = MavenUtils.getJacocoAgent(session, project, mojoExecution); - BuildModuleSettings moduleSettings = - buildEventsHandler.onTestModuleStart( - request, - moduleName, - moduleLayout, - forkedJvmPath, - classpath, - jacocoAgent, - additionalTags); + BuildModuleSettings moduleSettings = buildEventsHandler.onTestModuleStart( + request, moduleName, moduleLayout, forkedJvmPath, classpath, jacocoAgent, additionalTags); String forkCount = MavenUtils.getConfigurationValue(session, mojoExecution, "forkCount"); if ("0".equals(forkCount)) { diff --git a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenLifecycleParticipant.java b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenLifecycleParticipant.java index 4572555b6cd..ecb4e1b2479 100644 --- a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenLifecycleParticipant.java +++ b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenLifecycleParticipant.java @@ -46,17 +46,14 @@ public void afterSessionStart(MavenSession session) { // that will forward each event both to the original listener and to our custom one. // Since ExecutionListener may (and does) change depending on Maven version, // we use a dynamic proxy instead of implementing the interface - InvocationHandler invocationHandler = - (Object target, Method method, Object[] args) -> { - method.invoke(spyExecutionListener, args); - return method.invoke(originalExecutionListener, args); - }; - ExecutionListener proxyExecutionListener = - (ExecutionListener) - Proxy.newProxyInstance( - MavenLifecycleParticipant.class.getClassLoader(), - new Class[] {ExecutionListener.class}, - invocationHandler); + InvocationHandler invocationHandler = (Object target, Method method, Object[] args) -> { + method.invoke(spyExecutionListener, args); + return method.invoke(originalExecutionListener, args); + }; + ExecutionListener proxyExecutionListener = (ExecutionListener) Proxy.newProxyInstance( + MavenLifecycleParticipant.class.getClassLoader(), + new Class[] {ExecutionListener.class}, + invocationHandler); session.getRequest().setExecutionListener(proxyExecutionListener); } diff --git a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenProjectConfigurator.java b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenProjectConfigurator.java index dd63e02b0e0..bc3b8130b99 100644 --- a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenProjectConfigurator.java +++ b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenProjectConfigurator.java @@ -84,15 +84,14 @@ public void configureTracer( .append(escapeForCommandLine(String.valueOf(agentJar.toPath()))); String existingArgLine = MavenUtils.getArgLine(session, project, mojoExecution); - String updatedArgLine = - (existingArgLine != null ? existingArgLine + " " : "") - + - // -javaagent that injects the tracer - // has to be the last one, - // since if there are other agents - // we want to be able to instrument their code - // (namely Jacoco's) - addedArgLine; + String updatedArgLine = (existingArgLine != null ? existingArgLine + " " : "") + + + // -javaagent that injects the tracer + // has to be the last one, + // since if there are other agents + // we want to be able to instrument their code + // (namely Jacoco's) + addedArgLine; Xpp3Dom configuration = mojoExecution.getConfiguration(); mojoExecution.setConfiguration( @@ -147,12 +146,11 @@ void configureCompilerPlugin(MavenProject project) { // we have to add the plugin in there, // otherwise it's best to add it as a regular dependency if (configuration != null && configuration.getChild("annotationProcessorPaths") != null) { - configuration = - addAnnotationProcessorPath( - configuration, - DATADOG_GROUP_ID, - DATADOG_JAVAC_PLUGIN_ARTIFACT_ID, - compilerPluginVersion); + configuration = addAnnotationProcessorPath( + configuration, + DATADOG_GROUP_ID, + DATADOG_JAVAC_PLUGIN_ARTIFACT_ID, + compilerPluginVersion); } else { Dependency javacPluginDependency = new Dependency(); diff --git a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java index c2ed31af284..4d61e162b6e 100644 --- a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java +++ b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenUtils.java @@ -225,9 +225,8 @@ public static Throwable getException(MavenExecutionResult result) { return exceptions.iterator().next(); } else { MavenProject project = result.getProject(); - Throwable t = - new BuildFailureException( - "Build failed" + (project != null ? " for " + project.getName() : "")); + Throwable t = new BuildFailureException( + "Build failed" + (project != null ? " for " + project.getName() : "")); for (Throwable e : exceptions) { t.addSuppressed(e); } @@ -300,10 +299,7 @@ private static Xpp3Dom getChild(Xpp3Dom parent, String[] path, boolean createIfN } public static String getUniqueModuleName(MavenProject project, MojoExecution mojoExecution) { - return project.getName() - + " " - + mojoExecution.getArtifactId() - + " " + return project.getName() + " " + mojoExecution.getArtifactId() + " " + mojoExecution.getExecutionId(); } @@ -382,7 +378,8 @@ public static List getClasspath(MavenSession session, MojoExecution mojoEx findMethod(methodHandles, classPath.getClass(), "getClassPath"); if (getClassPathMethod == null) { LOGGER.debug( - "Could not find getClassPath method in {} class", classPath.getClass().getName()); + "Could not find getClassPath method in {} class", + classPath.getClass().getName()); return null; } @@ -446,7 +443,8 @@ private static String getEffectiveJvm(MojoExecution mojoExecution, Mojo mojo) { MethodHandle getEffectiveJvmMethod = findMethod(methodHandles, mojo.getClass(), "getEffectiveJvm"); if (getEffectiveJvmMethod == null) { - LOGGER.debug("Could not find getEffectiveJvm method in {} class", mojo.getClass().getName()); + LOGGER.debug( + "Could not find getEffectiveJvm method in {} class", mojo.getClass().getName()); return null; } try { @@ -543,16 +541,10 @@ static String getEffectiveJvmFallback(MavenSession session, MojoExecution mojoEx PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor(); ClassRealm pluginRealm = pluginDescriptor.getClassRealm(); MethodHandles methodHandles = new MethodHandles(pluginRealm); - MethodHandle getToolchains = - methodHandles.method( - ToolchainManager.class, - "getToolchains", - MavenSession.class, - String.class, - Map.class); - List toolchains = - methodHandles.invoke( - getToolchains, toolchainManager, session, "jdk", toolchainConfig); + MethodHandle getToolchains = methodHandles.method( + ToolchainManager.class, "getToolchains", MavenSession.class, String.class, Map.class); + List toolchains = methodHandles.invoke( + getToolchains, toolchainManager, session, "jdk", toolchainConfig); if (toolchains.isEmpty()) { LOGGER.debug("Could not find toolchains for {}", toolchainConfig); return null; diff --git a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/AbstractMavenTest.java b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/AbstractMavenTest.java index 7b06be2d330..37da6b6cd9f 100644 --- a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/AbstractMavenTest.java +++ b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/AbstractMavenTest.java @@ -16,7 +16,8 @@ import org.junit.jupiter.api.io.TempDir; public abstract class AbstractMavenTest { - @TempDir static Path WORKING_DIRECTORY; + @TempDir + static Path WORKING_DIRECTORY; protected AbstractMavenTest() { System.setProperty( @@ -41,13 +42,12 @@ protected void executeMaven( String... additionalArgs) throws Exception { MojoStartedSpy spy = new MojoStartedSpy(mojoStartedHandler); - MavenCli mavenCli = - new MavenCli() { - @Override - protected void customizeContainer(PlexusContainer container) { - container.addComponent(spy, EventSpy.class, null); - } - }; + MavenCli mavenCli = new MavenCli() { + @Override + protected void customizeContainer(PlexusContainer container) { + container.addComponent(spy, EventSpy.class, null); + } + }; File pomFile = new File(AbstractMavenTest.class.getResource(pomPath).toURI()); diff --git a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenProjectConfiguratorTest.java b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenProjectConfiguratorTest.java index 231ea0f2726..4b1d7491405 100644 --- a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenProjectConfiguratorTest.java +++ b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenProjectConfiguratorTest.java @@ -32,10 +32,9 @@ public static Stream surefireVersions() { return Stream.of( Arguments.of( "sampleProject/pom.xml", "test", new String[] {"-X", "-DargLine=-DmyArgLineProp=true"}), - Arguments.of( - "sampleProject/pom.xml", - "surefire:test", - new String[] {"-X", "-DargLine=-DmyArgLineProp=true"}), + Arguments.of("sampleProject/pom.xml", "surefire:test", new String[] { + "-X", "-DargLine=-DmyArgLineProp=true" + }), Arguments.of("sampleProjectArgLine/pom.xml", "test", new String[] {"-X"}), Arguments.of("sampleProjectArgLine/pom.xml", "surefire:test", new String[] {"-X"}), Arguments.of("sampleProjectSurefireArgLine/pom.xml", "test", new String[] {"-X"}), @@ -67,10 +66,9 @@ public void testTracerInjection(String pomPath, String goal, String[] additional String buildOutputLine; while ((buildOutputLine = buildOutputReader.readLine()) != null) { javaAgentInjected |= buildOutputLine.contains("TEST JAVA AGENT STARTED"); - argLinePreserved |= - buildOutputLine.contains("surefire") - && buildOutputLine.contains("Forking command line") - && buildOutputLine.contains("-DmyArgLineProp=true"); + argLinePreserved |= buildOutputLine.contains("surefire") + && buildOutputLine.contains("Forking command line") + && buildOutputLine.contains("-DmyArgLineProp=true"); } assertTrue(javaAgentInjected, "Tracer wasn't injected"); @@ -96,7 +94,8 @@ private boolean injectTracer(ExecutionEvent executionEvent) { when(config.isCiVisibilityAutoConfigurationEnabled()).thenReturn(true); when(config.getCiVisibilityDebugPort()).thenReturn(null); when(config.getCiVisibilityAgentJarFile()) - .thenReturn(new File(MavenUtilsTest.class.getResource("simple-agent.jar").toURI())); + .thenReturn( + new File(MavenUtilsTest.class.getResource("simple-agent.jar").toURI())); MavenProjectConfigurator.INSTANCE.configureTracer( session, project, mojoExecution, Collections.emptyMap(), config); return true; diff --git a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenUtilsTest.java b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenUtilsTest.java index 6d7fad46e8a..7be280c14ec 100644 --- a/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenUtilsTest.java +++ b/dd-java-agent/instrumentation/maven/maven-3.2.1/src/test/java/datadog/trace/instrumentation/maven3/MavenUtilsTest.java @@ -296,7 +296,8 @@ private boolean assertGetEffectiveJvmFallbackUsesToolchains(ExecutionEvent execu */ private static File createToolchainsFile() throws URISyntaxException, IOException, TemplateException { - File toolchainJdkHome = new File(MavenUtilsTest.class.getResource("my-jdk-home").toURI()); + File toolchainJdkHome = + new File(MavenUtilsTest.class.getResource("my-jdk-home").toURI()); Map replacements = Collections.singletonMap("my_jdk_home_path", toolchainJdkHome.getAbsolutePath()); @@ -485,10 +486,9 @@ private static String getLatestMavenSurefireVersion() { private static Properties loadLatestToolVersions() { Properties properties = new Properties(); - try (InputStream stream = - MavenUtilsTest.class - .getClassLoader() - .getResourceAsStream("latest-tool-versions.properties")) { + try (InputStream stream = MavenUtilsTest.class + .getClassLoader() + .getResourceAsStream("latest-tool-versions.properties")) { if (stream == null) { throw new IllegalStateException( "Could not find latest-tool-versions.properties on classpath"); diff --git a/dd-java-agent/instrumentation/maven/maven-surefire-3.0/src/main/java/datadog/trace/instrumentation/maven/surefire/junit4/JUnit4ClassOrderInstrumentation.java b/dd-java-agent/instrumentation/maven/maven-surefire-3.0/src/main/java/datadog/trace/instrumentation/maven/surefire/junit4/JUnit4ClassOrderInstrumentation.java index 61046265961..59ce5e1dc1d 100644 --- a/dd-java-agent/instrumentation/maven/maven-surefire-3.0/src/main/java/datadog/trace/instrumentation/maven/surefire/junit4/JUnit4ClassOrderInstrumentation.java +++ b/dd-java-agent/instrumentation/maven/maven-surefire-3.0/src/main/java/datadog/trace/instrumentation/maven/surefire/junit4/JUnit4ClassOrderInstrumentation.java @@ -79,9 +79,8 @@ public static void onSetTestsToRun( } } - testClasses.sort( - new JUnit4FailFastClassOrderer( - TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT4))); + testClasses.sort(new JUnit4FailFastClassOrderer( + TestEventsHandlerHolder.HANDLERS.get(TestFrameworkInstrumentation.JUNIT4))); testsToRun = new TestsToRun(new LinkedHashSet<>(testClasses)); } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/main/java/datadog/trace/instrumentation/micronaut/v2_0/WriteDefaultErrorResponseAdvice.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/main/java/datadog/trace/instrumentation/micronaut/v2_0/WriteDefaultErrorResponseAdvice.java index 874afb810e8..6076a6f7d55 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/main/java/datadog/trace/instrumentation/micronaut/v2_0/WriteDefaultErrorResponseAdvice.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/main/java/datadog/trace/instrumentation/micronaut/v2_0/WriteDefaultErrorResponseAdvice.java @@ -14,7 +14,8 @@ public class WriteDefaultErrorResponseAdvice { public static void beginRequest( @Advice.Argument(1) final NettyHttpRequest nettyHttpRequest, @Advice.Argument(2) final Throwable cause) { - AgentSpan span = nettyHttpRequest.getAttribute(SPAN_ATTRIBUTE, AgentSpan.class).orElse(null); + AgentSpan span = + nettyHttpRequest.getAttribute(SPAN_ATTRIBUTE, AgentSpan.class).orElse(null); if (null == span) { return; } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestController.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestController.java index 00d56c2e084..8ac61df253c 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestController.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestController.java @@ -26,70 +26,58 @@ class TestController { @Get(uri = "/success", produces = MediaType.TEXT_PLAIN) public Single success() { - return HttpServerTest.controller( - SUCCESS, - new Closure>(null) { - public Single doCall() { - return Single.just(SUCCESS.getBody()); - } - }); + return HttpServerTest.controller(SUCCESS, new Closure>(null) { + public Single doCall() { + return Single.just(SUCCESS.getBody()); + } + }); } @Get(uri = "/exception", produces = MediaType.TEXT_PLAIN) public Single exception() { - return HttpServerTest.controller( - EXCEPTION, - new Closure>(null) { - public Single doCall() throws Exception { - throw new Exception(EXCEPTION.getBody()); - } - }); + return HttpServerTest.controller(EXCEPTION, new Closure>(null) { + public Single doCall() throws Exception { + throw new Exception(EXCEPTION.getBody()); + } + }); } @Get(uri = "/error-status", produces = MediaType.TEXT_PLAIN) public HttpResponse error(final HttpRequest request) { - return HttpServerTest.controller( - ERROR, - new Closure>(null) { - public HttpResponse doCall() { - return HttpResponse.serverError(ERROR.getBody()); - } - }); + return HttpServerTest.controller(ERROR, new Closure>(null) { + public HttpResponse doCall() { + return HttpResponse.serverError(ERROR.getBody()); + } + }); } @Get(uri = "/forwarded", produces = MediaType.TEXT_PLAIN) public HttpResponse forwarded(final HttpRequest request) { - return HttpServerTest.controller( - FORWARDED, - new Closure>(null) { - public HttpResponse doCall() { - return HttpResponse.ok( - request.getHeaders().get("x-forwarded-for", String.class, "unknown")); - } - }); + return HttpServerTest.controller(FORWARDED, new Closure>(null) { + public HttpResponse doCall() { + return HttpResponse.ok( + request.getHeaders().get("x-forwarded-for", String.class, "unknown")); + } + }); } @Get(uri = "/redirect", produces = MediaType.TEXT_PLAIN) public MutableHttpResponse redirect(final HttpRequest request) { - return HttpServerTest.controller( - REDIRECT, - new Closure>(null) { - public MutableHttpResponse doCall() { - return HttpResponse.status(HttpStatus.valueOf(REDIRECT.getStatus())) - .header("location", REDIRECT.getBody()); - } - }); + return HttpServerTest.controller(REDIRECT, new Closure>(null) { + public MutableHttpResponse doCall() { + return HttpResponse.status(HttpStatus.valueOf(REDIRECT.getStatus())) + .header("location", REDIRECT.getBody()); + } + }); } @Get(uri = "/path/{id}/param", produces = MediaType.TEXT_PLAIN) public Single path_param(@NotBlank final Integer id) { - return HttpServerTest.controller( - PATH_PARAM, - new Closure>(null) { - public Single doCall() { - return Single.just(id); - } - }); + return HttpServerTest.controller(PATH_PARAM, new Closure>(null) { + public Single doCall() { + return Single.just(id); + } + }); } @Get(uri = "/query", produces = MediaType.TEXT_PLAIN) @@ -109,14 +97,12 @@ public HttpResponse query_encoded_both(final HttpRequest request) { private HttpResponse handle_query( final HttpServerTest.ServerEndpoint endpoint, final HttpRequest request) { - return HttpServerTest.controller( - endpoint, - new Closure>(null) { - public HttpResponse doCall() { - String query = - "some=" + request.getParameters().getFirst("some", String.class).orElse("bad"); - return HttpResponse.ok(endpoint.bodyForQuery(query)); - } - }); + return HttpServerTest.controller(endpoint, new Closure>(null) { + public HttpResponse doCall() { + String query = + "some=" + request.getParameters().getFirst("some", String.class).orElse("bad"); + return HttpResponse.ok(endpoint.bodyForQuery(query)); + } + }); } } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestFilter.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestFilter.java index d6fd3e7563c..48471b06bed 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestFilter.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-2.0/src/test/java/test/TestFilter.java @@ -15,11 +15,9 @@ public class TestFilter implements HttpServerFilter { public Publisher> doFilter( HttpRequest request, ServerFilterChain chain) { return Flowable.fromPublisher(chain.proceed(request)) - .doOnNext( - res -> - res.getHeaders() - .add( - HttpServerTest.getIG_RESPONSE_HEADER(), - HttpServerTest.getIG_RESPONSE_HEADER_VALUE())); + .doOnNext(res -> res.getHeaders() + .add( + HttpServerTest.getIG_RESPONSE_HEADER(), + HttpServerTest.getIG_RESPONSE_HEADER_VALUE())); } } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestController.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestController.java index 6bb3bf7e3e0..cb7c199abdd 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestController.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestController.java @@ -26,70 +26,58 @@ class TestController { @Get(uri = "/success", produces = MediaType.TEXT_PLAIN) public Mono success() { - return HttpServerTest.controller( - SUCCESS, - new Closure>(null) { - public Mono doCall() { - return Mono.just(SUCCESS.getBody()); - } - }); + return HttpServerTest.controller(SUCCESS, new Closure>(null) { + public Mono doCall() { + return Mono.just(SUCCESS.getBody()); + } + }); } @Get(uri = "/exception", produces = MediaType.TEXT_PLAIN) public Mono exception() { - return HttpServerTest.controller( - EXCEPTION, - new Closure>(null) { - public Mono doCall() throws Exception { - throw new Exception(EXCEPTION.getBody()); - } - }); + return HttpServerTest.controller(EXCEPTION, new Closure>(null) { + public Mono doCall() throws Exception { + throw new Exception(EXCEPTION.getBody()); + } + }); } @Get(uri = "/error-status", produces = MediaType.TEXT_PLAIN) public HttpResponse error(final HttpRequest request) { - return HttpServerTest.controller( - ERROR, - new Closure>(null) { - public HttpResponse doCall() { - return HttpResponse.serverError(ERROR.getBody()); - } - }); + return HttpServerTest.controller(ERROR, new Closure>(null) { + public HttpResponse doCall() { + return HttpResponse.serverError(ERROR.getBody()); + } + }); } @Get(uri = "/forwarded", produces = MediaType.TEXT_PLAIN) public HttpResponse forwarded(final HttpRequest request) { - return HttpServerTest.controller( - FORWARDED, - new Closure>(null) { - public HttpResponse doCall() { - return HttpResponse.ok( - request.getHeaders().get("x-forwarded-for", String.class, "unknown")); - } - }); + return HttpServerTest.controller(FORWARDED, new Closure>(null) { + public HttpResponse doCall() { + return HttpResponse.ok( + request.getHeaders().get("x-forwarded-for", String.class, "unknown")); + } + }); } @Get(uri = "/redirect", produces = MediaType.TEXT_PLAIN) public MutableHttpResponse redirect(final HttpRequest request) { - return HttpServerTest.controller( - REDIRECT, - new Closure>(null) { - public MutableHttpResponse doCall() { - return HttpResponse.status(HttpStatus.valueOf(REDIRECT.getStatus())) - .header("location", REDIRECT.getBody()); - } - }); + return HttpServerTest.controller(REDIRECT, new Closure>(null) { + public MutableHttpResponse doCall() { + return HttpResponse.status(HttpStatus.valueOf(REDIRECT.getStatus())) + .header("location", REDIRECT.getBody()); + } + }); } @Get(uri = "/path/{id}/param", produces = MediaType.TEXT_PLAIN) public Mono path_param(@NotBlank final Integer id) { - return HttpServerTest.controller( - PATH_PARAM, - new Closure>(null) { - public Mono doCall() { - return Mono.just(id); - } - }); + return HttpServerTest.controller(PATH_PARAM, new Closure>(null) { + public Mono doCall() { + return Mono.just(id); + } + }); } @Get(uri = "/query", produces = MediaType.TEXT_PLAIN) @@ -109,14 +97,12 @@ public HttpResponse query_encoded_both(final HttpRequest request) { private HttpResponse handle_query( final HttpServerTest.ServerEndpoint endpoint, final HttpRequest request) { - return HttpServerTest.controller( - endpoint, - new Closure>(null) { - public HttpResponse doCall() { - String query = - "some=" + request.getParameters().getFirst("some", String.class).orElse("bad"); - return HttpResponse.ok(endpoint.bodyForQuery(query)); - } - }); + return HttpServerTest.controller(endpoint, new Closure>(null) { + public HttpResponse doCall() { + String query = + "some=" + request.getParameters().getFirst("some", String.class).orElse("bad"); + return HttpResponse.ok(endpoint.bodyForQuery(query)); + } + }); } } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestFilter.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestFilter.java index 1fbe20a53cb..db8d012b8eb 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestFilter.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-3.0/src/test/java/test/TestFilter.java @@ -16,11 +16,9 @@ public Publisher> doFilter( HttpRequest request, ServerFilterChain chain) { return Flux.from(chain.proceed(request)) - .doOnNext( - res -> - res.getHeaders() - .add( - HttpServerTest.getIG_RESPONSE_HEADER(), - HttpServerTest.getIG_RESPONSE_HEADER_VALUE())); + .doOnNext(res -> res.getHeaders() + .add( + HttpServerTest.getIG_RESPONSE_HEADER(), + HttpServerTest.getIG_RESPONSE_HEADER_VALUE())); } } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java/datadog/trace/instrumentation/micronaut/v4_0/MicronautInstrumentation.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java/datadog/trace/instrumentation/micronaut/v4_0/MicronautInstrumentation.java index 63ab1f9a733..bcc4c9ab48b 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java/datadog/trace/instrumentation/micronaut/v4_0/MicronautInstrumentation.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java/datadog/trace/instrumentation/micronaut/v4_0/MicronautInstrumentation.java @@ -59,12 +59,10 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(named("encodeHttpResponse")) .and(takesArgument(1, named("io.micronaut.http.server.netty.NettyHttpRequest"))) - .and( - takesArgument( - 2, - namedOneOf( - "io.micronaut.http.MutableHttpResponse", - "io.micronaut.http.HttpResponse"))), + .and(takesArgument( + 2, + namedOneOf( + "io.micronaut.http.MutableHttpResponse", "io.micronaut.http.HttpResponse"))), packageName + ".EncodeHttpResponseAdvice"); transformer.applyAdvice( isMethod() diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice.java index fef3a8f016c..295503f8b59 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice.java @@ -21,7 +21,8 @@ public static AgentScope beginRequest( if (request == null || nettySpan == null) { return null; } - final AgentSpan span = startSpan("micronaut-controller", DECORATE.spanName()).setMeasured(true); + final AgentSpan span = + startSpan("micronaut-controller", DECORATE.spanName()).setMeasured(true); DECORATE.afterStart(span); request.setAttribute(SPAN_ATTRIBUTE, span); request.setAttribute(PARENT_SPAN_ATTRIBUTE, nettySpan); diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice2.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice2.java index 46a24b24336..a404d52ea44 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice2.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/main/java17/datadog/trace/instrumentation/micronaut/v4_0/ChannelAcceptAdvice2.java @@ -20,7 +20,8 @@ public static AgentScope beginRequest(@Advice.Argument(0) final NettyHttpRequest if (request == null || nettySpan == null) { return null; } - final AgentSpan span = startSpan("micronaut-controller", DECORATE.spanName()).setMeasured(true); + final AgentSpan span = + startSpan("micronaut-controller", DECORATE.spanName()).setMeasured(true); DECORATE.afterStart(span); request.setAttribute(SPAN_ATTRIBUTE, span); request.setAttribute(PARENT_SPAN_ATTRIBUTE, nettySpan); diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestController.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestController.java index 896979ab07b..ee3cf6f8b11 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestController.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestController.java @@ -25,70 +25,58 @@ class TestController { @Get(uri = "/success", produces = MediaType.TEXT_PLAIN) public Mono success() { - return HttpServerTest.controller( - SUCCESS, - new Closure>(null) { - public Mono doCall() { - return Mono.just(SUCCESS.getBody()); - } - }); + return HttpServerTest.controller(SUCCESS, new Closure>(null) { + public Mono doCall() { + return Mono.just(SUCCESS.getBody()); + } + }); } @Get(uri = "/exception", produces = MediaType.TEXT_PLAIN) public Mono exception() { - return HttpServerTest.controller( - EXCEPTION, - new Closure>(null) { - public Mono doCall() throws Exception { - throw new Exception(EXCEPTION.getBody()); - } - }); + return HttpServerTest.controller(EXCEPTION, new Closure>(null) { + public Mono doCall() throws Exception { + throw new Exception(EXCEPTION.getBody()); + } + }); } @Get(uri = "/error-status", produces = MediaType.TEXT_PLAIN) public HttpResponse error(final HttpRequest request) { - return HttpServerTest.controller( - ERROR, - new Closure>(null) { - public HttpResponse doCall() { - return HttpResponse.serverError(ERROR.getBody()); - } - }); + return HttpServerTest.controller(ERROR, new Closure>(null) { + public HttpResponse doCall() { + return HttpResponse.serverError(ERROR.getBody()); + } + }); } @Get(uri = "/forwarded", produces = MediaType.TEXT_PLAIN) public HttpResponse forwarded(final HttpRequest request) { - return HttpServerTest.controller( - FORWARDED, - new Closure>(null) { - public HttpResponse doCall() { - return HttpResponse.ok( - request.getHeaders().get("x-forwarded-for", String.class, "unknown")); - } - }); + return HttpServerTest.controller(FORWARDED, new Closure>(null) { + public HttpResponse doCall() { + return HttpResponse.ok( + request.getHeaders().get("x-forwarded-for", String.class, "unknown")); + } + }); } @Get(uri = "/redirect", produces = MediaType.TEXT_PLAIN) public MutableHttpResponse redirect(final HttpRequest request) { - return HttpServerTest.controller( - REDIRECT, - new Closure>(null) { - public MutableHttpResponse doCall() { - return HttpResponse.status(HttpStatus.valueOf(REDIRECT.getStatus())) - .header("location", REDIRECT.getBody()); - } - }); + return HttpServerTest.controller(REDIRECT, new Closure>(null) { + public MutableHttpResponse doCall() { + return HttpResponse.status(HttpStatus.valueOf(REDIRECT.getStatus())) + .header("location", REDIRECT.getBody()); + } + }); } @Get(uri = "/path/{id}/param", produces = MediaType.TEXT_PLAIN) public Mono path_param(final Integer id) { - return HttpServerTest.controller( - PATH_PARAM, - new Closure>(null) { - public Mono doCall() { - return Mono.just(id); - } - }); + return HttpServerTest.controller(PATH_PARAM, new Closure>(null) { + public Mono doCall() { + return Mono.just(id); + } + }); } @Get(uri = "/query", produces = MediaType.TEXT_PLAIN) @@ -108,14 +96,12 @@ public HttpResponse query_encoded_both(final HttpRequest request) { private HttpResponse handle_query( final HttpServerTest.ServerEndpoint endpoint, final HttpRequest request) { - return HttpServerTest.controller( - endpoint, - new Closure>(null) { - public HttpResponse doCall() { - String query = - "some=" + request.getParameters().getFirst("some", String.class).orElse("bad"); - return HttpResponse.ok(endpoint.bodyForQuery(query)); - } - }); + return HttpServerTest.controller(endpoint, new Closure>(null) { + public HttpResponse doCall() { + String query = + "some=" + request.getParameters().getFirst("some", String.class).orElse("bad"); + return HttpResponse.ok(endpoint.bodyForQuery(query)); + } + }); } } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestFilter.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestFilter.java index 1fbe20a53cb..db8d012b8eb 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestFilter.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-4.0/src/test/java/test/TestFilter.java @@ -16,11 +16,9 @@ public Publisher> doFilter( HttpRequest request, ServerFilterChain chain) { return Flux.from(chain.proceed(request)) - .doOnNext( - res -> - res.getHeaders() - .add( - HttpServerTest.getIG_RESPONSE_HEADER(), - HttpServerTest.getIG_RESPONSE_HEADER_VALUE())); + .doOnNext(res -> res.getHeaders() + .add( + HttpServerTest.getIG_RESPONSE_HEADER(), + HttpServerTest.getIG_RESPONSE_HEADER_VALUE())); } } diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/ChannelRead0Advice.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/ChannelRead0Advice.java index 9a2d04b3e85..da87dc496f5 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/ChannelRead0Advice.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/ChannelRead0Advice.java @@ -20,7 +20,8 @@ public static AgentScope beginRequest(@Advice.Argument(1) final HttpRequest r // Micronaut-netty uses Netty so there needs to be a Netty span return null; } - final AgentSpan span = startSpan("micronaut-controller", DECORATE.spanName()).setMeasured(true); + final AgentSpan span = + startSpan("micronaut-controller", DECORATE.spanName()).setMeasured(true); DECORATE.afterStart(span); request.setAttribute(SPAN_ATTRIBUTE, span); request.setAttribute(PARENT_SPAN_ATTRIBUTE, nettySpan); diff --git a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/MicronautCodeOriginInstrumentation.java b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/MicronautCodeOriginInstrumentation.java index 67094a62106..418a6a3c7e3 100644 --- a/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/MicronautCodeOriginInstrumentation.java +++ b/dd-java-agent/instrumentation/micronaut/micronaut-http-server-netty/micronaut-http-server-netty-common/src/main/java/datadog/trace/instrumentation/micronaut/MicronautCodeOriginInstrumentation.java @@ -23,14 +23,13 @@ public String muzzleDirective() { @Override protected Set getAnnotations() { - return new HashSet<>( - Arrays.asList( - IO_MICRONAUT_HTTP_ANNOTATION + "Get", - IO_MICRONAUT_HTTP_ANNOTATION + "Post", - IO_MICRONAUT_HTTP_ANNOTATION + "Put", - IO_MICRONAUT_HTTP_ANNOTATION + "Delete", - IO_MICRONAUT_HTTP_ANNOTATION + "Patch", - IO_MICRONAUT_HTTP_ANNOTATION + "Head", - IO_MICRONAUT_HTTP_ANNOTATION + "Options")); + return new HashSet<>(Arrays.asList( + IO_MICRONAUT_HTTP_ANNOTATION + "Get", + IO_MICRONAUT_HTTP_ANNOTATION + "Post", + IO_MICRONAUT_HTTP_ANNOTATION + "Put", + IO_MICRONAUT_HTTP_ANNOTATION + "Delete", + IO_MICRONAUT_HTTP_ANNOTATION + "Patch", + IO_MICRONAUT_HTTP_ANNOTATION + "Head", + IO_MICRONAUT_HTTP_ANNOTATION + "Options")); } } diff --git a/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommentInjector.java b/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommentInjector.java index 0e268d07a68..708df3ee9de 100644 --- a/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommentInjector.java +++ b/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommentInjector.java @@ -73,10 +73,9 @@ public static String buildComment(AgentSpan dbSpan, String hostname, String dbNa // Extract connection details String dbService = dbSpan.getServiceName(); - String traceParent = - Config.get().getDbmPropagationMode().equals(DBM_PROPAGATION_MODE_FULL) - ? W3CTraceParent.from(dbSpan) - : null; + String traceParent = Config.get().getDbmPropagationMode().equals(DBM_PROPAGATION_MODE_FULL) + ? W3CTraceParent.from(dbSpan) + : null; // Use shared comment builder directly return SharedDBCommenter.buildComment(dbService, "mongodb", hostname, dbName, traceParent); diff --git a/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.1/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber31.java b/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.1/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber31.java index dd17820da77..11da38179cd 100644 --- a/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.1/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber31.java +++ b/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.1/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber31.java @@ -16,13 +16,12 @@ public final class BsonScrubber31 implements BsonWriter, BsonScrubber { - private static final ThreadLocal CONTEXT = - new ThreadLocal() { - @Override - protected Context initialValue() { - return new Context(); - } - }; + private static final ThreadLocal CONTEXT = new ThreadLocal() { + @Override + protected Context initialValue() { + return new Context(); + } + }; private final Context context; private boolean obfuscate = true; diff --git a/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.4/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber34.java b/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.4/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber34.java index fc1b9700b1b..6e27162a650 100644 --- a/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.4/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber34.java +++ b/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-3/mongo-driver-3.4/src/main/java/datadog/trace/instrumentation/mongo/BsonScrubber34.java @@ -17,13 +17,12 @@ public class BsonScrubber34 implements BsonWriter, BsonScrubber { - private static final ThreadLocal CONTEXT = - new ThreadLocal() { - @Override - protected Context initialValue() { - return new Context(); - } - }; + private static final ThreadLocal CONTEXT = new ThreadLocal() { + @Override + protected Context initialValue() { + return new Context(); + } + }; private final Context context = CONTEXT.get(); private boolean obfuscate = true; diff --git a/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-4.0/src/main/java/datadog/trace/instrumentation/mongo/CallbackWrapper.java b/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-4.0/src/main/java/datadog/trace/instrumentation/mongo/CallbackWrapper.java index 118ce639074..297d003d251 100644 --- a/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-4.0/src/main/java/datadog/trace/instrumentation/mongo/CallbackWrapper.java +++ b/dd-java-agent/instrumentation/mongo/mongo-driver/mongo-driver-4.0/src/main/java/datadog/trace/instrumentation/mongo/CallbackWrapper.java @@ -10,9 +10,8 @@ public class CallbackWrapper implements SingleResultCallback { private static final AtomicReferenceFieldUpdater - CONTINUATION = - AtomicReferenceFieldUpdater.newUpdater( - CallbackWrapper.class, ContextContinuation.class, "continuation"); + CONTINUATION = AtomicReferenceFieldUpdater.newUpdater( + CallbackWrapper.class, ContextContinuation.class, "continuation"); private volatile ContextContinuation continuation = null; private final SingleResultCallback wrapped; diff --git a/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/EventTracerInstrumentation.java b/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/EventTracerInstrumentation.java index f149881d438..911b135c5a2 100644 --- a/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/EventTracerInstrumentation.java +++ b/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/EventTracerInstrumentation.java @@ -33,11 +33,10 @@ public static class SwapCoreTracerAdvice { public static void afterInit( @Advice.FieldValue(value = "selectedCoreEventTracer", readOnly = false) EventTracer eventTracer) { - eventTracer = - new DDEventTracer( - InstrumentationContext.get(EventContext.class, SpanState.class), - InstrumentationContext.get(InitialSpanInfo.class, Component.class), - eventTracer); + eventTracer = new DDEventTracer( + InstrumentationContext.get(EventContext.class, SpanState.class), + InstrumentationContext.get(InitialSpanInfo.class, Component.class), + eventTracer); } } } diff --git a/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/MuleDecorator.java b/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/MuleDecorator.java index 57985e88b2f..427c0e430f2 100644 --- a/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/MuleDecorator.java +++ b/dd-java-agent/instrumentation/mule-4.5/src/main/java/datadog/trace/instrumentation/mule4/MuleDecorator.java @@ -27,14 +27,13 @@ public class MuleDecorator extends BaseDecorator { new Functions.Prefix("mule.").andThen(new Functions.ToString<>()); private static final DDCache COMPONENT_DOC_CACHE = DDCaches.newFixedSizeCache(1014); - private static final Function COMPONENT_DOC_ADDER = - component -> { - final Object ret = component.getAnnotation(Component.Annotations.NAME_ANNOTATION_KEY); - if (ret != null) { - return ret.toString(); - } - return null; - }; + private static final Function COMPONENT_DOC_ADDER = component -> { + final Object ret = component.getAnnotation(Component.Annotations.NAME_ANNOTATION_KEY); + if (ret != null) { + return ret.toString(); + } + return null; + }; @Override protected String[] instrumentationNames() { diff --git a/dd-java-agent/instrumentation/mule-4.5/src/test/java/mule4/MuleTestContainer.java b/dd-java-agent/instrumentation/mule-4.5/src/test/java/mule4/MuleTestContainer.java index 5b249d35759..e529ab523ba 100644 --- a/dd-java-agent/instrumentation/mule-4.5/src/test/java/mule4/MuleTestContainer.java +++ b/dd-java-agent/instrumentation/mule-4.5/src/test/java/mule4/MuleTestContainer.java @@ -41,10 +41,9 @@ public MuleTestContainer(File muleBaseDirectory) throws IOException { } catch (Throwable t) { t.printStackTrace(); try { - this.container = - DefaultMuleContainer.class - .getDeclaredConstructor(String[].class) - .newInstance((Object) new String[0]); + this.container = DefaultMuleContainer.class + .getDeclaredConstructor(String[].class) + .newInstance((Object) new String[0]); } catch (Throwable t2) { throw new RuntimeException("Unable to instantiate MuleContainer", t2); } diff --git a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java index cc59edc6757..6c0618e3a1a 100644 --- a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java @@ -97,10 +97,9 @@ public static ContextScope activateScope(@Advice.Argument(0) final ChannelFuture final ContextStore contextStore = InstrumentationContext.get(Channel.class, ChannelTraceContext.class); - final ContextContinuation continuation = - contextStore - .getOrCreate(future.getChannel(), ChannelTraceContext.Factory.INSTANCE) - .getConnectionContinuation(); + final ContextContinuation continuation = contextStore + .getOrCreate(future.getChannel(), ChannelTraceContext.Factory.INSTANCE) + .getConnectionContinuation(); contextStore.get(future.getChannel()).setConnectionContinuation(null); if (continuation == null) { return null; diff --git a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/BlockingResponseHandler.java b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/BlockingResponseHandler.java index 3a8e75e2777..0179ac56f9c 100644 --- a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/BlockingResponseHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/BlockingResponseHandler.java @@ -135,16 +135,15 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Ex segment.effectivelyBlocked(); ChannelFuture future = Channels.future(ctx.getChannel()); - future.addListener( - fut -> { - if (!fut.isSuccess()) { - log.warn("Write of blocking response failed", fut.getCause()); - } - // close the connection because it can be in an invalid state at this point - // For instance, in a POST request we will still be receiving data from the - // client - fut.getChannel().close(); - }); + future.addListener(fut -> { + if (!fut.isSuccess()) { + log.warn("Write of blocking response failed", fut.getCause()); + } + // close the connection because it can be in an invalid state at this point + // For instance, in a POST request we will still be receiving data from the + // client + fut.getChannel().close(); + }); Channels.write(ctxForDownstream, future, response); } } diff --git a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/MaybeBlockResponseHandler.java b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/MaybeBlockResponseHandler.java index 8cd6d9d3748..2a2c83fa51f 100644 --- a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/MaybeBlockResponseHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/MaybeBlockResponseHandler.java @@ -67,9 +67,8 @@ public void writeRequested(ChannelHandlerContext ctx, MessageEvent msg) throws E return; } - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, origResponse, origResponse.getStatus().getCode(), ResponseExtractAdapter.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, origResponse, origResponse.getStatus().getCode(), ResponseExtractAdapter.GETTER); channelTraceContext.setAnalyzedResponse(true); Flow.Action action = flow.getAction(); if (!(action instanceof Flow.Action.RequestBlockingAction)) { @@ -105,16 +104,15 @@ public void writeRequested(ChannelHandlerContext ctx, MessageEvent msg) throws E } ChannelFuture future = Channels.future(ctx.getChannel()); - future.addListener( - fut -> { - if (!fut.isSuccess()) { - log.warn("Write of blocking response failed", fut.getCause()); - } - // close the connection because it can be in an invalid state at this point - // For instance, in a POST request we will still be receiving data from the - // client - fut.getChannel().close(); - }); + future.addListener(fut -> { + if (!fut.isSuccess()) { + log.warn("Write of blocking response failed", fut.getCause()); + } + // close the connection because it can be in an invalid state at this point + // For instance, in a POST request we will still be receiving data from the + // client + fut.getChannel().close(); + }); requestContext.getTraceSegment().effectivelyBlocked(); diff --git a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/NettyHttpServerDecorator.java b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/NettyHttpServerDecorator.java index ddda952fd1b..eba892f5202 100644 --- a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/NettyHttpServerDecorator.java +++ b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/NettyHttpServerDecorator.java @@ -71,17 +71,14 @@ protected String method(final HttpRequest httpRequest) { @Override protected URIDataAdapter url(final HttpRequest request) { - return URIDataAdapterBase.fromURI( - request.getUri(), - uri -> { - if ((uri.getHost() == null || uri.getHost().equals("")) - && request.headers().contains(HOST)) { - return URIDataAdapterBase.fromURI( - "http://" + request.headers().get(HOST) + request.getUri(), - URIDefaultDataAdapter::new); - } - return new URIDefaultDataAdapter(uri); - }); + return URIDataAdapterBase.fromURI(request.getUri(), uri -> { + if ((uri.getHost() == null || uri.getHost().equals("")) + && request.headers().contains(HOST)) { + return URIDataAdapterBase.fromURI( + "http://" + request.headers().get(HOST) + request.getUri(), URIDefaultDataAdapter::new); + } + return new URIDefaultDataAdapter(uri); + }); } @Override diff --git a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerRequestTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerRequestTracingHandler.java index 7f7fcfa5330..f1c8e53954a 100644 --- a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerRequestTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerRequestTracingHandler.java @@ -41,9 +41,8 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) throw if (receiverContext == null) { HandlerContext.Sender sessionState = traceContext.getSenderHandlerContext(); if (sessionState != null) { - receiverContext = - new HandlerContext.Receiver( - sessionState.getHandshakeSpan(), channel.getId().toString()); + receiverContext = new HandlerContext.Receiver( + sessionState.getHandshakeSpan(), channel.getId().toString()); traceContext.setReceiverHandlerContext(receiverContext); } } @@ -52,9 +51,8 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) throw // WebSocket Read Text Start TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, textFrame.getText(), textFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, textFrame.getText(), textFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.sendUpstream(event); // WebSocket Read Text Start @@ -70,11 +68,10 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) throw if (frame instanceof BinaryWebSocketFrame) { // WebSocket Read Binary Start BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, - binaryFrame.getBinaryData().array(), - binaryFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, + binaryFrame.getBinaryData().array(), + binaryFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.sendUpstream(event); } finally { @@ -91,13 +88,12 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent event) throw if (frame instanceof ContinuationWebSocketFrame) { ContinuationWebSocketFrame continuationWebSocketFrame = (ContinuationWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, - MESSAGE_TYPE_TEXT.equals(receiverContext.getMessageType()) - ? continuationWebSocketFrame.getText() - : continuationWebSocketFrame.getBinaryData().array(), - continuationWebSocketFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, + MESSAGE_TYPE_TEXT.equals(receiverContext.getMessageType()) + ? continuationWebSocketFrame.getText() + : continuationWebSocketFrame.getBinaryData().array(), + continuationWebSocketFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.sendUpstream(event); } finally { diff --git a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerResponseTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerResponseTracingHandler.java index 3b016b5d9b0..5e692dc269e 100644 --- a/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerResponseTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/websocket/WebSocketServerResponseTracingHandler.java @@ -43,9 +43,8 @@ public void writeRequested(ChannelHandlerContext ctx, MessageEvent event) throws if (frame instanceof TextWebSocketFrame) { // WebSocket Write Text Start TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, MESSAGE_TYPE_TEXT, textFrame.getText().length()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, MESSAGE_TYPE_TEXT, textFrame.getText().length()); try (final ContextScope scope = activateSpan(span)) { ctx.sendDownstream(event); } finally { @@ -60,11 +59,8 @@ public void writeRequested(ChannelHandlerContext ctx, MessageEvent event) throws if (frame instanceof BinaryWebSocketFrame) { // WebSocket Write Binary Start BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, - MESSAGE_TYPE_BINARY, - binaryFrame.getBinaryData().readableBytes()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, MESSAGE_TYPE_BINARY, binaryFrame.getBinaryData().readableBytes()); try (final ContextScope scope = activateSpan(span)) { ctx.sendDownstream(event); } finally { @@ -79,13 +75,12 @@ public void writeRequested(ChannelHandlerContext ctx, MessageEvent event) throws if (frame instanceof ContinuationWebSocketFrame) { ContinuationWebSocketFrame continuationWebSocketFrame = (ContinuationWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, - handlerContext.getMessageType(), - MESSAGE_TYPE_TEXT.equals(handlerContext.getMessageType()) - ? continuationWebSocketFrame.getText().length() - : continuationWebSocketFrame.getBinaryData().readableBytes()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, + handlerContext.getMessageType(), + MESSAGE_TYPE_TEXT.equals(handlerContext.getMessageType()) + ? continuationWebSocketFrame.getText().length() + : continuationWebSocketFrame.getBinaryData().readableBytes()); try (final ContextScope scope = activateSpan(span)) { ctx.sendDownstream(event); } finally { diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/BlockingResponseHandler.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/BlockingResponseHandler.java index b31435dd801..9a394ae7df4 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/BlockingResponseHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/BlockingResponseHandler.java @@ -120,26 +120,20 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { // We do not want to start from the end of the // pipeline because there is an increased risk of hitting duplex handlers that // expect to have seen a request before processing the response - ctxForDownstream = - ctxForDownstream - .pipeline() - .addAfter( - ctxForDownstream.name(), - "ignore_all_writes_handler", - IgnoreAllWritesHandler.INSTANCE) - .context("ignore_all_writes_handler"); + ctxForDownstream = ctxForDownstream + .pipeline() + .addAfter( + ctxForDownstream.name(), "ignore_all_writes_handler", IgnoreAllWritesHandler.INSTANCE) + .context("ignore_all_writes_handler"); segment.effectivelyBlocked(); - ctxForDownstream - .writeAndFlush(response) - .addListener( - fut -> { - if (!fut.isSuccess()) { - log.warn("Write of blocking response failed", fut.cause()); - } - ctx.channel().close(); - }); + ctxForDownstream.writeAndFlush(response).addListener(fut -> { + if (!fut.isSuccess()) { + log.warn("Write of blocking response failed", fut.cause()); + } + ctx.channel().close(); + }); } @ChannelHandler.Sharable diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java index 1b524e7051c..18bf5e7e451 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java @@ -40,7 +40,8 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { final HttpRequest request = (HttpRequest) msg; final HttpHeaders headers = request.headers(); - final Context storedParentContext = channel.attr(PARENT_CONTEXT_ATTRIBUTE_KEY).getAndRemove(); + final Context storedParentContext = + channel.attr(PARENT_CONTEXT_ATTRIBUTE_KEY).getAndRemove(); final Context parentContext = storedParentContext != null ? storedParentContext : DECORATE.extract(headers); final Context context = DECORATE.startSpan(headers, parentContext); diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java index 22d970a8da7..4cd50a221b8 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java @@ -47,10 +47,9 @@ public void write(final ChannelHandlerContext ctx, final Object msg, final Chann response.getStatus() == HttpResponseStatus.SWITCHING_PROTOCOLS && "websocket".equals(response.headers().get(UPGRADE_HEADER)); if (isWebsocketUpgrade) { - String channelId = - ctx.channel() - .attr(CHANNEL_ID) - .setIfAbsent(RandomUtils.randomUUID().toString().substring(0, 8)); + String channelId = ctx.channel() + .attr(CHANNEL_ID) + .setIfAbsent(RandomUtils.randomUUID().toString().substring(0, 8)); ctx.channel() .attr(WEBSOCKET_SENDER_HANDLER_CONTEXT) .set(new HandlerContext.Sender(span, channelId)); diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/MaybeBlockResponseHandler.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/MaybeBlockResponseHandler.java index 6f6c1891e88..225e14f1358 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/MaybeBlockResponseHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/MaybeBlockResponseHandler.java @@ -88,9 +88,8 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) thr return; } - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, origResponse, origResponse.getStatus().code(), ResponseExtractAdapter.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, origResponse, origResponse.getStatus().code(), ResponseExtractAdapter.GETTER); markAnalyzedResponse(channel); Flow.Action action = flow.getAction(); if (!(action instanceof Flow.Action.RequestBlockingAction)) { @@ -127,15 +126,13 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) thr requestContext.getTraceSegment().effectivelyBlocked(); log.debug("About to write and flush blocking response {}", response); - ctx.writeAndFlush(response, prm) - .addListener( - fut -> { - if (!fut.isSuccess()) { - log.warn("Write of blocking response failed", fut.cause()); - } else { - log.debug("Write of blocking response succeeded"); - } - channel.close(); - }); + ctx.writeAndFlush(response, prm).addListener(fut -> { + if (!fut.isSuccess()) { + log.warn("Write of blocking response failed", fut.cause()); + } else { + log.debug("Write of blocking response succeeded"); + } + channel.close(); + }); } } diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/NettyHttpServerDecorator.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/NettyHttpServerDecorator.java index f0844e00184..7f1e3e81c14 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/NettyHttpServerDecorator.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/NettyHttpServerDecorator.java @@ -67,17 +67,14 @@ protected String method(final HttpRequest httpRequest) { @Override protected URIDataAdapter url(final HttpRequest request) { - return URIDataAdapterBase.fromURI( - request.getUri(), - uri -> { - if ((uri.getHost() == null || uri.getHost().equals("")) - && request.headers().contains(HOST)) { - return URIDataAdapterBase.fromURI( - "http://" + request.headers().get(HOST) + request.getUri(), - URIDefaultDataAdapter::new); - } - return new URIDefaultDataAdapter(uri); - }); + return URIDataAdapterBase.fromURI(request.getUri(), uri -> { + if ((uri.getHost() == null || uri.getHost().equals("")) + && request.headers().contains(HOST)) { + return URIDataAdapterBase.fromURI( + "http://" + request.headers().get(HOST) + request.getUri(), URIDefaultDataAdapter::new); + } + return new URIDefaultDataAdapter(uri); + }); } @Override diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerRequestTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerRequestTracingHandler.java index 998d32def5c..f430281e1f6 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerRequestTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerRequestTracingHandler.java @@ -34,7 +34,8 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { channel.attr(WEBSOCKET_RECEIVER_HANDLER_CONTEXT).get(); if (receiverContext == null) { - HandlerContext.Sender sessionState = channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); + HandlerContext.Sender sessionState = + channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); if (sessionState != null) { String channelId = ctx.channel().attr(CHANNEL_ID).get(); receiverContext = new HandlerContext.Receiver(sessionState.getHandshakeSpan(), channelId); @@ -46,9 +47,8 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { // WebSocket Read Text Start TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, textFrame.text(), textFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, textFrame.text(), textFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.fireChannelRead(textFrame); // WebSocket Read Text Start @@ -64,11 +64,8 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { if (frame instanceof BinaryWebSocketFrame) { // WebSocket Read Binary Start BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, - binaryFrame.content().nioBuffer(), - binaryFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, binaryFrame.content().nioBuffer(), binaryFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.fireChannelRead(binaryFrame); } finally { @@ -85,13 +82,12 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { if (frame instanceof ContinuationWebSocketFrame) { ContinuationWebSocketFrame continuationWebSocketFrame = (ContinuationWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, - MESSAGE_TYPE_TEXT.equals(receiverContext.getMessageType()) - ? continuationWebSocketFrame.text() - : continuationWebSocketFrame.content().nioBuffer(), - continuationWebSocketFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, + MESSAGE_TYPE_TEXT.equals(receiverContext.getMessageType()) + ? continuationWebSocketFrame.text() + : continuationWebSocketFrame.content().nioBuffer(), + continuationWebSocketFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.fireChannelRead(continuationWebSocketFrame); } finally { diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerResponseTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerResponseTracingHandler.java index 0e685ce18b9..26fc3602495 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerResponseTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/websocket/WebSocketServerResponseTracingHandler.java @@ -31,15 +31,15 @@ public void write(ChannelHandlerContext ctx, Object frame, ChannelPromise promis if (frame instanceof WebSocketFrame) { Channel channel = ctx.channel(); - HandlerContext.Sender handlerContext = channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); + HandlerContext.Sender handlerContext = + channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); if (handlerContext != null) { if (frame instanceof TextWebSocketFrame) { // WebSocket Write Text Start TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, MESSAGE_TYPE_TEXT, textFrame.text().length()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, MESSAGE_TYPE_TEXT, textFrame.text().length()); try (final ContextScope scope = activateSpan(span)) { ctx.write(frame, promise); } finally { @@ -54,9 +54,8 @@ public void write(ChannelHandlerContext ctx, Object frame, ChannelPromise promis if (frame instanceof BinaryWebSocketFrame) { // WebSocket Write Binary Start BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, MESSAGE_TYPE_BINARY, binaryFrame.content().readableBytes()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, MESSAGE_TYPE_BINARY, binaryFrame.content().readableBytes()); try (final ContextScope scope = activateSpan(span)) { ctx.write(frame, promise); } finally { @@ -71,13 +70,12 @@ public void write(ChannelHandlerContext ctx, Object frame, ChannelPromise promis if (frame instanceof ContinuationWebSocketFrame) { ContinuationWebSocketFrame continuationWebSocketFrame = (ContinuationWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, - handlerContext.getMessageType(), - MESSAGE_TYPE_TEXT.equals(handlerContext.getMessageType()) - ? continuationWebSocketFrame.text().length() - : continuationWebSocketFrame.content().readableBytes()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, + handlerContext.getMessageType(), + MESSAGE_TYPE_TEXT.equals(handlerContext.getMessageType()) + ? continuationWebSocketFrame.text().length() + : continuationWebSocketFrame.content().readableBytes()); try (final ContextScope scope = activateSpan(span)) { ctx.write(frame, promise); } finally { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/HttpPostRequestDecoderInstrumentation.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/HttpPostRequestDecoderInstrumentation.java index 60b98472c82..c02e5666e65 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/HttpPostRequestDecoderInstrumentation.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/HttpPostRequestDecoderInstrumentation.java @@ -115,18 +115,16 @@ static void after( List filenames = filenamesCb != null ? new ArrayList<>() : null; List filesContent = contentCb != null ? new ArrayList<>() : null; - RuntimeException exc = - NettyMultipartHelper.collectBodyData( - thiz.getBodyHttpDatas(), attributes, filenames, filesContent); + RuntimeException exc = NettyMultipartHelper.collectBodyData( + thiz.getBodyHttpDatas(), attributes, filenames, filesContent); if (callback != null) { // effectivelyBlocked() is intentionally absent: tryCommitBlockingResponse finishes // the span synchronously in this Netty path; calling it on a finished span throws. - Throwable block = - NettyMultipartHelper.tryBlock( - requestContext, - callback.apply(requestContext, attributes), - "Blocked request (multipart/urlencoded post data)"); + Throwable block = NettyMultipartHelper.tryBlock( + requestContext, + callback.apply(requestContext, attributes), + "Blocked request (multipart/urlencoded post data)"); if (block != null) { thr = block; } @@ -135,18 +133,16 @@ static void after( if (filenames != null && !filenames.isEmpty()) { Flow filenamesFlow = filenamesCb.apply(requestContext, filenames); if (thr == null) { - thr = - NettyMultipartHelper.tryBlock( - requestContext, filenamesFlow, "Blocked request (multipart file upload)"); + thr = NettyMultipartHelper.tryBlock( + requestContext, filenamesFlow, "Blocked request (multipart file upload)"); } } if (thr == null && filesContent != null && !filesContent.isEmpty()) { - thr = - NettyMultipartHelper.tryBlock( - requestContext, - contentCb.apply(requestContext, filesContent), - "Blocked request (multipart file upload content)"); + thr = NettyMultipartHelper.tryBlock( + requestContext, + contentCb.apply(requestContext, filesContent), + "Blocked request (multipart file upload content)"); } if (exc != null) { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyHttp2Helper.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyHttp2Helper.java index ba2761c8d7a..26daeeff606 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyHttp2Helper.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyHttp2Helper.java @@ -19,17 +19,15 @@ public class NettyHttp2Helper { Class frameCodecClass; MethodHandle isServerField; try { - codecClass = - Class.forName( - "io.netty.handler.codec.http2.Http2StreamFrameToHttpObjectCodec", - false, - NettyHttp2Helper.class.getClassLoader()); + codecClass = Class.forName( + "io.netty.handler.codec.http2.Http2StreamFrameToHttpObjectCodec", + false, + NettyHttp2Helper.class.getClassLoader()); Field f = codecClass.getDeclaredField("isServer"); f.setAccessible(true); - isServerField = - MethodHandles.lookup() - .unreflectGetter(f) - .asType(MethodType.methodType(boolean.class, ChannelHandler.class)); + isServerField = MethodHandles.lookup() + .unreflectGetter(f) + .asType(MethodType.methodType(boolean.class, ChannelHandler.class)); } catch (final ClassNotFoundException cnfe) { // can be expected codecClass = null; @@ -41,11 +39,10 @@ public class NettyHttp2Helper { LOGGER.debug("Unable to setup netty http2 instrumentation", t); } try { - frameCodecClass = - Class.forName( - "io.netty.handler.codec.http2.Http2FrameCodec", - false, - NettyHttp2Helper.class.getClassLoader()); + frameCodecClass = Class.forName( + "io.netty.handler.codec.http2.Http2FrameCodec", + false, + NettyHttp2Helper.class.getClassLoader()); } catch (final ClassNotFoundException cnfe) { // can be expected frameCodecClass = null; diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/client/HttpClientResponseTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/client/HttpClientResponseTracingHandler.java index b80f967a3fb..2faf525e42e 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/client/HttpClientResponseTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/client/HttpClientResponseTracingHandler.java @@ -36,11 +36,9 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { } if (span != null) { - final boolean finishSpan = - msg instanceof HttpResponse - && (!HttpResponseStatus.SWITCHING_PROTOCOLS.equals(((HttpResponse) msg).status()) - || "websocket" - .equals(((HttpResponse) msg).headers().get(HttpHeaderNames.UPGRADE))); + final boolean finishSpan = msg instanceof HttpResponse + && (!HttpResponseStatus.SWITCHING_PROTOCOLS.equals(((HttpResponse) msg).status()) + || "websocket".equals(((HttpResponse) msg).headers().get(HttpHeaderNames.UPGRADE))); if (finishSpan) { try (final ContextScope scope = activateSpan(span)) { DECORATE.onResponse(span, (HttpResponse) msg); diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandler.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandler.java index bb4c926db79..b517ee57e2a 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandler.java @@ -82,7 +82,8 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { } HttpRequest request = (HttpRequest) msg; - if (!commitBlockingResponse(ctx, request.protocolVersion(), request.headers().get("accept"))) { + if (!commitBlockingResponse( + ctx, request.protocolVersion(), request.headers().get("accept"))) { // Do not let a failed block intercept later requests on this keep-alive connection. if (ctx.pipeline().get(BEFORE_BLOCKING_HANDLER_NAME) != null) { ctx.pipeline().remove(BEFORE_BLOCKING_HANDLER_NAME); @@ -111,15 +112,8 @@ boolean commitBlockingResponse( this.hasBlockedAlready = true; ServerRequestContext.markRequestBlocked(ctx.channel()); - PendingBlockResponse pendingBlockResponse = - new PendingBlockResponse( - segment, - statusCode, - bct, - extraHeaders, - securityResponseId, - protocolVersion, - acceptHeader); + PendingBlockResponse pendingBlockResponse = new PendingBlockResponse( + segment, statusCode, bct, extraHeaders, securityResponseId, protocolVersion, acceptHeader); if (serverContext != null && ServerRequestContext.nextResponse(ctx.channel()) != serverContext) { @@ -171,15 +165,12 @@ private static void writeBlockResponse( ChannelHandlerContext writeContext = ctxForDownstream.pipeline().context(IGNORE_ALL_WRITES_HANDLER); - writeContext - .writeAndFlush(pendingBlockResponse.toResponse()) - .addListener( - fut -> { - if (!fut.isSuccess()) { - log.warn("Write of blocking response failed", fut.cause()); - } - writeContext.channel().close(); - }); + writeContext.writeAndFlush(pendingBlockResponse.toResponse()).addListener(fut -> { + if (!fut.isSuccess()) { + log.warn("Write of blocking response failed", fut.cause()); + } + writeContext.channel().close(); + }); } private static class PendingBlockResponse { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java index 2d61271ddc0..554e7790eea 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java @@ -50,7 +50,8 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { } final HttpHeaders headers = request.headers(); - final Context storedParentContext = channel.attr(PARENT_CONTEXT_ATTRIBUTE_KEY).getAndRemove(); + final Context storedParentContext = + channel.attr(PARENT_CONTEXT_ATTRIBUTE_KEY).getAndRemove(); final Context parentContext = storedParentContext != null ? storedParentContext : DECORATE.extract(headers); final Context context = DECORATE.startSpan(headers, parentContext); diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandler.java index 10aa1368008..ec3cf80d1e9 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandler.java @@ -39,13 +39,12 @@ public void write(final ChannelHandlerContext ctx, final Object msg, final Chann return; } - final Context storedContext = - serverContext == null - // HTTP/2 multiplex stream channels only inherit the mirrored context attribute from - // Http2MultiplexHandlerStreamChannelInstrumentation.PropagateContextAdvice, without a - // per-stream request queue. - ? ctx.channel().attr(CONTEXT_ATTRIBUTE_KEY).get() - : serverContext.tracingContext(); + final Context storedContext = serverContext == null + // HTTP/2 multiplex stream channels only inherit the mirrored context attribute from + // Http2MultiplexHandlerStreamChannelInstrumentation.PropagateContextAdvice, without a + // per-stream request queue. + ? ctx.channel().attr(CONTEXT_ATTRIBUTE_KEY).get() + : serverContext.tracingContext(); final AgentSpan span = AgentSpan.fromContext(storedContext); if (span == null) { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandler.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandler.java index 11782d59e02..f9cf4f7f2d6 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandler.java @@ -48,10 +48,9 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) thr } ServerRequestContext serverContext = ServerRequestContext.nextResponse(channel); - Context storedContext = - serverContext == null - ? channel.attr(CONTEXT_ATTRIBUTE_KEY).get() - : serverContext.tracingContext(); + Context storedContext = serverContext == null + ? channel.attr(CONTEXT_ATTRIBUTE_KEY).get() + : serverContext.tracingContext(); AgentSpan span = AgentSpan.fromContext(storedContext); RequestContext requestContext; if (span == null || (requestContext = span.getRequestContext()) == null) { @@ -81,9 +80,8 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) thr return; } - Flow flow = - DECORATE.callIGCallbackResponseAndHeaders( - span, origResponse, statusCode, ResponseExtractAdapter.GETTER); + Flow flow = DECORATE.callIGCallbackResponseAndHeaders( + span, origResponse, statusCode, ResponseExtractAdapter.GETTER); if (serverContext != null) { serverContext.markResponseAnalyzed(); } @@ -110,9 +108,8 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) thr BlockingContentType bct = rba.getBlockingContentType(); if (bct != BlockingContentType.NONE) { - BlockingActionHelper.TemplateType type = - BlockingActionHelper.determineTemplateType( - bct, serverContext == null ? null : serverContext.acceptHeader()); + BlockingActionHelper.TemplateType type = BlockingActionHelper.determineTemplateType( + bct, serverContext == null ? null : serverContext.acceptHeader()); headers.set("Content-type", BlockingActionHelper.getContentType(type)); byte[] template = BlockingActionHelper.getTemplate(type, rba.getSecurityResponseId()); setContentLength(response, template.length); @@ -121,15 +118,13 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) thr requestContext.getTraceSegment().effectivelyBlocked(); log.debug("About to write and flush blocking response {}", response); - ctx.writeAndFlush(response, prm) - .addListener( - fut -> { - if (!fut.isSuccess()) { - log.warn("Write of blocking response failed", fut.cause()); - } else { - log.debug("Write of blocking response succeeded"); - } - channel.close(); - }); + ctx.writeAndFlush(response, prm).addListener(fut -> { + if (!fut.isSuccess()) { + log.warn("Write of blocking response failed", fut.cause()); + } else { + log.debug("Write of blocking response succeeded"); + } + channel.close(); + }); } } diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerDecorator.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerDecorator.java index 5794c75f9bf..51db2e86ca6 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerDecorator.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerDecorator.java @@ -77,17 +77,15 @@ protected String method(final HttpRequest httpRequest) { @Override protected URIDataAdapter url(final HttpRequest request) { - return URIDataAdapterBase.fromURI( - request.getUri(), - uri -> { - if ((uri.getHost() == null || uri.getHost().equals("")) - && request.headers().contains(HttpHeaders.Names.HOST)) { - return URIDataAdapterBase.fromURI( - "http://" + request.headers().get(HttpHeaders.Names.HOST) + request.getUri(), - URIDefaultDataAdapter::new); - } - return new URIDefaultDataAdapter(uri); - }); + return URIDataAdapterBase.fromURI(request.getUri(), uri -> { + if ((uri.getHost() == null || uri.getHost().equals("")) + && request.headers().contains(HttpHeaders.Names.HOST)) { + return URIDataAdapterBase.fromURI( + "http://" + request.headers().get(HttpHeaders.Names.HOST) + request.getUri(), + URIDefaultDataAdapter::new); + } + return new URIDefaultDataAdapter(uri); + }); } @Override @@ -190,10 +188,8 @@ public boolean tryCommitBlockingResponse( pipeline .channel() .eventLoop() - .execute( - () -> - commitBlockingResponse( - segment, statusCode, templateType, extraHeaders, securityResponseId)); + .execute(() -> commitBlockingResponse( + segment, statusCode, templateType, extraHeaders, securityResponseId)); return true; } catch (RuntimeException rte) { log.warn("Failed scheduling blocking handler", rte); @@ -222,9 +218,8 @@ private boolean commitBlockingResponse( } } - BlockingResponseHandler blockingHandler = - new BlockingResponseHandler( - segment, statusCode, templateType, extraHeaders, securityResponseId, serverContext); + BlockingResponseHandler blockingHandler = new BlockingResponseHandler( + segment, statusCode, templateType, extraHeaders, securityResponseId, serverContext); ChannelInboundHandlerAdapter beforeBlockingHandler = new ChannelInboundHandlerAdapter(); try { pipeline diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerInboundTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerInboundTracingHandler.java index d64cf3f39b3..e649daaf3e3 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerInboundTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerInboundTracingHandler.java @@ -31,11 +31,11 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { HandlerContext.Receiver receiverContext = channel.attr(WEBSOCKET_RECEIVER_HANDLER_CONTEXT).get(); if (receiverContext == null) { - HandlerContext.Sender sessionState = channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); + HandlerContext.Sender sessionState = + channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); if (sessionState != null) { - receiverContext = - new HandlerContext.Receiver( - sessionState.getHandshakeSpan(), channel.id().asShortText()); + receiverContext = new HandlerContext.Receiver( + sessionState.getHandshakeSpan(), channel.id().asShortText()); channel.attr(WEBSOCKET_RECEIVER_HANDLER_CONTEXT).set(receiverContext); } } @@ -44,9 +44,8 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { // WebSocket Read Text Start TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, textFrame.text(), textFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, textFrame.text(), textFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.fireChannelRead(textFrame); // WebSocket Read Text Start @@ -62,11 +61,8 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { if (frame instanceof BinaryWebSocketFrame) { // WebSocket Read Binary Start BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, - binaryFrame.content().nioBuffer(), - binaryFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, binaryFrame.content().nioBuffer(), binaryFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.fireChannelRead(binaryFrame); } finally { @@ -83,13 +79,12 @@ public void channelRead(ChannelHandlerContext ctx, Object frame) { if (frame instanceof ContinuationWebSocketFrame) { ContinuationWebSocketFrame continuationWebSocketFrame = (ContinuationWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startInboundFrameSpan( - receiverContext, - MESSAGE_TYPE_TEXT.equals(receiverContext.getMessageType()) - ? continuationWebSocketFrame.text() - : continuationWebSocketFrame.content().nioBuffer(), - continuationWebSocketFrame.isFinalFragment()); + final AgentSpan span = DECORATE.startInboundFrameSpan( + receiverContext, + MESSAGE_TYPE_TEXT.equals(receiverContext.getMessageType()) + ? continuationWebSocketFrame.text() + : continuationWebSocketFrame.content().nioBuffer(), + continuationWebSocketFrame.isFinalFragment()); try (final ContextScope scope = activateSpan(span)) { ctx.fireChannelRead(continuationWebSocketFrame); } finally { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerOutboundTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerOutboundTracingHandler.java index c15fe416aeb..3314abd141b 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerOutboundTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/websocket/WebSocketServerOutboundTracingHandler.java @@ -31,15 +31,15 @@ public void write(ChannelHandlerContext ctx, Object frame, ChannelPromise promis if (frame instanceof WebSocketFrame) { Channel channel = ctx.channel(); - HandlerContext.Sender handlerContext = channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); + HandlerContext.Sender handlerContext = + channel.attr(WEBSOCKET_SENDER_HANDLER_CONTEXT).get(); if (handlerContext != null) { if (frame instanceof TextWebSocketFrame) { // WebSocket Write Text Start TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, MESSAGE_TYPE_TEXT, textFrame.text().length()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, MESSAGE_TYPE_TEXT, textFrame.text().length()); try (final ContextScope scope = activateSpan(span)) { ctx.write(frame, promise); } finally { @@ -54,9 +54,8 @@ public void write(ChannelHandlerContext ctx, Object frame, ChannelPromise promis if (frame instanceof BinaryWebSocketFrame) { // WebSocket Write Binary Start BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, MESSAGE_TYPE_BINARY, binaryFrame.content().readableBytes()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, MESSAGE_TYPE_BINARY, binaryFrame.content().readableBytes()); try (final ContextScope scope = activateSpan(span)) { ctx.write(frame, promise); } finally { @@ -71,13 +70,12 @@ public void write(ChannelHandlerContext ctx, Object frame, ChannelPromise promis if (frame instanceof ContinuationWebSocketFrame) { ContinuationWebSocketFrame continuationWebSocketFrame = (ContinuationWebSocketFrame) frame; - final AgentSpan span = - DECORATE.startOutboundFrameSpan( - handlerContext, - handlerContext.getMessageType(), - MESSAGE_TYPE_TEXT.equals(handlerContext.getMessageType()) - ? continuationWebSocketFrame.text().length() - : continuationWebSocketFrame.content().readableBytes()); + final AgentSpan span = DECORATE.startOutboundFrameSpan( + handlerContext, + handlerContext.getMessageType(), + MESSAGE_TYPE_TEXT.equals(handlerContext.getMessageType()) + ? continuationWebSocketFrame.text().length() + : continuationWebSocketFrame.content().readableBytes()); try (final ContextScope scope = activateSpan(span)) { ctx.write(frame, promise); } finally { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandlerTest.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandlerTest.java index 8600402e5b9..b24b89c9abb 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandlerTest.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/BlockingResponseHandlerTest.java @@ -33,9 +33,8 @@ class BlockingResponseHandlerTest { void removesResponseFunctionHandlersWhenResponseTracingIsUnavailable() { EmbeddedChannel channel = new EmbeddedChannel(); ServerRequestContext serverContext = ServerRequestContext.add(channel, Context.root(), null); - BlockingResponseHandler blockingHandler = - new BlockingResponseHandler( - null, 403, BlockingContentType.NONE, emptyMap(), null, serverContext); + BlockingResponseHandler blockingHandler = new BlockingResponseHandler( + null, 403, BlockingContentType.NONE, emptyMap(), null, serverContext); channel .pipeline() .addLast(BEFORE_BLOCKING_HANDLER_NAME, new ChannelInboundHandlerAdapter()) @@ -61,9 +60,8 @@ void doesNotInstallBlockingHandlerWhenAuxiliaryHandlerNameIsUnavailable() { NettyBlockResponseFunction responseFunction = new NettyBlockResponseFunction(channel.pipeline(), request, null); - assertFalse( - responseFunction.tryCommitBlockingResponse( - null, 403, BlockingContentType.NONE, emptyMap(), null)); + assertFalse(responseFunction.tryCommitBlockingResponse( + null, 403, BlockingContentType.NONE, emptyMap(), null)); assertSame(existingBeforeBlockingHandler, channel.pipeline().get(BEFORE_BLOCKING_HANDLER_NAME)); assertNull(channel.pipeline().get(HANDLER_NAME)); @@ -84,35 +82,29 @@ void commitsOffEventLoopAfterOriginalRequestIsReleased() throws Exception { AtomicReference serverContext = new AtomicReference<>(); channel .eventLoop() - .submit( - () -> { - channel - .pipeline() - .addLast(HttpServerRequestTracingHandler.INSTANCE) - .addLast(HttpServerResponseTracingHandler.INSTANCE); - ServerRequestContext.add(channel, Context.root(), null); - serverContext.set(ServerRequestContext.add(channel, Context.root(), null)); - }) + .submit(() -> { + channel + .pipeline() + .addLast(HttpServerRequestTracingHandler.INSTANCE) + .addLast(HttpServerResponseTracingHandler.INSTANCE); + ServerRequestContext.add(channel, Context.root(), null); + serverContext.set(ServerRequestContext.add(channel, Context.root(), null)); + }) .sync(); - Future blockingTask = - channel - .eventLoop() - .submit( - () -> { - eventLoopTaskStarted.countDown(); - if (!releaseEventLoop.await(5, SECONDS)) { - throw new AssertionError("event loop was not released"); - } - return null; - }); + Future blockingTask = channel.eventLoop().submit(() -> { + eventLoopTaskStarted.countDown(); + if (!releaseEventLoop.await(5, SECONDS)) { + throw new AssertionError("event loop was not released"); + } + return null; + }); assertTrue(eventLoopTaskStarted.await(5, SECONDS), "event loop task did not start"); NettyBlockResponseFunction responseFunction = new NettyBlockResponseFunction(channel.pipeline(), request, serverContext.get()); - assertTrue( - responseFunction.tryCommitBlockingResponse( - null, 403, BlockingContentType.NONE, emptyMap(), null)); + assertTrue(responseFunction.tryCommitBlockingResponse( + null, 403, BlockingContentType.NONE, emptyMap(), null)); request.release(); assertNull(channel.pipeline().get(BEFORE_BLOCKING_HANDLER_NAME)); @@ -148,38 +140,31 @@ void doesNotBlockChannelWhenScheduledRequestContextCompletesFirst() throws Excep AtomicReference serverContext = new AtomicReference<>(); channel .eventLoop() - .submit( - () -> { - channel - .pipeline() - .addLast(HttpServerRequestTracingHandler.INSTANCE) - .addLast(HttpServerResponseTracingHandler.INSTANCE); - serverContext.set(ServerRequestContext.add(channel, Context.root(), null)); - }) + .submit(() -> { + channel + .pipeline() + .addLast(HttpServerRequestTracingHandler.INSTANCE) + .addLast(HttpServerResponseTracingHandler.INSTANCE); + serverContext.set(ServerRequestContext.add(channel, Context.root(), null)); + }) .sync(); - Future blockingTask = - channel - .eventLoop() - .submit( - () -> { - eventLoopTaskStarted.countDown(); - if (!releaseEventLoop.await(5, SECONDS)) { - throw new AssertionError("event loop was not released"); - } - return null; - }); + Future blockingTask = channel.eventLoop().submit(() -> { + eventLoopTaskStarted.countDown(); + if (!releaseEventLoop.await(5, SECONDS)) { + throw new AssertionError("event loop was not released"); + } + return null; + }); assertTrue(eventLoopTaskStarted.await(5, SECONDS), "event loop task did not start"); - Future completionTask = - channel - .eventLoop() - .submit(() -> ServerRequestContext.remove(channel, serverContext.get())); + Future completionTask = channel + .eventLoop() + .submit(() -> ServerRequestContext.remove(channel, serverContext.get())); NettyBlockResponseFunction responseFunction = new NettyBlockResponseFunction(channel.pipeline(), request, serverContext.get()); - assertTrue( - responseFunction.tryCommitBlockingResponse( - null, 403, BlockingContentType.NONE, emptyMap(), null)); + assertTrue(responseFunction.tryCommitBlockingResponse( + null, 403, BlockingContentType.NONE, emptyMap(), null)); request.release(); releaseEventLoop.countDown(); diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandlerTest.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandlerTest.java index d9d90f4d83a..31ff6154da6 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandlerTest.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandlerTest.java @@ -158,10 +158,9 @@ void nettyEncoderRequiresLastContentBeforeNextKeepAliveResponse() { assertTrue(channel.writeOutbound(Unpooled.wrappedBuffer(new byte[] {1, 2, 3, 4}))); ReferenceCountUtil.release(channel.readOutbound()); - EncoderException exception = - assertThrows( - EncoderException.class, - () -> channel.writeOutbound(new DefaultFullHttpResponse(HTTP_1_1, OK))); + EncoderException exception = assertThrows( + EncoderException.class, + () -> channel.writeOutbound(new DefaultFullHttpResponse(HTTP_1_1, OK))); assertTrue(exception.getCause() instanceof IllegalStateException); diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandlerTest.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandlerTest.java index 2f98851a807..e03a37aeb84 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandlerTest.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/MaybeBlockResponseHandlerTest.java @@ -141,23 +141,19 @@ private void enableAppSecResponseBlocking() { originalAppSecActive = ActiveSubsystems.APPSEC_ACTIVE; ActiveSubsystems.APPSEC_ACTIVE = true; + subscriptions.registerCallback(EVENTS.requestStarted(), new Supplier>() { + @Override + public Flow get() { + return new Flow.ResultFlow<>(new Object()); + } + }); subscriptions.registerCallback( - EVENTS.requestStarted(), - new Supplier>() { - @Override - public Flow get() { - return new Flow.ResultFlow<>(new Object()); - } - }); - subscriptions.registerCallback( - EVENTS.responseHeader(), - new TriConsumer() { + EVENTS.responseHeader(), new TriConsumer() { @Override public void accept(RequestContext requestContext, String name, String value) {} }); subscriptions.registerCallback( - EVENTS.responseHeaderDone(), - new Function>() { + EVENTS.responseHeaderDone(), new Function>() { @Override public Flow apply(RequestContext requestContext) { return new Flow.ResultFlow(null) { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyChunkedResponseSpanTest.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyChunkedResponseSpanTest.java index 1fae3626f0e..5d779a7b101 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyChunkedResponseSpanTest.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyChunkedResponseSpanTest.java @@ -210,56 +210,48 @@ void callsIastRequestEndedForKnownLengthFullResponse() throws Exception { AtomicBoolean requestSpanActive = new AtomicBoolean(); Events events = Events.get(); - Subscription requestStarted = - AgentTracer.get() - .getSubscriptionService(RequestContextSlot.IAST) - .registerCallback( - events.requestStarted(), - new Supplier>() { - @Override - public Flow get() { - return new Flow.ResultFlow<>(iastRequestData); - } - }); - Subscription requestHeader = - AgentTracer.get() - .getSubscriptionService(RequestContextSlot.IAST) - .registerCallback( - events.requestHeader(), - new TriConsumer() { - @Override - public void accept(RequestContext context, String key, String value) { - if (iastRequestData == context.getData(RequestContextSlot.IAST) - && "authorization".equalsIgnoreCase(key)) { - authorization.set(value); - } - } - }); - Subscription requestEnd = - AgentTracer.get() - .getSubscriptionService(RequestContextSlot.IAST) - .registerCallback( - events.requestEnded(), - new BiFunction>() { - @Override - public Flow apply(RequestContext context, IGSpanInfo span) { - if (iastRequestData == context.getData(RequestContextSlot.IAST)) { - requestEnded.set(true); - AgentSpan activeSpan = AgentTracer.activeSpan(); - requestSpanActive.set( - activeSpan != null && activeSpan.getRequestContext() == context); - } - return Flow.ResultFlow.empty(); - } - }); + Subscription requestStarted = AgentTracer.get() + .getSubscriptionService(RequestContextSlot.IAST) + .registerCallback(events.requestStarted(), new Supplier>() { + @Override + public Flow get() { + return new Flow.ResultFlow<>(iastRequestData); + } + }); + Subscription requestHeader = AgentTracer.get() + .getSubscriptionService(RequestContextSlot.IAST) + .registerCallback( + events.requestHeader(), new TriConsumer() { + @Override + public void accept(RequestContext context, String key, String value) { + if (iastRequestData == context.getData(RequestContextSlot.IAST) + && "authorization".equalsIgnoreCase(key)) { + authorization.set(value); + } + } + }); + Subscription requestEnd = AgentTracer.get() + .getSubscriptionService(RequestContextSlot.IAST) + .registerCallback( + events.requestEnded(), new BiFunction>() { + @Override + public Flow apply(RequestContext context, IGSpanInfo span) { + if (iastRequestData == context.getData(RequestContextSlot.IAST)) { + requestEnded.set(true); + AgentSpan activeSpan = AgentTracer.activeSpan(); + requestSpanActive.set( + activeSpan != null && activeSpan.getRequestContext() == context); + } + return Flow.ResultFlow.empty(); + } + }); try { try (Socket socket = connect()) { socket .getOutputStream() - .write( - requestWithAuthorization(KNOWN_LENGTH_FULL_RESPONSE_PATH, "Basic dXNlcjpwYXNz") - .getBytes(US_ASCII)); + .write(requestWithAuthorization(KNOWN_LENGTH_FULL_RESPONSE_PATH, "Basic dXNlcjpwYXNz") + .getBytes(US_ASCII)); socket.getOutputStream().flush(); assertEquals("ok", readHttpResponseBody(socket.getInputStream())); @@ -282,32 +274,27 @@ void activatesRequestSpanWhenWritePromiseCompletesAfterWriteReturns() { AtomicBoolean requestSpanActive = new AtomicBoolean(); Events events = Events.get(); - Subscription requestEnd = - AgentTracer.get() - .getSubscriptionService(RequestContextSlot.IAST) - .registerCallback( - events.requestEnded(), - new BiFunction>() { - @Override - public Flow apply(RequestContext context, IGSpanInfo span) { - if (iastRequestData == context.getData(RequestContextSlot.IAST)) { - AgentSpan activeSpan = AgentTracer.activeSpan(); - requestSpanActive.set( - activeSpan != null && activeSpan.getRequestContext() == context); - } - return Flow.ResultFlow.empty(); - } - }); + Subscription requestEnd = AgentTracer.get() + .getSubscriptionService(RequestContextSlot.IAST) + .registerCallback( + events.requestEnded(), new BiFunction>() { + @Override + public Flow apply(RequestContext context, IGSpanInfo span) { + if (iastRequestData == context.getData(RequestContextSlot.IAST)) { + AgentSpan activeSpan = AgentTracer.activeSpan(); + requestSpanActive.set( + activeSpan != null && activeSpan.getRequestContext() == context); + } + return Flow.ResultFlow.empty(); + } + }); HoldingOutboundHandler holdingHandler = new HoldingOutboundHandler(); EmbeddedChannel channel = new EmbeddedChannel(holdingHandler, HttpServerResponseTracingHandler.INSTANCE); - AgentSpan span = - AgentTracer.get() - .startSpan( - "netty", - "netty.request", - new TagContext().withRequestContextDataIast(iastRequestData)); + AgentSpan span = AgentTracer.get() + .startSpan( + "netty", "netty.request", new TagContext().withRequestContextDataIast(iastRequestData)); ServerRequestContext.add(channel, span, null); try { @@ -334,32 +321,27 @@ void marksSpanErrorWhenWritePromiseFailsAfterWriteReturns() { AtomicBoolean requestSpanActive = new AtomicBoolean(); Events events = Events.get(); - Subscription requestEnd = - AgentTracer.get() - .getSubscriptionService(RequestContextSlot.IAST) - .registerCallback( - events.requestEnded(), - new BiFunction>() { - @Override - public Flow apply(RequestContext context, IGSpanInfo span) { - if (iastRequestData == context.getData(RequestContextSlot.IAST)) { - AgentSpan activeSpan = AgentTracer.activeSpan(); - requestSpanActive.set( - activeSpan != null && activeSpan.getRequestContext() == context); - } - return Flow.ResultFlow.empty(); - } - }); + Subscription requestEnd = AgentTracer.get() + .getSubscriptionService(RequestContextSlot.IAST) + .registerCallback( + events.requestEnded(), new BiFunction>() { + @Override + public Flow apply(RequestContext context, IGSpanInfo span) { + if (iastRequestData == context.getData(RequestContextSlot.IAST)) { + AgentSpan activeSpan = AgentTracer.activeSpan(); + requestSpanActive.set( + activeSpan != null && activeSpan.getRequestContext() == context); + } + return Flow.ResultFlow.empty(); + } + }); HoldingOutboundHandler holdingHandler = new HoldingOutboundHandler(); EmbeddedChannel channel = new EmbeddedChannel(holdingHandler, HttpServerResponseTracingHandler.INSTANCE); - AgentSpan span = - AgentTracer.get() - .startSpan( - "netty", - "netty.request", - new TagContext().withRequestContextDataIast(iastRequestData)); + AgentSpan span = AgentTracer.get() + .startSpan( + "netty", "netty.request", new TagContext().withRequestContextDataIast(iastRequestData)); ServerRequestContext.add(channel, span, null); IOException writeFailure = new IOException("delayed write failure"); @@ -599,21 +581,17 @@ private static String request(String path) { } private static String requestWithAuthorization(String path, String authorization) { - return "GET " - + path - + " HTTP/1.1\r\nHost: localhost\r\nAuthorization: " - + authorization + return "GET " + path + " HTTP/1.1\r\nHost: localhost\r\nAuthorization: " + authorization + "\r\n\r\n"; } private static String request(String method, String path) { String headers = method + " " + path + " HTTP/1.1\r\nHost: localhost\r\n"; if (isWebSocketPath(path)) { - headers += - "Connection: Upgrade\r\n" - + "Upgrade: websocket\r\n" - + "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" - + "Sec-WebSocket-Version: 13\r\n"; + headers += "Connection: Upgrade\r\n" + + "Upgrade: websocket\r\n" + + "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" + + "Sec-WebSocket-Version: 13\r\n"; } return headers + "\r\n"; } @@ -769,13 +747,11 @@ private void writeKnownLengthFileRegionResponse(ChannelHandlerContext ctx) throw response.headers().set(CONNECTION, "close"); response.headers().set(CONTENT_LENGTH, body.length); ctx.write(response); - ctx.writeAndFlush(new DefaultFileRegion(fileChannel, 0, body.length)) - .addListener( - future -> { - close(fileChannel); - delete(path); - knownLengthFileRegionWrites.offer(ctx); - }); + ctx.writeAndFlush(new DefaultFileRegion(fileChannel, 0, body.length)).addListener(future -> { + close(fileChannel); + delete(path); + knownLengthFileRegionWrites.offer(ctx); + }); } private void writeIncompleteKnownLengthResponse(ChannelHandlerContext ctx) { diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttp11PipeliningTest.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttp11PipeliningTest.java index e10d032d965..9dd3b50d048 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttp11PipeliningTest.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttp11PipeliningTest.java @@ -128,18 +128,16 @@ void createsServerSpanForEachPipelinedRequest() throws Exception { @Test void reactorNettyCompletesPipelinedFixedLengthResponses() throws Exception { - DisposableServer reactorServer = - HttpServer.create() - .host("localhost") - .port(0) - .handle( - (request, response) -> { - String body = "response " + request.uri(); - response.header(CONTENT_LENGTH, Integer.toString(body.getBytes(UTF_8).length)); - return Mono.delay(Duration.ofMillis(100)) - .then(Mono.defer(() -> response.sendString(Mono.just(body)).then())); - }) - .bindNow(); + DisposableServer reactorServer = HttpServer.create() + .host("localhost") + .port(0) + .handle((request, response) -> { + String body = "response " + request.uri(); + response.header(CONTENT_LENGTH, Integer.toString(body.getBytes(UTF_8).length)); + return Mono.delay(Duration.ofMillis(100)) + .then(Mono.defer(() -> response.sendString(Mono.just(body)).then())); + }) + .bindNow(); try { try (Socket socket = new Socket("localhost", reactorServer.port())) { @@ -458,14 +456,12 @@ private Object enableAppSec() { originalAppSecActive = ActiveSubsystems.APPSEC_ACTIVE; ActiveSubsystems.APPSEC_ACTIVE = true; - subscriptions.registerCallback( - EVENTS.requestStarted(), - new Supplier>() { - @Override - public Flow get() { - return new Flow.ResultFlow<>(new Object()); - } - }); + subscriptions.registerCallback(EVENTS.requestStarted(), new Supplier>() { + @Override + public Flow get() { + return new Flow.ResultFlow<>(new Object()); + } + }); return subscriptions; } @@ -474,12 +470,11 @@ private static TraceMatcher serverTrace(String path) { } private static TraceMatcher serverTrace(String method, String path) { - return trace( - span() - .root() - .operationName(Pattern.compile("netty\\.request")) - .resourceName(Pattern.compile(Pattern.quote(method + " " + path))) - .type("web")); + return trace(span() + .root() + .operationName(Pattern.compile("netty\\.request")) + .resourceName(Pattern.compile(Pattern.quote(method + " " + path))) + .type("web")); } @ChannelHandler.Sharable @@ -551,13 +546,8 @@ protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) BlockResponseFunction blockResponseFunction = requestContext == null ? null : requestContext.getBlockResponseFunction(); if (blockResponseFunction != null) { - blockingResponseCommitted = - blockResponseFunction.tryCommitBlockingResponse( - requestContext.getTraceSegment(), - 403, - BlockingContentType.NONE, - emptyMap(), - null); + blockingResponseCommitted = blockResponseFunction.tryCommitBlockingResponse( + requestContext.getTraceSegment(), 403, BlockingContentType.NONE, emptyMap(), null); } if (blockingResponseCommitted && blockResponseFunctionRequestSeen != null) { blockResponseFunctionRequestSeen.countDown(); @@ -587,19 +577,16 @@ private void writeResponses() { synchronized (paths) { responsePaths = new ArrayList<>(paths); } - responseContext - .executor() - .execute( - () -> { - for (String path : responsePaths) { - byte[] body = ("response " + path).getBytes(UTF_8); - DefaultFullHttpResponse response = - new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body)); - response.headers().set(CONTENT_LENGTH, body.length); - responseContext.write(response); - } - responseContext.flush(); - }); + responseContext.executor().execute(() -> { + for (String path : responsePaths) { + byte[] body = ("response " + path).getBytes(UTF_8); + DefaultFullHttpResponse response = + new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body)); + response.headers().set(CONTENT_LENGTH, body.length); + responseContext.write(response); + } + responseContext.flush(); + }); } private void writeChunkedResponse() { @@ -611,18 +598,15 @@ private void writeChunkedResponse() { synchronized (paths) { path = paths.get(0); } - responseContext - .executor() - .execute( - () -> { - byte[] body = ("response " + path).getBytes(UTF_8); - DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); - response.headers().set(TRANSFER_ENCODING, CHUNKED); - responseContext.write(response); - responseContext.write(new DefaultHttpContent(Unpooled.wrappedBuffer(body))); - responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); - responseContext.flush(); - }); + responseContext.executor().execute(() -> { + byte[] body = ("response " + path).getBytes(UTF_8); + DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); + response.headers().set(TRANSFER_ENCODING, CHUNKED); + responseContext.write(response); + responseContext.write(new DefaultHttpContent(Unpooled.wrappedBuffer(body))); + responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); + responseContext.flush(); + }); } private void writeHeaderOnlyResponseHeaders() { @@ -630,14 +614,11 @@ private void writeHeaderOnlyResponseHeaders() { if (responseContext == null) { throw new IllegalStateException("no request context captured"); } - responseContext - .executor() - .execute( - () -> { - DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, NO_CONTENT); - response.headers().set(CONNECTION, KEEP_ALIVE); - responseContext.writeAndFlush(response); - }); + responseContext.executor().execute(() -> { + DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, NO_CONTENT); + response.headers().set(CONNECTION, KEEP_ALIVE); + responseContext.writeAndFlush(response); + }); } private void writeLastContent() { @@ -647,9 +628,8 @@ private void writeLastContent() { } responseContext .executor() - .execute( - () -> - responseContext.writeAndFlush(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER))); + .execute(() -> + responseContext.writeAndFlush(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER))); } private void writeHeadResponse() { @@ -661,17 +641,14 @@ private void writeHeadResponse() { synchronized (paths) { path = paths.get(0); } - responseContext - .executor() - .execute( - () -> { - byte[] body = ("response " + path).getBytes(UTF_8); - DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); - response.headers().set(CONTENT_LENGTH, body.length); - responseContext.write(response); - responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); - responseContext.flush(); - }); + responseContext.executor().execute(() -> { + byte[] body = ("response " + path).getBytes(UTF_8); + DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); + response.headers().set(CONTENT_LENGTH, body.length); + responseContext.write(response); + responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); + responseContext.flush(); + }); } private void writeInterimResponseWithTerminatorThenResponse() { @@ -683,20 +660,17 @@ private void writeInterimResponseWithTerminatorThenResponse() { synchronized (paths) { path = paths.get(0); } - responseContext - .executor() - .execute( - () -> { - responseContext.write(new DefaultHttpResponse(HTTP_1_1, CONTINUE)); - responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); - - byte[] body = ("response " + path).getBytes(UTF_8); - DefaultFullHttpResponse response = - new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body)); - response.headers().set(CONTENT_LENGTH, body.length); - responseContext.write(response); - responseContext.flush(); - }); + responseContext.executor().execute(() -> { + responseContext.write(new DefaultHttpResponse(HTTP_1_1, CONTINUE)); + responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); + + byte[] body = ("response " + path).getBytes(UTF_8); + DefaultFullHttpResponse response = + new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body)); + response.headers().set(CONTENT_LENGTH, body.length); + responseContext.write(response); + responseContext.flush(); + }); } private void writeEarlyHintsWithTerminatorThenResponse() { @@ -712,20 +686,17 @@ private void writeInformationalResponseWithTerminatorThenResponse(HttpResponseSt synchronized (paths) { path = paths.get(0); } - responseContext - .executor() - .execute( - () -> { - responseContext.write(new DefaultHttpResponse(HTTP_1_1, status)); - responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); - - byte[] body = ("response " + path).getBytes(UTF_8); - DefaultFullHttpResponse response = - new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body)); - response.headers().set(CONTENT_LENGTH, body.length); - responseContext.write(response); - responseContext.flush(); - }); + responseContext.executor().execute(() -> { + responseContext.write(new DefaultHttpResponse(HTTP_1_1, status)); + responseContext.write(new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER)); + + byte[] body = ("response " + path).getBytes(UTF_8); + DefaultFullHttpResponse response = + new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body)); + response.headers().set(CONTENT_LENGTH, body.length); + responseContext.write(response); + responseContext.flush(); + }); } } } diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerTestSupport.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerTestSupport.java index d75bab18d14..a39bb06056c 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerTestSupport.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyHttpServerTestSupport.java @@ -30,17 +30,15 @@ abstract class NettyHttpServerTestSupport extends AbstractInstrumentationTest { @BeforeAll void startServer() throws Exception { eventLoopGroup = new NioEventLoopGroup(1); - ServerBootstrap bootstrap = - new ServerBootstrap() - .group(eventLoopGroup) - .channel(NioServerSocketChannel.class) - .childHandler( - new ChannelInitializer() { - @Override - protected void initChannel(Channel ch) { - configurePipeline(ch); - } - }); + ServerBootstrap bootstrap = new ServerBootstrap() + .group(eventLoopGroup) + .channel(NioServerSocketChannel.class) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(Channel ch) { + configurePipeline(ch); + } + }); serverChannel = bootstrap.bind(0).sync().channel(); port = ((InetSocketAddress) serverChannel.localAddress()).getPort(); } diff --git a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyNativeClientAbortSpanTest.java b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyNativeClientAbortSpanTest.java index 28ed7e1d926..3cde930d571 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyNativeClientAbortSpanTest.java +++ b/dd-java-agent/instrumentation/netty/netty-4.1/src/test/java/datadog/trace/instrumentation/netty41/server/NettyNativeClientAbortSpanTest.java @@ -65,24 +65,21 @@ void nativeBrokenPipeFromCancelledResponseDoesNotMarkServerSpanError() throws Ex EventLoopGroup worker = transport.newEventLoopGroup(1); Channel server = null; try { - server = - new ServerBootstrap() - .group(boss, worker) - .channel(transport.serverSocketChannelClass) - .childOption( - ChannelOption.WRITE_BUFFER_WATER_MARK, - new WriteBufferWaterMark(32 * 1024, 64 * 1024)) - .childHandler( - new ChannelInitializer() { - @Override - protected void initChannel(Channel ch) { - ch.pipeline().addLast(new HttpServerCodec()); - ch.pipeline().addLast(handler); - } - }) - .bind("127.0.0.1", 0) - .sync() - .channel(); + server = new ServerBootstrap() + .group(boss, worker) + .channel(transport.serverSocketChannelClass) + .childOption( + ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(32 * 1024, 64 * 1024)) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(Channel ch) { + ch.pipeline().addLast(new HttpServerCodec()); + ch.pipeline().addLast(handler); + } + }) + .bind("127.0.0.1", 0) + .sync() + .channel(); int port = ((InetSocketAddress) server.localAddress()).getPort(); try (Socket socket = new Socket("127.0.0.1", port)) { @@ -154,16 +151,14 @@ private void writeCancelledResponseTail(ChannelHandlerContext ctx) { content.writeZero(content.writableBytes()); ctx.write(new DefaultHttpContent(content)); } - ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT) - .addListener( - future -> { - if (future.isSuccess()) { - failures.offer( - new AssertionError("cancelled response tail write unexpectedly succeeded")); - } else if (failureRecorded.compareAndSet(false, true)) { - failures.offer(future.cause()); - } - }); + ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT).addListener(future -> { + if (future.isSuccess()) { + failures.offer( + new AssertionError("cancelled response tail write unexpectedly succeeded")); + } else if (failureRecorded.compareAndSet(false, true)) { + failures.offer(future.cause()); + } + }); } private Throwable awaitFailure() throws InterruptedException, TimeoutException { diff --git a/dd-java-agent/instrumentation/okhttp/okhttp-2.2/src/main/java/datadog/trace/instrumentation/okhttp2/AppSecInterceptor.java b/dd-java-agent/instrumentation/okhttp/okhttp-2.2/src/main/java/datadog/trace/instrumentation/okhttp2/AppSecInterceptor.java index 7f55cc9a4fa..cd5127f64f0 100644 --- a/dd-java-agent/instrumentation/okhttp/okhttp-2.2/src/main/java/datadog/trace/instrumentation/okhttp2/AppSecInterceptor.java +++ b/dd-java-agent/instrumentation/okhttp/okhttp-2.2/src/main/java/datadog/trace/instrumentation/okhttp2/AppSecInterceptor.java @@ -91,11 +91,10 @@ public static Request onRequest( if (payload.length <= BODY_PARSING_SIZE_LIMIT) { clientRequest.setBody(mediaType, new ByteArrayInputStream(payload)); } - result = - request - .newBuilder() - .method(request.method(), RequestBody.create(requestBody.contentType(), payload)) - .build(); // update request + result = request + .newBuilder() + .method(request.method(), RequestBody.create(requestBody.contentType(), payload)) + .build(); // update request } } catch (IOException e) { // ignore it and keep the original request @@ -131,11 +130,10 @@ public static Response onResponse( if (payload.length <= BODY_PARSING_SIZE_LIMIT) { clientResponse.setBody(mediaType, new ByteArrayInputStream(payload)); } - result = - response - .newBuilder() - .body(ResponseBody.create(responseBody.contentType(), payload)) - .build(); + result = response + .newBuilder() + .body(ResponseBody.create(responseBody.contentType(), payload)) + .build(); } } catch (IOException e) { // ignore it and keep the original response diff --git a/dd-java-agent/instrumentation/okhttp/okhttp-3.0/src/main/java/datadog/trace/instrumentation/okhttp3/AppSecInterceptor.java b/dd-java-agent/instrumentation/okhttp/okhttp-3.0/src/main/java/datadog/trace/instrumentation/okhttp3/AppSecInterceptor.java index e61a78003bb..c3a9d2d3481 100644 --- a/dd-java-agent/instrumentation/okhttp/okhttp-3.0/src/main/java/datadog/trace/instrumentation/okhttp3/AppSecInterceptor.java +++ b/dd-java-agent/instrumentation/okhttp/okhttp-3.0/src/main/java/datadog/trace/instrumentation/okhttp3/AppSecInterceptor.java @@ -91,11 +91,10 @@ public static Request onRequest( if (payload.length <= BODY_PARSING_SIZE_LIMIT) { clientRequest.setBody(mediaType, new ByteArrayInputStream(payload)); } - result = - request - .newBuilder() - .method(request.method(), RequestBody.create(requestBody.contentType(), payload)) - .build(); // update request + result = request + .newBuilder() + .method(request.method(), RequestBody.create(requestBody.contentType(), payload)) + .build(); // update request } } catch (IOException e) { // ignore it and keep the original request @@ -131,11 +130,10 @@ public static Response onResponse( if (payload.length <= BODY_PARSING_SIZE_LIMIT) { clientResponse.setBody(mediaType, new ByteArrayInputStream(payload)); } - result = - response - .newBuilder() - .body(ResponseBody.create(responseBody.contentType(), payload)) - .build(); + result = response + .newBuilder() + .body(ResponseBody.create(responseBody.contentType(), payload)) + .build(); } } catch (IOException e) { // ignore it and keep the original response diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionDecorator.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionDecorator.java index bbb24f9194b..5e7e4a58534 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionDecorator.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionDecorator.java @@ -50,11 +50,10 @@ public void withChatCompletionCreateParams( } // Keep model_name and output shape stable on error paths where no response is available. - modelName.ifPresent( - str -> { - span.setTag(CommonTags.MODEL_NAME, str); - span.setTag(CommonTags.OUTPUT, Collections.singletonList(LLMObs.LLMMessage.from("", ""))); - }); + modelName.ifPresent(str -> { + span.setTag(CommonTags.MODEL_NAME, str); + span.setTag(CommonTags.OUTPUT, Collections.singletonList(LLMObs.LLMMessage.from("", ""))); + }); span.setTag(CommonTags.SPAN_KIND, Tags.LLMOBS_LLM_SPAN_KIND); @@ -70,38 +69,32 @@ public void withChatCompletionCreateParams( params.maxTokens().ifPresent(v -> metadata.put("max_tokens", v)); params.temperature().ifPresent(v -> metadata.put("temperature", v)); metadata.put("stream", stream); - params - .streamOptions() - .ifPresent( - v -> { - if (v.includeUsage().orElse(false)) { - metadata.put("stream_options", Collections.singletonMap("include_usage", true)); - } - }); + params.streamOptions().ifPresent(v -> { + if (v.includeUsage().orElse(false)) { + metadata.put("stream_options", Collections.singletonMap("include_usage", true)); + } + }); params.topP().ifPresent(v -> metadata.put("top_p", v)); params.frequencyPenalty().ifPresent(v -> metadata.put("frequency_penalty", v)); params.presencePenalty().ifPresent(v -> metadata.put("presence_penalty", v)); params.n().ifPresent(v -> metadata.put("n", v)); params.seed().ifPresent(v -> metadata.put("seed", v)); span.setTag(CommonTags.METADATA, metadata); - params - .toolChoice() - .ifPresent( - toolChoice -> { - String choice = null; - if (toolChoice.isAuto()) { - choice = "auto"; - } else if (toolChoice.isAllowedToolChoice()) { - choice = "allowed_tools"; - } else if (toolChoice.isNamedToolChoice()) { - choice = "function"; - } else if (toolChoice.isNamedToolChoiceCustom()) { - choice = "custom"; - } - if (choice != null) { - metadata.put("tool_choice", choice); - } - }); + params.toolChoice().ifPresent(toolChoice -> { + String choice = null; + if (toolChoice.isAuto()) { + choice = "auto"; + } else if (toolChoice.isAllowedToolChoice()) { + choice = "allowed_tools"; + } else if (toolChoice.isNamedToolChoice()) { + choice = "function"; + } else if (toolChoice.isNamedToolChoiceCustom()) { + choice = "custom"; + } + if (choice != null) { + metadata.put("tool_choice", choice); + } + }); List tools = params._tools().asKnown().orElse(Collections.emptyList()); if (!tools.isEmpty()) { @@ -138,9 +131,8 @@ private static Map extractFunctionToolDef(ChatCompletionFunction funcDef.description().ifPresent(desc -> toolDef.put("description", desc)); funcDef .parameters() - .ifPresent( - params -> - toolDef.put("schema", jsonValueMapToObject(params._additionalProperties()))); + .ifPresent(params -> + toolDef.put("schema", jsonValueMapToObject(params._additionalProperties()))); return toolDef; } @@ -183,7 +175,8 @@ private static LLMObs.LLMMessage llmMessage(ChatCompletionMessageParam m) { return LLMObs.LLMMessage.from( "assistant", m.asAssistant().content().map(v -> v.text().orElse(null)).orElse(null)); } else if (m.isDeveloper()) { - return LLMObs.LLMMessage.from("developer", m.asDeveloper().content().text().orElse(null)); + return LLMObs.LLMMessage.from( + "developer", m.asDeveloper().content().text().orElse(null)); } else if (m.isSystem()) { return LLMObs.LLMMessage.from("system", m.asSystem().content().text().orElse(null)); } else if (m.isTool()) { @@ -210,19 +203,15 @@ public void withChatCompletion(AgentSpan span, ChatCompletion completion) { .collect(Collectors.toList()); span.setTag(CommonTags.OUTPUT, output); - completion - ._usage() - .asKnown() - .ifPresent( - usage -> { - span.setTag(CommonTags.INPUT_TOKENS, usage.promptTokens()); - span.setTag(CommonTags.OUTPUT_TOKENS, usage.completionTokens()); - span.setTag(CommonTags.TOTAL_TOKENS, usage.totalTokens()); - usage - .promptTokensDetails() - .flatMap(details -> details.cachedTokens()) - .ifPresent(v -> span.setTag(CommonTags.CACHE_READ_INPUT_TOKENS, v)); - }); + completion._usage().asKnown().ifPresent(usage -> { + span.setTag(CommonTags.INPUT_TOKENS, usage.promptTokens()); + span.setTag(CommonTags.OUTPUT_TOKENS, usage.completionTokens()); + span.setTag(CommonTags.TOTAL_TOKENS, usage.totalTokens()); + usage + .promptTokensDetails() + .flatMap(details -> details.cachedTokens()) + .ifPresent(v -> span.setTag(CommonTags.CACHE_READ_INPUT_TOKENS, v)); + }); } private static LLMObs.LLMMessage llmMessage(ChatCompletion.Choice choice) { diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceAsyncInstrumentation.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceAsyncInstrumentation.java index d5ad641b670..92c890c54ea 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceAsyncInstrumentation.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceAsyncInstrumentation.java @@ -36,18 +36,16 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("create")) - .and( - takesArgument( - 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) + .and(takesArgument( + 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) .and(returns(named(CompletableFuture.class.getName()))), getClass().getName() + "$CreateAdvice"); transformer.applyAdvice( isMethod() .and(named("createStreaming")) - .and( - takesArgument( - 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) + .and(takesArgument( + 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) .and(returns(named(CompletableFuture.class.getName()))), getClass().getName() + "$CreateStreamingAdvice"); } @@ -76,9 +74,8 @@ public static void exit( if (err != null || future == null) { DECORATE.finishSpan(span, err); } else { - future = - HttpResponseWrapper.wrapFuture( - future, span, ChatCompletionDecorator.DECORATE::withChatCompletion); + future = HttpResponseWrapper.wrapFuture( + future, span, ChatCompletionDecorator.DECORATE::withChatCompletion); } scope.close(); } @@ -104,9 +101,8 @@ public static void exit( if (err != null || future == null) { DECORATE.finishSpan(span, err); } else { - future = - HttpStreamResponseWrapper.wrapFuture( - future, span, ChatCompletionDecorator.DECORATE::withChatCompletionChunks); + future = HttpStreamResponseWrapper.wrapFuture( + future, span, ChatCompletionDecorator.DECORATE::withChatCompletionChunks); } scope.close(); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceInstrumentation.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceInstrumentation.java index fb0cfded56f..2098913a8eb 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceInstrumentation.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ChatCompletionServiceInstrumentation.java @@ -35,18 +35,16 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("create")) - .and( - takesArgument( - 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) + .and(takesArgument( + 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) .and(returns(named("com.openai.core.http.HttpResponseFor"))), getClass().getName() + "$CreateAdvice"); transformer.applyAdvice( isMethod() .and(named("createStreaming")) - .and( - takesArgument( - 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) + .and(takesArgument( + 0, named("com.openai.models.chat.completions.ChatCompletionCreateParams"))) .and(returns(named("com.openai.core.http.HttpResponseFor"))), getClass().getName() + "$CreateStreamingAdvice"); } @@ -75,9 +73,8 @@ public static void exit( if (err != null || response == null) { DECORATE.finishSpan(span, err); } else { - response = - HttpResponseWrapper.wrap( - response, span, ChatCompletionDecorator.DECORATE::withChatCompletion); + response = HttpResponseWrapper.wrap( + response, span, ChatCompletionDecorator.DECORATE::withChatCompletion); } scope.close(); } @@ -104,9 +101,8 @@ public static void exit( if (err != null || response == null) { DECORATE.finishSpan(span, err); } else { - response = - HttpStreamResponseWrapper.wrap( - response, span, ChatCompletionDecorator.DECORATE::withChatCompletionChunks); + response = HttpStreamResponseWrapper.wrap( + response, span, ChatCompletionDecorator.DECORATE::withChatCompletionChunks); } scope.close(); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionDecorator.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionDecorator.java index 341f4e2b138..b92c573176c 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionDecorator.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionDecorator.java @@ -35,31 +35,24 @@ public void withCompletionCreateParams(AgentSpan span, CompletionCreateParams pa } // Keep model_name and output shape stable on error paths where no response is available. - modelName.ifPresent( - str -> { - span.setTag(CommonTags.MODEL_NAME, str); - span.setTag(CommonTags.OUTPUT, Collections.singletonList(LLMObs.LLMMessage.from("", ""))); - }); + modelName.ifPresent(str -> { + span.setTag(CommonTags.MODEL_NAME, str); + span.setTag(CommonTags.OUTPUT, Collections.singletonList(LLMObs.LLMMessage.from("", ""))); + }); span.setTag(CommonTags.SPAN_KIND, Tags.LLMOBS_LLM_SPAN_KIND); extractPromptText(params) - .ifPresent( - input -> - span.setTag( - CommonTags.INPUT, - Collections.singletonList(LLMObs.LLMMessage.from("", input)))); + .ifPresent(input -> span.setTag( + CommonTags.INPUT, Collections.singletonList(LLMObs.LLMMessage.from("", input)))); Map metadata = new HashMap<>(); params.maxTokens().ifPresent(v -> metadata.put("max_tokens", v)); params.temperature().ifPresent(v -> metadata.put("temperature", v)); - params - .streamOptions() - .ifPresent( - v -> { - if (v.includeUsage().orElse(false)) { - metadata.put("stream_options", Collections.singletonMap("include_usage", true)); - } - }); + params.streamOptions().ifPresent(v -> { + if (v.includeUsage().orElse(false)) { + metadata.put("stream_options", Collections.singletonMap("include_usage", true)); + } + }); span.setTag(CommonTags.METADATA, metadata); } @@ -78,24 +71,11 @@ public void withCompletion(AgentSpan span, Completion completion) { .collect(Collectors.toList()); span.setTag(CommonTags.OUTPUT, output); - completion - ._usage() - .asKnown() - .ifPresent( - usage -> { - usage - ._promptTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.INPUT_TOKENS, v)); - usage - ._completionTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.OUTPUT_TOKENS, v)); - usage - ._totalTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.TOTAL_TOKENS, v)); - }); + completion._usage().asKnown().ifPresent(usage -> { + usage._promptTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.INPUT_TOKENS, v)); + usage._completionTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.OUTPUT_TOKENS, v)); + usage._totalTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.TOTAL_TOKENS, v)); + }); } public void withCompletions(AgentSpan span, List completions) { @@ -114,45 +94,26 @@ public void withCompletions(AgentSpan span, List completions) { Map textByChoiceIndex = new HashMap<>(); for (Completion completion : completions) { - completion - ._choices() - .asKnown() - .orElse(Collections.emptyList()) - .forEach( - choice -> { - long index = choice._index().asKnown().orElse(0L); - textByChoiceIndex - .computeIfAbsent(index, k -> new StringBuilder()) - .append(choice._text().asString().orElse("")); - }); + completion._choices().asKnown().orElse(Collections.emptyList()).forEach(choice -> { + long index = choice._index().asKnown().orElse(0L); + textByChoiceIndex + .computeIfAbsent(index, k -> new StringBuilder()) + .append(choice._text().asString().orElse("")); + }); } - List output = - textByChoiceIndex.entrySet().stream() - .sorted(Map.Entry.comparingByKey()) - .map(entry -> LLMObs.LLMMessage.from("", entry.getValue().toString())) - .collect(Collectors.toList()); + List output = textByChoiceIndex.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .map(entry -> LLMObs.LLMMessage.from("", entry.getValue().toString())) + .collect(Collectors.toList()); span.setTag(CommonTags.OUTPUT, output); Completion lastCompletion = completions.get(completions.size() - 1); - lastCompletion - ._usage() - .asKnown() - .ifPresent( - usage -> { - usage - ._promptTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.INPUT_TOKENS, v)); - usage - ._completionTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.OUTPUT_TOKENS, v)); - usage - ._totalTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.TOTAL_TOKENS, v)); - }); + lastCompletion._usage().asKnown().ifPresent(usage -> { + usage._promptTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.INPUT_TOKENS, v)); + usage._completionTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.OUTPUT_TOKENS, v)); + usage._totalTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.TOTAL_TOKENS, v)); + }); } private Optional extractCompletionModelName(CompletionCreateParams params) { diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceAsyncInstrumentation.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceAsyncInstrumentation.java index e372a4a4cc1..4f28346df52 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceAsyncInstrumentation.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceAsyncInstrumentation.java @@ -71,9 +71,8 @@ public static void exit( if (err != null || future == null) { DECORATE.finishSpan(span, err); } else { - future = - HttpResponseWrapper.wrapFuture( - future, span, CompletionDecorator.DECORATE::withCompletion); + future = HttpResponseWrapper.wrapFuture( + future, span, CompletionDecorator.DECORATE::withCompletion); } scope.close(); } @@ -100,9 +99,8 @@ public static void exit( if (err != null || future == null) { DECORATE.finishSpan(span, err); } else { - future = - HttpStreamResponseWrapper.wrapFuture( - future, span, CompletionDecorator.DECORATE::withCompletions); + future = HttpStreamResponseWrapper.wrapFuture( + future, span, CompletionDecorator.DECORATE::withCompletions); } scope.close(); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceInstrumentation.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceInstrumentation.java index d3f23e2d0aa..4085c2d2bf2 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceInstrumentation.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceInstrumentation.java @@ -99,9 +99,8 @@ public static void exit( if (err != null || response == null) { DECORATE.finishSpan(span, err); } else { - response = - HttpStreamResponseWrapper.wrap( - response, span, CompletionDecorator.DECORATE::withCompletions); + response = HttpStreamResponseWrapper.wrap( + response, span, CompletionDecorator.DECORATE::withCompletions); } scope.close(); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingDecorator.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingDecorator.java index 9d648fed32c..fd44364430b 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingDecorator.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingDecorator.java @@ -50,11 +50,10 @@ public void withEmbeddingCreateParams(AgentSpan span, EmbeddingCreateParams para } private List embeddingDocuments(EmbeddingCreateParams.Input input) { - List inputs = - input - .string() - .map(Collections::singletonList) - .orElseGet(() -> input.arrayOfStrings().orElse(Collections.emptyList())); + List inputs = input + .string() + .map(Collections::singletonList) + .orElseGet(() -> input.arrayOfStrings().orElse(Collections.emptyList())); return inputs.stream().map(LLMObs.Document::from).collect(Collectors.toList()); } @@ -78,20 +77,10 @@ public void withCreateEmbeddingResponse(AgentSpan span, CreateEmbeddingResponse String.format("[%d embedding(s) returned with size %d]", embeddingCount, embeddingSize)); } - response - ._usage() - .asKnown() - .ifPresent( - usage -> { - usage - ._promptTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.INPUT_TOKENS, v)); - usage - ._totalTokens() - .asKnown() - .ifPresent(v -> span.setTag(CommonTags.TOTAL_TOKENS, v)); - }); + response._usage().asKnown().ifPresent(usage -> { + usage._promptTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.INPUT_TOKENS, v)); + usage._totalTokens().asKnown().ifPresent(v -> span.setTag(CommonTags.TOTAL_TOKENS, v)); + }); } private Optional extractEmbeddingModelName(EmbeddingCreateParams params) { @@ -103,6 +92,8 @@ private Optional extractEmbeddingModelName(EmbeddingCreateParams params) private Optional extractEncodingFormat(EmbeddingCreateParams params) { Optional encodingFormat = params._encodingFormat().asKnown().flatMap(format -> format._value().asString()); - return encodingFormat.isPresent() ? encodingFormat : params._encodingFormat().asString(); + return encodingFormat.isPresent() + ? encodingFormat + : params._encodingFormat().asString(); } } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingServiceInstrumentation.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingServiceInstrumentation.java index 259bf901b58..7069c0fba2c 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingServiceInstrumentation.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/EmbeddingServiceInstrumentation.java @@ -62,9 +62,8 @@ public static void exit( if (err != null || response == null) { DECORATE.finishSpan(span, err); } else { - response = - HttpResponseWrapper.wrap( - response, span, EmbeddingDecorator.DECORATE::withCreateEmbeddingResponse); + response = HttpResponseWrapper.wrap( + response, span, EmbeddingDecorator.DECORATE::withCreateEmbeddingResponse); } scope.close(); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/FunctionCallOutputExtractor.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/FunctionCallOutputExtractor.java index e2ea60dff91..270b60af414 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/FunctionCallOutputExtractor.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/FunctionCallOutputExtractor.java @@ -27,11 +27,10 @@ public class FunctionCallOutputExtractor { Class outputClass = null; try { - outputClass = - Class.forName( - FUNCTION_CALL_OUTPUT_CLASS.getName() + "$Output", - false, - FUNCTION_CALL_OUTPUT_CLASS.getClassLoader()); + outputClass = Class.forName( + FUNCTION_CALL_OUTPUT_CLASS.getName() + "$Output", + false, + FUNCTION_CALL_OUTPUT_CLASS.getClassLoader()); } catch (Throwable t) { log.debug("Output class not found, assuming openai-java version 3.x", t); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpResponseWrapper.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpResponseWrapper.java index 1e8f7493930..9f5d0a2d630 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpResponseWrapper.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpResponseWrapper.java @@ -26,16 +26,13 @@ public static CompletableFuture> wrapFuture( CompletableFuture> future, AgentSpan span, BiConsumer decorate) { - return future - .thenApply(response -> wrap(response, span, decorate)) - .whenComplete( - (_r, t) -> { - if (t != null) { - // Only finish if there was an error; otherwise, HttpResponseWrapper.close will - // finish it later. - DECORATE.finishSpan(span, t); - } - }); + return future.thenApply(response -> wrap(response, span, decorate)).whenComplete((_r, t) -> { + if (t != null) { + // Only finish if there was an error; otherwise, HttpResponseWrapper.close will + // finish it later. + DECORATE.finishSpan(span, t); + } + }); } private final HttpResponseFor delegate; diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpStreamResponseWrapper.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpStreamResponseWrapper.java index cb715745303..5b777bdf414 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpStreamResponseWrapper.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/HttpStreamResponseWrapper.java @@ -27,14 +27,11 @@ public static CompletableFuture>> wrapFutu CompletableFuture>> future, AgentSpan span, BiConsumer> decorate) { - return future - .thenApply(r -> wrap(r, span, decorate)) - .whenComplete( - (_r, err) -> { - if (err != null) { - DECORATE.finishSpan(span, err); - } - }); + return future.thenApply(r -> wrap(r, span, decorate)).whenComplete((_r, err) -> { + if (err != null) { + DECORATE.finishSpan(span, err); + } + }); } private final HttpResponseFor> delegate; diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/OpenAiDecorator.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/OpenAiDecorator.java index 796490bdda5..066625c9a5c 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/OpenAiDecorator.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/OpenAiDecorator.java @@ -161,10 +161,9 @@ protected void doAfterStart(@Nonnull AgentSpan span) { // there is nothing to inherit: an unstamped span is retained at any configured rate. if (samplingDecision == null || sampleRate == null) { sampleRate = sampler.formattedRate(); - samplingDecision = - sampler.sample(span.getTraceId().toLong()) - ? LLMObsContext.SAMPLING_DECISION_SAMPLED - : LLMObsContext.SAMPLING_DECISION_DROPPED; + samplingDecision = sampler.sample(span.getTraceId().toLong()) + ? LLMObsContext.SAMPLING_DECISION_SAMPLED + : LLMObsContext.SAMPLING_DECISION_DROPPED; } span.setTag(CommonTags.SAMPLING_DECISION, samplingDecision); span.setTag(CommonTags.SAMPLE_RATE, sampleRate); diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseDecorator.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseDecorator.java index bc84471eed2..1520bf3c102 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseDecorator.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseDecorator.java @@ -71,13 +71,9 @@ public void withResponseCreateParams(AgentSpan span, ResponseCreateParams params List inputMessages = new ArrayList<>(); - params - ._instructions() - .asString() - .ifPresent( - instructions -> { - inputMessages.add(LLMObs.LLMMessage.from("system", instructions)); - }); + params._instructions().asString().ifPresent(instructions -> { + inputMessages.add(LLMObs.LLMMessage.from("system", instructions)); + }); Optional textOpt = params._input().asString(); if (textOpt.isPresent()) { @@ -181,9 +177,8 @@ private Map extractFunctionToolDefinition(FunctionTool functionT functionTool.description().ifPresent(desc -> toolDef.put("description", desc)); functionTool .parameters() - .ifPresent( - parameters -> - toolDef.put("schema", jsonValueMapToObject(parameters._additionalProperties()))); + .ifPresent(parameters -> + toolDef.put("schema", jsonValueMapToObject(parameters._additionalProperties()))); return toolDef; } @@ -208,10 +203,9 @@ private Map extractFunctionToolDefinition(JsonValue rawTool) { } } - String name = - functionObj == null - ? getJsonString(toolObj.get("name")) - : getJsonString(functionObj.get("name")); + String name = functionObj == null + ? getJsonString(toolObj.get("name")) + : getJsonString(functionObj.get("name")); if (name == null || name.isEmpty()) { return null; } @@ -219,10 +213,9 @@ private Map extractFunctionToolDefinition(JsonValue rawTool) { Map toolDef = new HashMap<>(); toolDef.put("name", name); - String description = - functionObj == null - ? getJsonString(toolObj.get("description")) - : getJsonString(functionObj.get("description")); + String description = functionObj == null + ? getJsonString(toolObj.get("description")) + : getJsonString(functionObj.get("description")); if (description != null) { toolDef.put("description", description); } @@ -439,10 +432,9 @@ private String extractInputContentText(ResponseInputContent content) { return inputText.get(); } - Optional inputImage = - content - .inputImage() - .map(v -> v.imageUrl().orElse(v.fileId().orElse(IMAGE_FALLBACK_MARKER))); + Optional inputImage = content + .inputImage() + .map(v -> v.imageUrl().orElse(v.fileId().orElse(IMAGE_FALLBACK_MARKER))); if (inputImage.isPresent()) { return inputImage.get(); } @@ -534,25 +526,21 @@ private void withResponse(AgentSpan span, Response response, boolean stream) { response.temperature().ifPresent(v -> metadata.put("temperature", v)); response.topP().ifPresent(v -> metadata.put("top_p", v)); - response - ._toolChoice() - .asKnown() - .ifPresent( - toolChoice -> { - toolChoice - .options() - .flatMap(v -> v._value().asString()) - .ifPresent(v -> metadata.put("tool_choice", v)); - if (!metadata.containsKey("tool_choice")) { - toolChoice - .types() - .map(v -> v.type().toString().toLowerCase()) - .ifPresent(v -> metadata.put("tool_choice", v)); - } - if (!metadata.containsKey("tool_choice") && toolChoice.function().isPresent()) { - metadata.put("tool_choice", "function"); - } - }); + response._toolChoice().asKnown().ifPresent(toolChoice -> { + toolChoice + .options() + .flatMap(v -> v._value().asString()) + .ifPresent(v -> metadata.put("tool_choice", v)); + if (!metadata.containsKey("tool_choice")) { + toolChoice + .types() + .map(v -> v.type().toString().toLowerCase()) + .ifPresent(v -> metadata.put("tool_choice", v)); + } + if (!metadata.containsKey("tool_choice") && toolChoice.function().isPresent()) { + metadata.put("tool_choice", "function"); + } + }); response ._truncation() @@ -561,32 +549,24 @@ private void withResponse(AgentSpan span, Response response, boolean stream) { .ifPresent(v -> metadata.put("truncation", v)); Map textMap = new HashMap<>(); - response - ._text() - .asKnown() - .ifPresent( - textConfig -> { - textConfig - ._format() - .asKnown() - .ifPresent( - format -> { - Map formatMap = new HashMap<>(); - if (format.text().isPresent()) { - formatMap.put("type", "text"); - } else if (format.jsonSchema().isPresent()) { - formatMap.put("type", "json_schema"); - } else if (format.jsonObject().isPresent()) { - formatMap.put("type", "json_object"); - } - textMap.put("format", formatMap); - }); - textConfig - ._verbosity() - .asKnown() - .flatMap(verbosity -> verbosity._value().asString()) - .ifPresent(verbosity -> textMap.put("verbosity", verbosity)); - }); + response._text().asKnown().ifPresent(textConfig -> { + textConfig._format().asKnown().ifPresent(format -> { + Map formatMap = new HashMap<>(); + if (format.text().isPresent()) { + formatMap.put("type", "text"); + } else if (format.jsonSchema().isPresent()) { + formatMap.put("type", "json_schema"); + } else if (format.jsonObject().isPresent()) { + formatMap.put("type", "json_object"); + } + textMap.put("format", formatMap); + }); + textConfig + ._verbosity() + .asKnown() + .flatMap(verbosity -> verbosity._value().asString()) + .ifPresent(verbosity -> textMap.put("verbosity", verbosity)); + }); if (!textMap.isEmpty()) { metadata.put("text", textMap); } @@ -595,20 +575,14 @@ private void withResponse(AgentSpan span, Response response, boolean stream) { span.setTag(CommonTags.METADATA, metadata); - response - ._usage() - .asKnown() - .ifPresent( - usage -> { - span.setTag(CommonTags.INPUT_TOKENS, usage.inputTokens()); - span.setTag(CommonTags.OUTPUT_TOKENS, usage.outputTokens()); - span.setTag(CommonTags.TOTAL_TOKENS, usage.totalTokens()); - span.setTag( - CommonTags.CACHE_READ_INPUT_TOKENS, usage.inputTokensDetails().cachedTokens()); - span.setTag( - CommonTags.REASONING_OUTPUT_TOKENS, - usage.outputTokensDetails().reasoningTokens()); - }); + response._usage().asKnown().ifPresent(usage -> { + span.setTag(CommonTags.INPUT_TOKENS, usage.inputTokens()); + span.setTag(CommonTags.OUTPUT_TOKENS, usage.outputTokens()); + span.setTag(CommonTags.TOTAL_TOKENS, usage.totalTokens()); + span.setTag(CommonTags.CACHE_READ_INPUT_TOKENS, usage.inputTokensDetails().cachedTokens()); + span.setTag( + CommonTags.REASONING_OUTPUT_TOKENS, usage.outputTokensDetails().reasoningTokens()); + }); } private void enrichInputWithPromptTracking(AgentSpan span, Response response) { @@ -689,19 +663,14 @@ private List extractInputMessagesForPromptTracking( AgentSpan span, Response response) { List messages = new ArrayList<>(); - response - ._instructions() - .asKnown() - .ifPresent( - instructions -> { - for (ResponseInputItem item : - instructions.inputItemList().orElse(Collections.emptyList())) { - LLMObs.LLMMessage message = extractInputItemMessage(item); - if (message != null) { - messages.add(message); - } - } - }); + response._instructions().asKnown().ifPresent(instructions -> { + for (ResponseInputItem item : instructions.inputItemList().orElse(Collections.emptyList())) { + LLMObs.LLMMessage message = extractInputItemMessage(item); + if (message != null) { + messages.add(message); + } + } + }); return messages; } @@ -900,13 +869,12 @@ private List extractResponseOutputMessages(List !summary.isEmpty()) - .flatMap(summary -> summary.get(0)._text().asString()) - .orElse(null); + String summaryText = reasoning + ._summary() + .asKnown() + .filter(summary -> !summary.isEmpty()) + .flatMap(summary -> summary.get(0)._text().asString()) + .orElse(null); writer.name("summary"); if (summaryText != null && !summaryText.isEmpty()) { writer.value(summaryText); diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceAsyncInstrumentation.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceAsyncInstrumentation.java index c4c5171b221..0e4f3bb821a 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceAsyncInstrumentation.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceAsyncInstrumentation.java @@ -100,9 +100,8 @@ public static void exit( if (err != null || future == null) { DECORATE.finishSpan(span, err); } else { - future = - HttpStreamResponseWrapper.wrapFuture( - future, span, ResponseDecorator.DECORATE::withResponseStreamEvents); + future = HttpStreamResponseWrapper.wrapFuture( + future, span, ResponseDecorator.DECORATE::withResponseStreamEvents); } scope.close(); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceInstrumentation.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceInstrumentation.java index 73905000a14..c99405b1314 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceInstrumentation.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/ResponseServiceInstrumentation.java @@ -99,9 +99,8 @@ public static void exit( if (err != null || response == null) { DECORATE.finishSpan(span, err); } else { - response = - HttpStreamResponseWrapper.wrap( - response, span, ResponseDecorator.DECORATE::withResponseStreamEvents); + response = HttpStreamResponseWrapper.wrap( + response, span, ResponseDecorator.DECORATE::withResponseStreamEvents); } scope.close(); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/JsonValueUtilsTest.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/JsonValueUtilsTest.java index 21713649956..593538e7bcf 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/JsonValueUtilsTest.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/JsonValueUtilsTest.java @@ -96,9 +96,8 @@ void testFlatArray() { @Test void testNestedArray() { - Object result = - JsonValueUtils.jsonValueToObject( - JsonValue.from(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4)))); + Object result = JsonValueUtils.jsonValueToObject( + JsonValue.from(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4)))); assertInstanceOf(List.class, result); @SuppressWarnings("unchecked") diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/LlmObsContextPropagationForkedTest.java b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/LlmObsContextPropagationForkedTest.java index 66d4f6aa285..ce6f7170f3f 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/LlmObsContextPropagationForkedTest.java +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/test/java/datadog/trace/instrumentation/openai_java/LlmObsContextPropagationForkedTest.java @@ -39,24 +39,20 @@ abstract class AbstractLlmObsOpenAiForkedTest extends AbstractInstrumentationTes @BeforeAll static void setupMockOpenAi() throws IOException { mockServer = HttpServer.create(new InetSocketAddress("localhost", 0), 0); - mockServer.createContext( - "/v1/", - exchange -> { - exchange.sendResponseHeaders(200, -1); - exchange.close(); - }); + mockServer.createContext("/v1/", exchange -> { + exchange.sendResponseHeaders(200, -1); + exchange.close(); + }); mockServer.start(); - openAiClient = - OpenAIOkHttpClient.builder() - .baseUrl( - "http://" - + mockServer.getAddress().getHostString() - + ":" - + mockServer.getAddress().getPort() - + "/v1") - .credential(BearerTokenCredential.create("")) - .build(); + openAiClient = OpenAIOkHttpClient.builder() + .baseUrl("http://" + + mockServer.getAddress().getHostString() + + ":" + + mockServer.getAddress().getPort() + + "/v1") + .credential(BearerTokenCredential.create("")) + .build(); } @AfterAll @@ -172,15 +168,14 @@ void openAiRequestSpanInheritsAgentVersionFromActiveContext() throws Exception { void openAiRequestSpanInheritsDroppedSamplingDecisionFromActiveContext() throws Exception { AgentSpan parentSpan = AgentTracer.startSpan("test", "parent"); try (ContextScope ignored1 = AgentTracer.activateSpan(parentSpan)) { - try (ContextScope ignored2 = - LLMObsContext.attach( - parentSpan.spanContext(), - null, - null, - "0.25", - LLMObsContext.SAMPLING_DECISION_DROPPED, - null, - null)) { + try (ContextScope ignored2 = LLMObsContext.attach( + parentSpan.spanContext(), + null, + null, + "0.25", + LLMObsContext.SAMPLING_DECISION_DROPPED, + null, + null)) { try { openAiClient.chat().completions().create(buildMinimalChatParams()); } catch (Exception ignored) { @@ -203,15 +198,14 @@ void openAiRequestSpanInheritsDroppedSamplingDecisionFromActiveContext() throws void openAiRequestSpanInheritsRetainedSamplingDecisionFromActiveContext() throws Exception { AgentSpan parentSpan = AgentTracer.startSpan("test", "parent"); try (ContextScope ignored1 = AgentTracer.activateSpan(parentSpan)) { - try (ContextScope ignored2 = - LLMObsContext.attach( - parentSpan.spanContext(), - null, - null, - "1", - LLMObsContext.SAMPLING_DECISION_SAMPLED, - null, - null)) { + try (ContextScope ignored2 = LLMObsContext.attach( + parentSpan.spanContext(), + null, + null, + "1", + LLMObsContext.SAMPLING_DECISION_SAMPLED, + null, + null)) { try { openAiClient.chat().completions().create(buildMinimalChatParams()); } catch (Exception ignored) { @@ -255,15 +249,14 @@ void openAiRequestSpanInheritsNothingFromStaleCrossTraceContext() throws Excepti // but its span is never made the active tracer span, so the openai.request call below starts // a brand-new trace and the trace-consistency gate in OpenAiDecorator must skip inheritance. AgentSpan staleParent = AgentTracer.startSpan("test", "stale-parent"); - try (ContextScope ignored = - LLMObsContext.attach( - staleParent.spanContext(), - "stale-session", - "stale-version", - "0.25", - LLMObsContext.SAMPLING_DECISION_DROPPED, - "stale-agent-span-id", - "stale-agent")) { + try (ContextScope ignored = LLMObsContext.attach( + staleParent.spanContext(), + "stale-session", + "stale-version", + "0.25", + LLMObsContext.SAMPLING_DECISION_DROPPED, + "stale-agent-span-id", + "stale-agent")) { try { openAiClient.chat().completions().create(buildMinimalChatParams()); } catch (Exception ignored2) { diff --git a/dd-java-agent/instrumentation/opensearch/opensearch-common/src/main/java/datadog/trace/instrumentation/opensearch/OpensearchRestClientDecorator.java b/dd-java-agent/instrumentation/opensearch/opensearch-common/src/main/java/datadog/trace/instrumentation/opensearch/OpensearchRestClientDecorator.java index 95ffcfa059c..d06f520e53a 100644 --- a/dd-java-agent/instrumentation/opensearch/opensearch-common/src/main/java/datadog/trace/instrumentation/opensearch/OpensearchRestClientDecorator.java +++ b/dd-java-agent/instrumentation/opensearch/opensearch-common/src/main/java/datadog/trace/instrumentation/opensearch/OpensearchRestClientDecorator.java @@ -23,9 +23,8 @@ public class OpensearchRestClientDecorator extends DBTypeProcessingDatabaseClien private static final String SERVICE_NAME = SpanNaming.instance().namingSchema().database().service("opensearch"); - public static final CharSequence OPERATION_NAME = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().database().operation("opensearch.rest")); + public static final CharSequence OPERATION_NAME = UTF8BytesString.create( + SpanNaming.instance().namingSchema().database().operation("opensearch.rest")); public static final CharSequence OPENSEARCH_JAVA = UTF8BytesString.create("opensearch-java"); public static final OpensearchRestClientDecorator DECORATE = new OpensearchRestClientDecorator(); diff --git a/dd-java-agent/instrumentation/opensearch/opensearch-transport-1.0/src/main/java/datadog/trace/instrumentation/opensearch/TransportActionListener.java b/dd-java-agent/instrumentation/opensearch/opensearch-transport-1.0/src/main/java/datadog/trace/instrumentation/opensearch/TransportActionListener.java index 2b2c2d44217..2a680434a26 100644 --- a/dd-java-agent/instrumentation/opensearch/opensearch-transport-1.0/src/main/java/datadog/trace/instrumentation/opensearch/TransportActionListener.java +++ b/dd-java-agent/instrumentation/opensearch/opensearch-transport-1.0/src/main/java/datadog/trace/instrumentation/opensearch/TransportActionListener.java @@ -68,7 +68,8 @@ public void onResponse(final T response) { } if (response instanceof IndexResponse) { - span.setTag("opensearch.response.status", ((IndexResponse) response).status().getStatus()); + span.setTag( + "opensearch.response.status", ((IndexResponse) response).status().getStatus()); } if (response instanceof BulkShardResponse) { diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelContextPropagators.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelContextPropagators.java index ad6042d0f0e..867451cc998 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelContextPropagators.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelContextPropagators.java @@ -72,18 +72,17 @@ private static class OtelGetter implements AgentPropagation.ContextVisitor private static final String HAYSTACK_SPAN_ID_KEY = "Span-ID"; private static final String HAYSTACK_PARENT_ID_KEY = "Parent_ID"; - private static final List KEYS = - Arrays.asList( - DD_TRACE_ID_KEY, - DD_SPAN_ID_KEY, - DD_SAMPLING_PRIORITY_KEY, - DD_ORIGIN_KEY, - B3_TRACE_ID_KEY, - B3_SPAN_ID_KEY, - B3_SAMPLING_PRIORITY_KEY, - HAYSTACK_TRACE_ID_KEY, - HAYSTACK_SPAN_ID_KEY, - HAYSTACK_PARENT_ID_KEY); + private static final List KEYS = Arrays.asList( + DD_TRACE_ID_KEY, + DD_SPAN_ID_KEY, + DD_SAMPLING_PRIORITY_KEY, + DD_ORIGIN_KEY, + B3_TRACE_ID_KEY, + B3_SPAN_ID_KEY, + B3_SAMPLING_PRIORITY_KEY, + HAYSTACK_TRACE_ID_KEY, + HAYSTACK_SPAN_ID_KEY, + HAYSTACK_PARENT_ID_KEY); private final HttpTextFormat.Getter getter; diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java index 66590e18cc2..109b3098827 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java @@ -60,7 +60,7 @@ public void setAttribute(final String key, final AttributeValue value) { delegate.setTag(key, value.getBooleanValue()); break; default: - // Unsupported.... Ignoring. + // Unsupported.... Ignoring. } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpanContext.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpanContext.java index d2156bbfa96..02778e137ab 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpanContext.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpanContext.java @@ -8,7 +8,8 @@ import io.opentelemetry.trace.TraceState; public class OtelSpanContext extends SpanContext { - private static final TraceFlags FLAGS = TraceFlags.builder().setIsSampled(true).build(); + private static final TraceFlags FLAGS = + TraceFlags.builder().setIsSampled(true).build(); private final AgentSpanContext delegate; OtelSpanContext(final AgentSpanContext delegate) { diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java index 529ec13aa65..b29fba12e81 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java @@ -142,7 +142,7 @@ public Span.Builder setAttribute(final String key, final AttributeValue value) { delegate.withTag(key, value.getBooleanValue()); break; default: - // Unsupported.... Ignoring. + // Unsupported.... Ignoring. } return this; } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.27/src/test/java/opentelemetry127/logs/OpenTelemetryLogsTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.27/src/test/java/opentelemetry127/logs/OpenTelemetryLogsTest.java index 6c6996f3d0c..8bc5603cf1b 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.27/src/test/java/opentelemetry127/logs/OpenTelemetryLogsTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.27/src/test/java/opentelemetry127/logs/OpenTelemetryLogsTest.java @@ -115,14 +115,12 @@ void testMultipleScopes() { // logs are sorted by scope name, so all scope-a logs come before scope-b logs assertEquals(3, logsReader.logs.size()); - List scopeALogs = - logsReader.logs.stream() - .filter(l -> "scope-a".equals(l.scopeName)) - .collect(Collectors.toList()); - List scopeBLogs = - logsReader.logs.stream() - .filter(l -> "scope-b".equals(l.scopeName)) - .collect(Collectors.toList()); + List scopeALogs = logsReader.logs.stream() + .filter(l -> "scope-a".equals(l.scopeName)) + .collect(Collectors.toList()); + List scopeBLogs = logsReader.logs.stream() + .filter(l -> "scope-b".equals(l.scopeName)) + .collect(Collectors.toList()); assertEquals(2, scopeALogs.size()); assertEquals("a-1", scopeALogs.get(0).body); @@ -171,13 +169,12 @@ public void visitAttribute(int type, String key, Object value) { @Override public void visitLogRecord(OtlpLogRecord logRecord) { - logs.add( - new CapturedLog( - currentScopeName, - logRecord.severityNumber, - logRecord.severityText, - logRecord.body, - new HashMap<>(currentAttributes))); + logs.add(new CapturedLog( + currentScopeName, + logRecord.severityNumber, + logRecord.severityText, + logRecord.body, + new HashMap<>(currentAttributes))); currentAttributes.clear(); } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14ConventionsTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14ConventionsTest.java index 636df381731..8cdebf38b8e 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14ConventionsTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14ConventionsTest.java @@ -118,20 +118,17 @@ void testSpanNameConventions( List tagMatchers = new ArrayList<>(); tagMatchers.add(defaultTags()); tagMatchers.add(tag(SPAN_KIND, is(expectedSpanKindTag))); - attributes.forEach( - (key, value) -> { - if (!OPERATION_NAME_SPECIFIC_ATTRIBUTE.equals(key)) { - tagMatchers.add(tag(key, is(value))); - } - }); + attributes.forEach((key, value) -> { + if (!OPERATION_NAME_SPECIFIC_ATTRIBUTE.equals(key)) { + tagMatchers.add(tag(key, is(value))); + } + }); - assertTraces( - trace( - span() - .root() - .operationName(expectedOperationName) - .resourceName("some-name") - .tags(tagMatchers.toArray(new TagsMatcher[0])))); + assertTraces(trace(span() + .root() + .operationName(expectedOperationName) + .resourceName("some-name") + .tags(tagMatchers.toArray(new TagsMatcher[0])))); } static Stream testSpanSpecificTagsArguments() { @@ -180,18 +177,16 @@ void testSpanSpecificTags(boolean setInBuilder, boolean useAttributeKey) { } result.end(); - assertTraces( - trace( - span() - .root() - .operationName("my-operation") - .resourceName("/my-resource") - .serviceName("my-service") - .type("http") - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(DD_SVC_SRC, isManuallySet())))); + assertTraces(trace(span() + .root() + .operationName("my-operation") + .resourceName("/my-resource") + .serviceName("my-service") + .type("http") + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(DD_SVC_SRC, isManuallySet())))); } static Stream testSpanAnalyticsEventSpecificTagArguments() { @@ -248,9 +243,8 @@ void testSpanAnalyticsEventSpecificTag(boolean setInBuilder, Object value, int e if (value != null) { tagMatchers.add(tag(ANALYTICS_SAMPLE_RATE, is(expectedMetric))); } - assertTraces( - trace( - span().root().operationName("internal").tags(tagMatchers.toArray(new TagsMatcher[0])))); + assertTraces(trace( + span().root().operationName("internal").tags(tagMatchers.toArray(new TagsMatcher[0])))); } static Stream testSpanHttpResponseStatusCodeSpecificTagArguments() { @@ -307,9 +301,8 @@ void testSpanHttpResponseStatusCodeSpecificTag( tagMatchers.add(tag(HTTP_STATUS, is(expectedStatus))); } - assertTraces( - trace( - span().root().operationName("internal").tags(tagMatchers.toArray(new TagsMatcher[0])))); + assertTraces(trace( + span().root().operationName("internal").tags(tagMatchers.toArray(new TagsMatcher[0])))); } static Map attributes(String... keyValues) { diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14Test.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14Test.java index 998b41e9f27..313056a24f9 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14Test.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/OpenTelemetry14Test.java @@ -93,27 +93,24 @@ void testParentSpanUsingActiveSpan() { } parentSpan.end(); - assertTraces( - trace( - span().root().operationName("internal").resourceName("some-name"), - span().childOfPrevious().operationName("internal").resourceName("other-name"))); + assertTraces(trace( + span().root().operationName("internal").resourceName("some-name"), + span().childOfPrevious().operationName("internal").resourceName("other-name"))); } @Test void testParentSpanUsingReference() { Span parentSpan = this.otelTracer.spanBuilder("some-name").startSpan(); - Span childSpan = - this.otelTracer - .spanBuilder("other-name") - .setParent(Context.current().with(parentSpan)) - .startSpan(); + Span childSpan = this.otelTracer + .spanBuilder("other-name") + .setParent(Context.current().with(parentSpan)) + .startSpan(); childSpan.end(); parentSpan.end(); - assertTraces( - trace( - span().root().operationName("internal").resourceName("some-name"), - span().childOfPrevious().operationName("internal").resourceName("other-name"))); + assertTraces(trace( + span().root().operationName("internal").resourceName("some-name"), + span().childOfPrevious().operationName("internal").resourceName("other-name"))); } @Test @@ -131,21 +128,21 @@ void testParentSpanUsingPropagationData() { childSpan.end(); } - assertTraces( - trace( - span() - .traceId(DDTraceId.fromHex(traceId)) - .childOf(DDSpanId.fromHex(spanId)) - .operationName("internal") - .resourceName("some-name"))); + assertTraces(trace(span() + .traceId(DDTraceId.fromHex(traceId)) + .childOf(DDSpanId.fromHex(spanId)) + .operationName("internal") + .resourceName("some-name"))); } @Test void testParentSpanUsingInvalidReference() throws Exception { // Root context contains a SpanContext with TID/SID to 0 as current span Context invalidCurrentSpanContext = Context.root(); - Span childSpan = - this.otelTracer.spanBuilder("some-name").setParent(invalidCurrentSpanContext).startSpan(); + Span childSpan = this.otelTracer + .spanBuilder("some-name") + .setParent(invalidCurrentSpanContext) + .startSpan(); childSpan.end(); writer.waitForTraces(1); @@ -180,19 +177,13 @@ void testAddEvent() { result.addEvent("event"); result.end(); - String expectedEventTag = - "[" - + "{ \"time_unix_nano\": " - + timeSource.getCurrentTimeNanos() - + ", \"name\": \"event\" }" - + "]"; - assertTraces( - trace( - span() - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_EVENTS, isJson(expectedEventTag))))); + String expectedEventTag = "[" + "{ \"time_unix_nano\": " + timeSource.getCurrentTimeNanos() + + ", \"name\": \"event\" }" + "]"; + assertTraces(trace(span() + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_EVENTS, isJson(expectedEventTag))))); } static Stream testAddSingleEventArguments() { @@ -236,28 +227,25 @@ void testAddSingleEvent( Attributes attributes, String expectedAttributes) { SpanBuilder builder = this.otelTracer.spanBuilder("some-name"); - String expectedEventTag = - "[" - + "{ \"time_unix_nano\": " - + unit.toNanos(timestamp) - + ", \"name\": \"" - + name - + "\"" - + (expectedAttributes == null ? "" : ", \"attributes\": " + expectedAttributes) - + " }" - + "]"; + String expectedEventTag = "[" + + "{ \"time_unix_nano\": " + + unit.toNanos(timestamp) + + ", \"name\": \"" + + name + + "\"" + + (expectedAttributes == null ? "" : ", \"attributes\": " + expectedAttributes) + + " }" + + "]"; Span result = builder.startSpan(); result.addEvent(name, attributes, timestamp, unit); result.end(); - assertTraces( - trace( - span() - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_EVENTS, isJson(expectedEventTag))))); + assertTraces(trace(span() + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_EVENTS, isJson(expectedEventTag))))); } @Test @@ -273,22 +261,19 @@ void testAddMultipleSpanEvents() { NANOSECONDS); result.end(); - String expectedEventTag = - "[" - + "{ \"time_unix_nano\": " - + TIME_NANO - + ", \"name\": \"event1\" }," - + "{ \"time_unix_nano\": " - + TIME_NANO - + ", \"name\": \"event2\", \"attributes\": {\"string-key\": \"string-value\"} }" - + "]"; - assertTraces( - trace( - span() - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_EVENTS, isJson(expectedEventTag))))); + String expectedEventTag = "[" + + "{ \"time_unix_nano\": " + + TIME_NANO + + ", \"name\": \"event1\" }," + + "{ \"time_unix_nano\": " + + TIME_NANO + + ", \"name\": \"event2\", \"attributes\": {\"string-key\": \"string-value\"} }" + + "]"; + assertTraces(trace(span() + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_EVENTS, isJson(expectedEventTag))))); } @Test @@ -302,19 +287,17 @@ void testConcurrentAddEvents() throws Exception { CountDownLatch start = new CountDownLatch(1); List threads = new ArrayList<>(); for (int t = 0; t < threadCount; t++) { - Thread thread = - new Thread( - () -> { - try { - start.await(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - for (int i = 0; i < eventsPerThread; i++) { - span.addEvent("event"); - } - }); + Thread thread = new Thread(() -> { + try { + start.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + for (int i = 0; i < eventsPerThread; i++) { + span.addEvent("event"); + } + }); thread.start(); threads.add(thread); } @@ -337,32 +320,29 @@ void testConcurrentAddEvents() throws Exception { void testSimpleSpanLinks() { String traceId = "1234567890abcdef1234567890abcdef"; String spanId = "fedcba0987654321"; - TraceState traceState = TraceState.builder().put("string-key", "string-value").build(); - - String expectedLinksTag = - "[" - + "{ \"trace_id\": \"" - + traceId - + "\", \"span_id\": \"" - + spanId - + "\", \"flags\": 1, \"tracestate\": \"string-key=string-value\" }" - + "]"; - - Span span = - this.otelTracer - .spanBuilder("some-name") - .addLink(SpanContext.getInvalid()) - .addLink(SpanContext.create(traceId, spanId, TraceFlags.getSampled(), traceState)) - .startSpan(); + TraceState traceState = + TraceState.builder().put("string-key", "string-value").build(); + + String expectedLinksTag = "[" + + "{ \"trace_id\": \"" + + traceId + + "\", \"span_id\": \"" + + spanId + + "\", \"flags\": 1, \"tracestate\": \"string-key=string-value\" }" + + "]"; + + Span span = this.otelTracer + .spanBuilder("some-name") + .addLink(SpanContext.getInvalid()) + .addLink(SpanContext.create(traceId, spanId, TraceFlags.getSampled(), traceState)) + .startSpan(); span.end(); - assertTraces( - trace( - span() - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_LINKS, isJson(expectedLinksTag))))); + assertTraces(trace(span() + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_LINKS, isJson(expectedLinksTag))))); } @Test @@ -373,27 +353,25 @@ void testMultipleSpanLinks() { for (int i = 0; i <= 9; i++) { String traceId = "1234567890abcdef1234567890abcde" + i; String spanId = "fedcba098765432" + i; - TraceState traceState = TraceState.builder().put("string-key", "string-value" + i).build(); + TraceState traceState = + TraceState.builder().put("string-key", "string-value" + i).build(); spanBuilder.addLink(SpanContext.create(traceId, spanId, TraceFlags.getSampled(), traceState)); - expectedLinks.add( - "{ \"trace_id\": \"" - + traceId - + "\", \"span_id\": \"" - + spanId - + "\", \"flags\": 1, \"tracestate\": \"string-key=string-value" - + i - + "\" }"); + expectedLinks.add("{ \"trace_id\": \"" + + traceId + + "\", \"span_id\": \"" + + spanId + + "\", \"flags\": 1, \"tracestate\": \"string-key=string-value" + + i + + "\" }"); } spanBuilder.startSpan().end(); String expectedLinksTag = "[" + join(",", expectedLinks) + "]"; - assertTraces( - trace( - span() - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_LINKS, isJson(expectedLinksTag))))); + assertTraces(trace(span() + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_LINKS, isJson(expectedLinksTag))))); } static Stream testSpanLinkAttributesArguments() { @@ -425,34 +403,30 @@ static Stream testSpanLinkAttributesArguments() { void testSpanLinkAttributes(String scenario, Attributes attributes, String expectedAttributes) { String traceId = "1234567890abcdef1234567890abcdef"; String spanId = "fedcba0987654321"; - TraceState traceState = TraceState.builder().put("string-key", "string-value").build(); - Span span = - this.otelTracer - .spanBuilder("some-name") - .addLink( - SpanContext.create(traceId, spanId, TraceFlags.getSampled(), traceState), - attributes) - .startSpan(); + TraceState traceState = + TraceState.builder().put("string-key", "string-value").build(); + Span span = this.otelTracer + .spanBuilder("some-name") + .addLink( + SpanContext.create(traceId, spanId, TraceFlags.getSampled(), traceState), attributes) + .startSpan(); span.end(); - String expectedLinksTag = - "[" - + "{ \"trace_id\": \"" - + traceId - + "\", \"span_id\": \"" - + spanId - + "\", \"flags\": 1, \"tracestate\": \"string-key=string-value\"" - + (expectedAttributes == null ? "" : ", \"attributes\": " + expectedAttributes) - + " }" - + "]"; - - assertTraces( - trace( - span() - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_LINKS, isJson(expectedLinksTag))))); + String expectedLinksTag = "[" + + "{ \"trace_id\": \"" + + traceId + + "\", \"span_id\": \"" + + spanId + + "\", \"flags\": 1, \"tracestate\": \"string-key=string-value\"" + + (expectedAttributes == null ? "" : ", \"attributes\": " + expectedAttributes) + + " }" + + "]"; + + assertTraces(trace(span() + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_LINKS, isJson(expectedLinksTag))))); } static Stream testSpanLinksTraceStateArguments() { @@ -478,33 +452,29 @@ void testSpanLinksTraceState(String scenario, TraceState traceState, String expe String traceId = "1234567890abcdef1234567890abcdef"; String spanId = "fedcba0987654321"; - Span span = - this.otelTracer - .spanBuilder("some-name") - .addLink(SpanContext.create(traceId, spanId, TraceFlags.getSampled(), traceState)) - .startSpan(); + Span span = this.otelTracer + .spanBuilder("some-name") + .addLink(SpanContext.create(traceId, spanId, TraceFlags.getSampled(), traceState)) + .startSpan(); span.end(); String expectedTraceStateJson = expectedTraceState == null ? "" : ", \"tracestate\": \"" + expectedTraceState + "\""; - String expectedLinksTag = - "[" - + "{ \"trace_id\": \"" - + traceId - + "\", \"span_id\": \"" - + spanId - + "\", \"flags\": 1" - + expectedTraceStateJson - + " }" - + "]"; - - assertTraces( - trace( - span() - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_LINKS, isJson(expectedLinksTag))))); + String expectedLinksTag = "[" + + "{ \"trace_id\": \"" + + traceId + + "\", \"span_id\": \"" + + spanId + + "\", \"flags\": 1" + + expectedTraceStateJson + + " }" + + "]"; + + assertTraces(trace(span() + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_LINKS, isJson(expectedLinksTag))))); } static Stream testSpanAttributesArguments() { @@ -568,63 +538,59 @@ void testSpanAttributes(String scenario, boolean tagBuilder, boolean tagSpan) { TagsMatcher[] tagsMatchers; if (tagSpan) { - tagsMatchers = - new TagsMatcher[] { - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag("string", is("b")), - tag("empty_string", is("")), - tag("number", is(2L)), - tag("boolean", is(false)), - tag("empty-string-attribute", is("")), - tag("string-array.0", is("d")), - tag("string-array.1", is("e")), - tag("string-array.2", is("f")), - tag("boolean-array.0", is(false)), - tag("boolean-array.1", is(true)), - tag("long-array.0", is(5L)), - tag("long-array.1", is(6L)), - tag("long-array.2", is(7L)), - tag("long-array.3", is(8L)), - tag("double-array.0", is(2.34D)), - tag("double-array.1", is(5.67D)), - tag("empty-array", is("")) - }; + tagsMatchers = new TagsMatcher[] { + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag("string", is("b")), + tag("empty_string", is("")), + tag("number", is(2L)), + tag("boolean", is(false)), + tag("empty-string-attribute", is("")), + tag("string-array.0", is("d")), + tag("string-array.1", is("e")), + tag("string-array.2", is("f")), + tag("boolean-array.0", is(false)), + tag("boolean-array.1", is(true)), + tag("long-array.0", is(5L)), + tag("long-array.1", is(6L)), + tag("long-array.2", is(7L)), + tag("long-array.3", is(8L)), + tag("double-array.0", is(2.34D)), + tag("double-array.1", is(5.67D)), + tag("empty-array", is("")) + }; } else if (tagBuilder) { - tagsMatchers = - new TagsMatcher[] { - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag("string", is("a")), - tag("empty_string", is("")), - tag("number", is(1L)), - tag("boolean", is(true)), - tag("empty-string-attribute", is("")), - tag("string-array.0", is("a")), - tag("string-array.1", is("b")), - tag("string-array.2", is("c")), - tag("boolean-array.0", is(true)), - tag("boolean-array.1", is(false)), - tag("long-array.0", is(1L)), - tag("long-array.1", is(2L)), - tag("long-array.2", is(3L)), - tag("long-array.3", is(4L)), - tag("double-array.0", is(1.23D)), - tag("double-array.1", is(4.56D)), - tag("empty-array", is("")) - }; + tagsMatchers = new TagsMatcher[] { + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag("string", is("a")), + tag("empty_string", is("")), + tag("number", is(1L)), + tag("boolean", is(true)), + tag("empty-string-attribute", is("")), + tag("string-array.0", is("a")), + tag("string-array.1", is("b")), + tag("string-array.2", is("c")), + tag("boolean-array.0", is(true)), + tag("boolean-array.1", is(false)), + tag("long-array.0", is(1L)), + tag("long-array.1", is(2L)), + tag("long-array.2", is(3L)), + tag("long-array.3", is(4L)), + tag("double-array.0", is(1.23D)), + tag("double-array.1", is(4.56D)), + tag("empty-array", is("")) + }; } else { tagsMatchers = new TagsMatcher[] {defaultTags(), tag(SPAN_KIND, is(SPAN_KIND_INTERNAL))}; } - assertTraces( - trace( - span() - .root() - .operationName("internal") - .resourceName(expectedResource) - .error(false) - .tags(tagsMatchers))); + assertTraces(trace(span() + .root() + .operationName("internal") + .resourceName(expectedResource) + .error(false) + .tags(tagsMatchers))); } @Test @@ -649,7 +615,11 @@ static Stream testSpanKindsArguments() { @ParameterizedTest(name = "[{index}] {0}") @MethodSource("testSpanKindsArguments") void testSpanKinds(SpanKind otelSpanKind, String tagSpanKind) { - this.otelTracer.spanBuilder("some-name").setSpanKind(otelSpanKind).startSpan().end(); + this.otelTracer + .spanBuilder("some-name") + .setSpanKind(otelSpanKind) + .startSpan() + .end(); assertTraces(trace(span().tags(defaultTags(), tag(SPAN_KIND, is(tagSpanKind))))); } @@ -660,17 +630,15 @@ void testSpanErrorStatus() { result.setStatus(ERROR, "some-error"); result.end(); - assertTraces( - trace( - span() - .root() - .operationName("internal") - .resourceName("some-name") - .error(true) - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(ERROR_MSG, is("some-error"))))); + assertTraces(trace(span() + .root() + .operationName("internal") + .resourceName("some-name") + .error(true) + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(ERROR_MSG, is("some-error"))))); } @Test @@ -700,14 +668,12 @@ void testSpanStatusTransition() { result.end(); - assertTraces( - trace( - span() - .root() - .operationName("internal") - .resourceName("some-name") - .error(false) - .tags(defaultTags(), tag(SPAN_KIND, is(SPAN_KIND_INTERNAL))))); + assertTraces(trace(span() + .root() + .operationName("internal") + .resourceName("some-name") + .error(false) + .tags(defaultTags(), tag(SPAN_KIND, is(SPAN_KIND_INTERNAL))))); } static Stream testSpanRecordExceptionArguments() { @@ -773,44 +739,41 @@ void testSpanRecordException( result.end(); String errorMessage = overriddenMessage != null ? overriddenMessage : exception.getMessage(); - String errorType = overriddenType != null ? overriddenType : exception.getClass().getName(); + String errorType = + overriddenType != null ? overriddenType : exception.getClass().getName(); String errorStackTrace = overriddenStacktrace != null ? overriddenStacktrace : stringifyErrorStack(exception); - String expectedAttributes = - "{" - + "\"exception.message\": \"" - + errorMessage - + "\", \"exception.type\": \"" - + errorType - + "\", \"exception.stacktrace\": \"" - + errorStackTrace - + "\"" - + (extraJson != null ? extraJson : "") - + "}"; - - String expectedEventTag = - "[" - + "{ \"time_unix_nano\": " - + timeSource.getCurrentTimeNanos() - + ", \"name\": \"exception\", \"attributes\": " - + expectedAttributes - + " }" - + "]"; - - assertTraces( - trace( - span() - .root() - .operationName("internal") - .resourceName("some-name") - .error(false) - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_EVENTS, isJson(expectedEventTag)), - tag(ERROR_MSG, is(errorMessage)), - tag(ERROR_TYPE, is(errorType)), - tag(ERROR_STACK, is(errorStackTrace))))); + String expectedAttributes = "{" + + "\"exception.message\": \"" + + errorMessage + + "\", \"exception.type\": \"" + + errorType + + "\", \"exception.stacktrace\": \"" + + errorStackTrace + + "\"" + + (extraJson != null ? extraJson : "") + + "}"; + + String expectedEventTag = "[" + + "{ \"time_unix_nano\": " + + timeSource.getCurrentTimeNanos() + + ", \"name\": \"exception\", \"attributes\": " + + expectedAttributes + + " }" + + "]"; + + assertTraces(trace(span() + .root() + .operationName("internal") + .resourceName("some-name") + .error(false) + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_EVENTS, isJson(expectedEventTag)), + tag(ERROR_MSG, is(errorMessage)), + tag(ERROR_TYPE, is(errorType)), + tag(ERROR_STACK, is(errorStackTrace))))); } @Test @@ -823,20 +786,18 @@ void testSpanErrorReflectLastException() { span.recordException(lastException); span.end(); - assertTraces( - trace( - span() - .root() - .operationName("internal") - .resourceName("some-name") - .error(false) - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag(SPAN_EVENTS, any()), - tag(ERROR_MSG, is(lastException.getMessage())), - tag(ERROR_TYPE, is(lastException.getClass().getName())), - tag(ERROR_STACK, is(stringifyErrorStack(lastException)))))); + assertTraces(trace(span() + .root() + .operationName("internal") + .resourceName("some-name") + .error(false) + .tags( + defaultTags(), + tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), + tag(SPAN_EVENTS, any()), + tag(ERROR_MSG, is(lastException.getMessage())), + tag(ERROR_TYPE, is(lastException.getClass().getName())), + tag(ERROR_STACK, is(stringifyErrorStack(lastException)))))); } @Test @@ -870,17 +831,12 @@ void testSpanUpdateAfterEnd() { result.addEvent("event"); result.recordException(new Throwable()); - assertTraces( - trace( - span() - .root() - .operationName("internal") - .resourceName("some-name") - .error(true) - .tags( - defaultTags(), - tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), - tag("string", is("value"))))); + assertTraces(trace(span() + .root() + .operationName("internal") + .resourceName("some-name") + .error(true) + .tags(defaultTags(), tag(SPAN_KIND, is(SPAN_KIND_INTERNAL)), tag("string", is("value"))))); } private static DDSpan getDDSpan(Span span) { @@ -888,14 +844,13 @@ private static DDSpan getDDSpan(Span span) { } private static Matcher isJson(String expected) { - return Matchers.validates( - s -> { - try { - JSONAssert.assertEquals(expected, s, true); - return true; - } catch (JSONException e) { - return false; - } - }); + return Matchers.validates(s -> { + try { + JSONAssert.assertEquals(expected, s, true); + return true; + } catch (JSONException e) { + return false; + } + }); } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/ContextTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/ContextTest.java index d5fd8751df8..3d1468e661d 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/ContextTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/ContextTest.java @@ -184,7 +184,8 @@ void testMixingManualAndOtelInstrumentation() { Span current = Span.current(); assertEquals( - DDSpanId.toHexStringPadded(ddChildSpan.getSpanId()), current.getSpanContext().getSpanId()); + DDSpanId.toHexStringPadded(ddChildSpan.getSpanId()), + current.getSpanContext().getSpanId()); // Activate OTel grandchild span and verify DD active span Span otelGrandChildSpan = this.otelTracer.spanBuilder("another-name").startSpan(); @@ -205,11 +206,10 @@ void testMixingManualAndOtelInstrumentation() { otelParentScope.close(); otelParentSpan.end(); - assertTraces( - trace( - span().root().operationName("internal").resourceName("some-name"), - span().childOfPrevious().operationName("other-name"), - span().childOfPrevious().operationName("internal").resourceName("another-name"))); + assertTraces(trace( + span().root().operationName("internal").resourceName("some-name"), + span().childOfPrevious().operationName("other-name"), + span().childOfPrevious().operationName("internal").resourceName("another-name"))); } @DisplayName("test context spans retrieval") @@ -284,13 +284,12 @@ void testBaggageCurrentMakeCurrent() { assertNull(otelBaggageFromContextOrNull); // After making OTel baggage current - Scope otelScope = - Baggage.builder() - .put("foo", "otel_value_to_be_replaced") - .put("FOO", "OTEL_UNTOUCHED") - .put("remove_me_key", "otel_remove_me_value") - .build() - .makeCurrent(); + Scope otelScope = Baggage.builder() + .put("foo", "otel_value_to_be_replaced") + .put("FOO", "OTEL_UNTOUCHED") + .put("remove_me_key", "otel_remove_me_value") + .build() + .makeCurrent(); otelBaggage = Baggage.current(); otelBaggageFromContext = Baggage.fromContext(Context.current()); otelBaggageFromContextOrNull = Baggage.fromContextOrNull(Context.current()); diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/AbstractPropagatorTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/AbstractPropagatorTest.java index cdd36e4a735..aa1a8eb6ac5 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/AbstractPropagatorTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/AbstractPropagatorTest.java @@ -48,13 +48,11 @@ void testContextExtractionAndInjection( } localSpan.end(); - assertTraces( - trace( - span() - .traceId((DDTraceId) expectedTraceId(traceId)) - .childOf(DDSpanId.fromHex(spanId)) - .operationName("internal") - .resourceName("some-name"))); + assertTraces(trace(span() + .traceId((DDTraceId) expectedTraceId(traceId)) + .childOf(DDSpanId.fromHex(spanId)) + .operationName("internal") + .resourceName("some-name"))); assertEquals(expectedSampled, spanSampled); assertInjectedHeaders(injectedHeaders, traceId, localSpanId, sampling); } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/W3cPropagatorTracestateTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/W3cPropagatorTracestateTest.java index c7e4123f81f..d987f768247 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/W3cPropagatorTracestateTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/java/opentelemetry14/context/propagation/W3cPropagatorTracestateTest.java @@ -28,10 +28,9 @@ void testTracestatePropagation(String tracestate) { headers.put("traceparent", "00-11111111111111111111111111111111-2222222222222222-00"); headers.put("tracestate", tracestate); - String[] members = - Arrays.stream(tracestate.split(",")) - .filter(member -> !member.startsWith("dd=")) - .toArray(String[]::new); + String[] members = Arrays.stream(tracestate.split(",")) + .filter(member -> !member.startsWith("dd=")) + .toArray(String[]::new); Context context = propagator.extract(Context.root(), headers, TextMap.INSTANCE); assertNotEquals(Context.root(), context); diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsForkedTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsForkedTest.java index e4beefeab46..983a91deab8 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsForkedTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsForkedTest.java @@ -35,36 +35,34 @@ void registersOnlyStableMetricsWhenExperimentalDisabled() { Set names = collector.metricNames; - List expectedStableMetrics = - Arrays.asList( - "jvm.memory.used", - "jvm.memory.committed", - "jvm.memory.limit", - "jvm.memory.used_after_last_gc", - "jvm.thread.count", - "jvm.class.loaded", - "jvm.class.count", - "jvm.class.unloaded", - "jvm.cpu.time", - "jvm.cpu.count", - "jvm.cpu.recent_utilization", - "jvm.gc.duration"); + List expectedStableMetrics = Arrays.asList( + "jvm.memory.used", + "jvm.memory.committed", + "jvm.memory.limit", + "jvm.memory.used_after_last_gc", + "jvm.thread.count", + "jvm.class.loaded", + "jvm.class.count", + "jvm.class.unloaded", + "jvm.cpu.time", + "jvm.cpu.count", + "jvm.cpu.recent_utilization", + "jvm.gc.duration"); for (String metric : expectedStableMetrics) { assertTrue( names.contains(metric), "Expected stable metric '" + metric + "' not found. Got: " + new TreeSet<>(names)); } - List developmentMetrics = - Arrays.asList( - "jvm.memory.init", - "jvm.buffer.memory.used", - "jvm.buffer.memory.limit", - "jvm.buffer.count", - "jvm.system.cpu.utilization", - "jvm.system.cpu.load_1m", - "jvm.file_descriptor.count", - "jvm.file_descriptor.limit"); + List developmentMetrics = Arrays.asList( + "jvm.memory.init", + "jvm.buffer.memory.used", + "jvm.buffer.memory.limit", + "jvm.buffer.count", + "jvm.system.cpu.utilization", + "jvm.system.cpu.load_1m", + "jvm.file_descriptor.count", + "jvm.file_descriptor.limit"); for (String metric : developmentMetrics) { assertFalse( names.contains(metric), @@ -96,11 +94,9 @@ void jvmGcDurationDataPointsOmitGcCauseWhenExperimentalDisabled() throws Interru assertFalse(points.isEmpty(), "jvm.gc.duration should have at least one data point"); assertTrue( points.stream() - .allMatch( - p -> - p.attrs.containsKey("jvm.gc.name") - && p.attrs.containsKey("jvm.gc.action") - && !p.attrs.containsKey("jvm.gc.cause")), + .allMatch(p -> p.attrs.containsKey("jvm.gc.name") + && p.attrs.containsKey("jvm.gc.action") + && !p.attrs.containsKey("jvm.gc.cause")), "jvm.gc.duration data points must carry jvm.gc.name and jvm.gc.action, but not jvm.gc.cause" + " when experimental disabled"); } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsTest.java index 9aa86d9c5cc..538bc4b7417 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/JvmOtlpRuntimeMetricsTest.java @@ -55,26 +55,25 @@ void registersExpectedJvmMetrics() { MetricCollector collector = new MetricCollector(); OtelMetricRegistry.INSTANCE.collectMetrics(collector); - List expectedMetrics = - Arrays.asList( - "jvm.memory.used", - "jvm.memory.committed", - "jvm.memory.limit", - "jvm.memory.init", - "jvm.memory.used_after_last_gc", - "jvm.buffer.memory.used", - "jvm.buffer.memory.limit", - "jvm.buffer.count", - "jvm.thread.count", - "jvm.class.loaded", - "jvm.class.count", - "jvm.class.unloaded", - "jvm.cpu.time", - "jvm.cpu.count", - "jvm.cpu.recent_utilization", - "jvm.system.cpu.utilization", - "jvm.system.cpu.load_1m", - "jvm.gc.duration"); + List expectedMetrics = Arrays.asList( + "jvm.memory.used", + "jvm.memory.committed", + "jvm.memory.limit", + "jvm.memory.init", + "jvm.memory.used_after_last_gc", + "jvm.buffer.memory.used", + "jvm.buffer.memory.limit", + "jvm.buffer.count", + "jvm.thread.count", + "jvm.class.loaded", + "jvm.class.count", + "jvm.class.unloaded", + "jvm.cpu.time", + "jvm.cpu.count", + "jvm.cpu.recent_utilization", + "jvm.system.cpu.utilization", + "jvm.system.cpu.load_1m", + "jvm.gc.duration"); Set names = collector.metricNames; for (String metric : expectedMetrics) { @@ -97,10 +96,9 @@ void registersExpectedJvmMetrics() { assertEquals(expectedSize, names.size(), "Unexpected metric count: " + new TreeSet<>(names)); // No DD-proprietary names should be present - List ddNames = - names.stream() - .filter(n -> n.startsWith("jvm.heap_memory") || n.startsWith("jvm.thread_count")) - .collect(Collectors.toList()); + List ddNames = names.stream() + .filter(n -> n.startsWith("jvm.heap_memory") || n.startsWith("jvm.thread_count")) + .collect(Collectors.toList()); assertTrue(ddNames.isEmpty(), "DD-proprietary names leaked: " + ddNames); } @@ -121,14 +119,11 @@ void jvmMemoryUsedHeapValueIsPositive() { List points = collector.points.get("jvm.memory.used"); assertNotNull(points, "jvm.memory.used should have data points"); - DataPointEntry heapAggregate = - points.stream() - .filter( - p -> - "heap".equals(p.attrs.get("jvm.memory.type")) - && p.attrs.get("jvm.memory.pool.name") == null) - .findFirst() - .orElse(null); + DataPointEntry heapAggregate = points.stream() + .filter(p -> "heap".equals(p.attrs.get("jvm.memory.type")) + && p.attrs.get("jvm.memory.pool.name") == null) + .findFirst() + .orElse(null); assertNotNull(heapAggregate, "jvm.memory.used should have a heap aggregate data point"); assertTrue( heapAggregate.value.longValue() > 0, @@ -201,14 +196,11 @@ void jvmMemoryInitHeapAggregateIsPositive() { List points = collector.points.get("jvm.memory.init"); assertNotNull(points, "jvm.memory.init should have data points"); - DataPointEntry heapAggregate = - points.stream() - .filter( - p -> - "heap".equals(p.attrs.get("jvm.memory.type")) - && p.attrs.get("jvm.memory.pool.name") == null) - .findFirst() - .orElse(null); + DataPointEntry heapAggregate = points.stream() + .filter(p -> "heap".equals(p.attrs.get("jvm.memory.type")) + && p.attrs.get("jvm.memory.pool.name") == null) + .findFirst() + .orElse(null); assertNotNull(heapAggregate, "jvm.memory.init should have a heap aggregate data point"); assertTrue( heapAggregate.value.longValue() > 0, diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsCumulativeForkedTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsCumulativeForkedTest.java index f888fd990c2..d675f3da2b8 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsCumulativeForkedTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsCumulativeForkedTest.java @@ -47,10 +47,9 @@ void setUpMetrics() { @Test void testObservableLongCounterCumulative() { long[] absoluteValue = {0L}; - AutoCloseable observable = - meter - .counterBuilder("cumulative-observable-long-counter") - .buildWithCallback(m -> m.record(absoluteValue[0])); + AutoCloseable observable = meter + .counterBuilder("cumulative-observable-long-counter") + .buildWithCallback(m -> m.record(absoluteValue[0])); absoluteValue[0] = 5L; OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); @@ -73,11 +72,10 @@ void testObservableLongCounterCumulative() { @Test void testObservableDoubleCounterCumulative() { double[] absoluteValue = {0.0}; - AutoCloseable observable = - meter - .counterBuilder("cumulative-observable-double-counter") - .ofDoubles() - .buildWithCallback(m -> m.record(absoluteValue[0])); + AutoCloseable observable = meter + .counterBuilder("cumulative-observable-double-counter") + .ofDoubles() + .buildWithCallback(m -> m.record(absoluteValue[0])); absoluteValue[0] = 3.5; OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsTest.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsTest.java index a6332ae9267..c4c0a93fbc0 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsTest.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsTest.java @@ -61,7 +61,8 @@ void setUpMetrics() { @Test void testLongCounter() { - io.opentelemetry.api.metrics.LongCounter counter = meter.counterBuilder("long-counter").build(); + io.opentelemetry.api.metrics.LongCounter counter = + meter.counterBuilder("long-counter").build(); counter.add(1); counter.add(2, SOME_ATTRIBUTES); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); @@ -120,7 +121,8 @@ void testLongGauge() { @Test void testDoubleGauge() { - io.opentelemetry.api.metrics.DoubleGauge gauge = meter.gaugeBuilder("double-gauge").build(); + io.opentelemetry.api.metrics.DoubleGauge gauge = + meter.gaugeBuilder("double-gauge").build(); gauge.set(1.2); gauge.set(3.4, SOME_ATTRIBUTES); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); @@ -199,14 +201,12 @@ void testDoubleHistogramOverflow() { @Test void testObservableLongCounter() { - AutoCloseable observable = - meter - .counterBuilder("observable-long-counter") - .buildWithCallback( - m -> { - m.record(1); - m.record(2, SOME_ATTRIBUTES); - }); + AutoCloseable observable = meter + .counterBuilder("observable-long-counter") + .buildWithCallback(m -> { + m.record(1); + m.record(2, SOME_ATTRIBUTES); + }); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); assertEquals(1L, points.get("test:observable-long-counter")); @@ -224,15 +224,13 @@ void testObservableLongCounter() { @Test void testObservableDoubleCounter() { - AutoCloseable observable = - meter - .counterBuilder("observable-double-counter") - .ofDoubles() - .buildWithCallback( - m -> { - m.record(1.2); - m.record(3.4, SOME_ATTRIBUTES); - }); + AutoCloseable observable = meter + .counterBuilder("observable-double-counter") + .ofDoubles() + .buildWithCallback(m -> { + m.record(1.2); + m.record(3.4, SOME_ATTRIBUTES); + }); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); assertEquals(1.2, points.get("test:observable-double-counter")); @@ -250,14 +248,12 @@ void testObservableDoubleCounter() { @Test void testObservableLongUpDownCounter() { - AutoCloseable observable = - meter - .upDownCounterBuilder("observable-long-up-down-counter") - .buildWithCallback( - m -> { - m.record(1); - m.record(2, SOME_ATTRIBUTES); - }); + AutoCloseable observable = meter + .upDownCounterBuilder("observable-long-up-down-counter") + .buildWithCallback(m -> { + m.record(1); + m.record(2, SOME_ATTRIBUTES); + }); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); assertEquals(1L, points.get("test:observable-long-up-down-counter")); @@ -275,15 +271,13 @@ void testObservableLongUpDownCounter() { @Test void testObservableDoubleUpDownCounter() { - AutoCloseable observable = - meter - .upDownCounterBuilder("observable-double-up-down-counter") - .ofDoubles() - .buildWithCallback( - m -> { - m.record(1.2); - m.record(3.4, SOME_ATTRIBUTES); - }); + AutoCloseable observable = meter + .upDownCounterBuilder("observable-double-up-down-counter") + .ofDoubles() + .buildWithCallback(m -> { + m.record(1.2); + m.record(3.4, SOME_ATTRIBUTES); + }); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); assertEquals(1.2, points.get("test:observable-double-up-down-counter")); @@ -301,15 +295,13 @@ void testObservableDoubleUpDownCounter() { @Test void testObservableLongGauge() { - AutoCloseable observable = - meter - .gaugeBuilder("observable-long-gauge") - .ofLongs() - .buildWithCallback( - m -> { - m.record(1); - m.record(2, SOME_ATTRIBUTES); - }); + AutoCloseable observable = meter + .gaugeBuilder("observable-long-gauge") + .ofLongs() + .buildWithCallback(m -> { + m.record(1); + m.record(2, SOME_ATTRIBUTES); + }); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); assertEquals(1L, points.get("test:observable-long-gauge")); @@ -320,14 +312,12 @@ void testObservableLongGauge() { @Test void testObservableDoubleGauge() { - AutoCloseable observable = - meter - .gaugeBuilder("observable-double-gauge") - .buildWithCallback( - m -> { - m.record(1.2); - m.record(3.4, SOME_ATTRIBUTES); - }); + AutoCloseable observable = meter + .gaugeBuilder("observable-double-gauge") + .buildWithCallback(m -> { + m.record(1.2); + m.record(3.4, SOME_ATTRIBUTES); + }); OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); assertEquals(1.2, points.get("test:observable-double-gauge")); @@ -339,10 +329,9 @@ void testObservableDoubleGauge() { @Test void testObservableLongCounterDeltaWithChangingValues() { long[] absoluteValue = {0L}; - AutoCloseable observable = - meter - .counterBuilder("observable-long-counter-delta-changing") - .buildWithCallback(m -> m.record(absoluteValue[0])); + AutoCloseable observable = meter + .counterBuilder("observable-long-counter-delta-changing") + .buildWithCallback(m -> m.record(absoluteValue[0])); absoluteValue[0] = 5L; OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); @@ -365,11 +354,10 @@ void testObservableLongCounterDeltaWithChangingValues() { @Test void testObservableDoubleCounterDeltaWithChangingValues() { double[] absoluteValue = {0.0}; - AutoCloseable observable = - meter - .counterBuilder("observable-double-counter-delta-changing") - .ofDoubles() - .buildWithCallback(m -> m.record(absoluteValue[0])); + AutoCloseable observable = meter + .counterBuilder("observable-double-counter-delta-changing") + .ofDoubles() + .buildWithCallback(m -> m.record(absoluteValue[0])); absoluteValue[0] = 2.5; OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); @@ -392,10 +380,9 @@ void testObservableDoubleCounterDeltaWithChangingValues() { @Test void testObservableLongUpDownCounterReportsAbsoluteValue() { long[] absoluteValue = {0L}; - AutoCloseable observable = - meter - .upDownCounterBuilder("observable-long-up-down-counter-absolute") - .buildWithCallback(m -> m.record(absoluteValue[0])); + AutoCloseable observable = meter + .upDownCounterBuilder("observable-long-up-down-counter-absolute") + .buildWithCallback(m -> m.record(absoluteValue[0])); absoluteValue[0] = 10L; OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); @@ -419,11 +406,10 @@ void testObservableLongUpDownCounterReportsAbsoluteValue() { @Test void testObservableDoubleUpDownCounterReportsAbsoluteValue() { double[] absoluteValue = {0.0}; - AutoCloseable observable = - meter - .upDownCounterBuilder("observable-double-up-down-counter-absolute") - .ofDoubles() - .buildWithCallback(m -> m.record(absoluteValue[0])); + AutoCloseable observable = meter + .upDownCounterBuilder("observable-double-up-down-counter-absolute") + .ofDoubles() + .buildWithCallback(m -> m.record(absoluteValue[0])); absoluteValue[0] = 8.0; OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); @@ -446,54 +432,54 @@ void testBatchCallback() { meter.counterBuilder("double-counter-observer").ofDoubles().buildObserver(); ObservableLongMeasurement longUpDownCounterObserver = meter.upDownCounterBuilder("long-up-down-counter-observer").buildObserver(); - ObservableDoubleMeasurement doubleUpDownCounterObserver = - meter.upDownCounterBuilder("double-up-down-counter-observer").ofDoubles().buildObserver(); + ObservableDoubleMeasurement doubleUpDownCounterObserver = meter + .upDownCounterBuilder("double-up-down-counter-observer") + .ofDoubles() + .buildObserver(); ObservableLongMeasurement longGaugeObserver = meter.gaugeBuilder("long-gauge-observer").ofLongs().buildObserver(); ObservableDoubleMeasurement doubleGaugeObserver = meter.gaugeBuilder("double-gauge-observer").buildObserver(); - BatchCallback batchCallback = - meter.batchCallback( - () -> { - longCounterObserver.record(1); - longCounterObserver.record(10, SOME_ATTRIBUTES); - doubleCounterObserver.record(2.3); - doubleCounterObserver.record(20.3, SOME_ATTRIBUTES); - longUpDownCounterObserver.record(4); - longUpDownCounterObserver.record(40, SOME_ATTRIBUTES); - doubleUpDownCounterObserver.record(5.6); - doubleUpDownCounterObserver.record(50.6, SOME_ATTRIBUTES); - longGaugeObserver.record(7); - longGaugeObserver.record(70, SOME_ATTRIBUTES); - doubleGaugeObserver.record(8.9); - doubleGaugeObserver.record(80.9, SOME_ATTRIBUTES); - }, - longCounterObserver, - doubleCounterObserver, - longUpDownCounterObserver, - doubleUpDownCounterObserver, - longGaugeObserver, - doubleGaugeObserver); + BatchCallback batchCallback = meter.batchCallback( + () -> { + longCounterObserver.record(1); + longCounterObserver.record(10, SOME_ATTRIBUTES); + doubleCounterObserver.record(2.3); + doubleCounterObserver.record(20.3, SOME_ATTRIBUTES); + longUpDownCounterObserver.record(4); + longUpDownCounterObserver.record(40, SOME_ATTRIBUTES); + doubleUpDownCounterObserver.record(5.6); + doubleUpDownCounterObserver.record(50.6, SOME_ATTRIBUTES); + longGaugeObserver.record(7); + longGaugeObserver.record(70, SOME_ATTRIBUTES); + doubleGaugeObserver.record(8.9); + doubleGaugeObserver.record(80.9, SOME_ATTRIBUTES); + }, + longCounterObserver, + doubleCounterObserver, + longUpDownCounterObserver, + doubleUpDownCounterObserver, + longGaugeObserver, + doubleGaugeObserver); // this callback will have no effect because it doesn't declare any measurements - BatchCallback noopCallback = - meter.batchCallback( - () -> { - longCounterObserver.record(1000); - longCounterObserver.record(1000, SOME_ATTRIBUTES); - doubleCounterObserver.record(1000); - doubleCounterObserver.record(1000, SOME_ATTRIBUTES); - longUpDownCounterObserver.record(1000); - longUpDownCounterObserver.record(1000, SOME_ATTRIBUTES); - doubleUpDownCounterObserver.record(1000); - doubleUpDownCounterObserver.record(1000, SOME_ATTRIBUTES); - longGaugeObserver.record(1000); - longGaugeObserver.record(1000, SOME_ATTRIBUTES); - doubleGaugeObserver.record(1000); - doubleGaugeObserver.record(1000, SOME_ATTRIBUTES); - }, - (ObservableMeasurement) null); + BatchCallback noopCallback = meter.batchCallback( + () -> { + longCounterObserver.record(1000); + longCounterObserver.record(1000, SOME_ATTRIBUTES); + doubleCounterObserver.record(1000); + doubleCounterObserver.record(1000, SOME_ATTRIBUTES); + longUpDownCounterObserver.record(1000); + longUpDownCounterObserver.record(1000, SOME_ATTRIBUTES); + doubleUpDownCounterObserver.record(1000); + doubleUpDownCounterObserver.record(1000, SOME_ATTRIBUTES); + longGaugeObserver.record(1000); + longGaugeObserver.record(1000, SOME_ATTRIBUTES); + doubleGaugeObserver.record(1000); + doubleGaugeObserver.record(1000, SOME_ATTRIBUTES); + }, + (ObservableMeasurement) null); // first collect OtelMetricRegistry.INSTANCE.collectMetrics(meterReader); diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/java/annotatedsample/latest/TracedMethods.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/java/annotatedsample/latest/TracedMethods.java index 07f5cb02aab..999435b7500 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/java/annotatedsample/latest/TracedMethods.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/java/annotatedsample/latest/TracedMethods.java @@ -97,40 +97,36 @@ public String call() { @WithSpan public static CompletableFuture traceAsyncCompletableFuture(CountDownLatch latch) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - return "hello!"; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + return "hello!"; + }); } @WithSpan public static CompletableFuture traceAsyncFailingCompletableFuture( CountDownLatch latch, RuntimeException exception) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - throw exception; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + throw exception; + }); } @WithSpan public static CompletionStage traceAsyncCompletionStage(CountDownLatch latch) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - return "hello!"; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + return "hello!"; + }); } @WithSpan public static CompletionStage traceAsyncFailingCompletionStage( CountDownLatch latch, RuntimeException exception) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - throw exception; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + throw exception; + }); } @WithSpan diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java index de8c5ba30e9..1c3ca3bb5fb 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java @@ -52,11 +52,8 @@ public String[] helperClassNames() { public void methodAdvice(MethodTransformer transformer) { ElementMatcher.Junction annotatedMethodMatcher = isAnnotatedWith(named(hierarchyMarkerType())); - ElementMatcher.Junction annotatedParametersMatcher = - hasParameters( - whereAny( - isAnnotatedWith( - named("io.opentelemetry.instrumentation.annotations.SpanAttribute")))); + ElementMatcher.Junction annotatedParametersMatcher = hasParameters(whereAny( + isAnnotatedWith(named("io.opentelemetry.instrumentation.annotations.SpanAttribute")))); // Apply transformation without parameter capture transformer.applyAdvice( annotatedMethodMatcher.and(not(annotatedParametersMatcher)), diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/java/annotatedsample/TracedMethods.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/java/annotatedsample/TracedMethods.java index ff57b7051bf..63eccd48785 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/java/annotatedsample/TracedMethods.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/java/annotatedsample/TracedMethods.java @@ -98,40 +98,36 @@ public String call() { @WithSpan public static CompletableFuture traceAsyncCompletableFuture(CountDownLatch latch) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - return "hello!"; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + return "hello!"; + }); } @WithSpan public static CompletableFuture traceAsyncFailingCompletableFuture( CountDownLatch latch, RuntimeException exception) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - throw exception; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + throw exception; + }); } @WithSpan public static CompletionStage traceAsyncCompletionStage(CountDownLatch latch) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - return "hello!"; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + return "hello!"; + }); } @WithSpan public static CompletionStage traceAsyncFailingCompletionStage( CountDownLatch latch, RuntimeException exception) { - return CompletableFuture.supplyAsync( - () -> { - await(latch); - throw exception; - }); + return CompletableFuture.supplyAsync(() -> { + await(latch); + throw exception; + }); } @WithSpan diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.26/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/AddingSpanAttributesInstrumentation.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.26/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/AddingSpanAttributesInstrumentation.java index 2aa84eb8bd6..890f7b9384e 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.26/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/AddingSpanAttributesInstrumentation.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.26/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/AddingSpanAttributesInstrumentation.java @@ -51,11 +51,8 @@ public String[] helperClassNames() { public void methodAdvice(MethodTransformer transformer) { ElementMatcher.Junction annotatedMethodMatcher = isAnnotatedWith(named(hierarchyMarkerType())); - ElementMatcher.Junction annotatedParametersMatcher = - hasParameters( - whereAny( - isAnnotatedWith( - named("io.opentelemetry.instrumentation.annotations.SpanAttribute")))); + ElementMatcher.Junction annotatedParametersMatcher = hasParameters(whereAny( + isAnnotatedWith(named("io.opentelemetry.instrumentation.annotations.SpanAttribute")))); transformer.applyAdvice( annotatedMethodMatcher.and(annotatedParametersMatcher), this.packageName + ".AddingSpanAttributesAdvice"); diff --git a/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java b/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java index 32f62c86832..8c23662ca9d 100644 --- a/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java +++ b/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java @@ -62,9 +62,8 @@ public void inject(final SpanContext spanContext, final Format format, fi @Override public SpanContext extract(final Format format, final C carrier) { if (carrier instanceof TextMap) { - final AgentSpanContext tagContext = - extractContextAndGetSpanContext( - (TextMap) carrier, ContextVisitors.stringValuesEntrySet()); + final AgentSpanContext tagContext = extractContextAndGetSpanContext( + (TextMap) carrier, ContextVisitors.stringValuesEntrySet()); return converter.toSpanContext(tagContext); } else { diff --git a/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java b/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java index ba2ce8313c0..7ba8289c390 100644 --- a/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java +++ b/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java @@ -73,9 +73,8 @@ public void inject(final SpanContext spanContext, final Format format, fi @Override public SpanContext extract(final Format format, final C carrier) { if (carrier instanceof TextMapExtract) { - final AgentSpanContext tagContext = - extractContextAndGetSpanContext( - (TextMapExtract) carrier, ContextVisitors.stringValuesEntrySet()); + final AgentSpanContext tagContext = extractContextAndGetSpanContext( + (TextMapExtract) carrier, ContextVisitors.stringValuesEntrySet()); return converter.toSpanContext(tagContext); } else { diff --git a/dd-java-agent/instrumentation/osgi-4.3/src/main/java/datadog/trace/instrumentation/osgi43/BundleReferenceInstrumentation.java b/dd-java-agent/instrumentation/osgi-4.3/src/main/java/datadog/trace/instrumentation/osgi43/BundleReferenceInstrumentation.java index 583ed367801..0d2de2fde5e 100644 --- a/dd-java-agent/instrumentation/osgi-4.3/src/main/java/datadog/trace/instrumentation/osgi43/BundleReferenceInstrumentation.java +++ b/dd-java-agent/instrumentation/osgi-4.3/src/main/java/datadog/trace/instrumentation/osgi43/BundleReferenceInstrumentation.java @@ -65,13 +65,11 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("loadClass")) - .and( - takesArguments(1) + .and(takesArguments(1) + .and(takesArgument(0, String.class)) + .or(takesArguments(2) .and(takesArgument(0, String.class)) - .or( - takesArguments(2) - .and(takesArgument(0, String.class)) - .and(takesArgument(1, boolean.class)))), + .and(takesArgument(1, boolean.class)))), BundleReferenceInstrumentation.class.getName() + "$WidenLoadClassAdvice"); } diff --git a/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java index 2778831de22..d0778eaab28 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java @@ -62,9 +62,8 @@ public static Context enter( @Advice.Local("taskScope") ContextScope taskScope) { // do this before checkpointing, as the envelope's task scope may already be active - taskScope = - AdviceUtils.startTaskScope( - InstrumentationContext.get(Envelope.class, State.class), envelope); + taskScope = AdviceUtils.startTaskScope( + InstrumentationContext.get(Envelope.class, State.class), envelope); if (InstrumenterConfig.get().isLegacyContextManagerEnabled()) { // remember the currently active scope so we can roll back to this point diff --git a/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoRoutedActorCellInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoRoutedActorCellInstrumentation.java index a89eaea3892..dd38a204326 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoRoutedActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-concurrent-1.0/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoRoutedActorCellInstrumentation.java @@ -39,9 +39,8 @@ public Map contextStore() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() - .and( - named("sendMessage") - .and(takesArgument(0, named("org.apache.pekko.dispatch.Envelope")))), + .and(named("sendMessage") + .and(takesArgument(0, named("org.apache.pekko.dispatch.Envelope")))), getClass().getName() + "$SendMessageAdvice"); } diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java index 0578eda8aba..7418c712340 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java @@ -35,23 +35,22 @@ public Future apply(final HttpRequest request) { DatadogWrapperHelper.finishSpan(scope.context(), t); throw t; } - final Future wrapped = - futureResponse.transform( - new AbstractFunction1() { - @Override - public HttpResponse apply(final HttpResponse response) { - DatadogWrapperHelper.finishSpan(scope.context(), response); - return response; - } - }, - new AbstractFunction1() { - @Override - public Throwable apply(final Throwable t) { - DatadogWrapperHelper.finishSpan(scope.context(), t); - return t; - } - }, - executionContext); + final Future wrapped = futureResponse.transform( + new AbstractFunction1() { + @Override + public HttpResponse apply(final HttpResponse response) { + DatadogWrapperHelper.finishSpan(scope.context(), response); + return response; + } + }, + new AbstractFunction1() { + @Override + public Throwable apply(final Throwable t) { + DatadogWrapperHelper.finishSpan(scope.context(), t); + return t; + } + }, + executionContext); scope.close(); return wrapped; } diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java index 52075e732f9..deaa202eeac 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java @@ -58,121 +58,113 @@ public GraphStageLogic createLogic(final Attributes inheritedAttributes) throws final Queue scopes = new ArrayBlockingQueue<>(pipeliningLimit); // This is where the request comes in from the server and TCP layer - setHandler( - requestInlet, - new AbstractInHandler() { - @Override - public void onPush() throws Exception { - final HttpRequest request = grab(requestInlet); - final ContextScope scope = DatadogWrapperHelper.createSpan(request); - scopes.add(scope); - push(requestOutlet, request); - // Since we haven't instrumented the pekko stream state machine, we can't rely - // on spans and scopes being propagated during the push and pull of the - // element. Instead we let the scope leak intentionally here and clean it - // up when the user response comes back, or in the actor message processing - // instrumentation that drives this state machine. - } - - @Override - public void onUpstreamFinish() throws Exception { - // We will not receive any more requests from the server and TCP layer so stop - // sending them - complete(requestOutlet); - } - - @Override - public void onUpstreamFailure(final Throwable ex) throws Exception { - // We will not receive any more requests from the server and TCP layer so stop - // sending them - fail(requestOutlet, ex); - } - }); + setHandler(requestInlet, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + final HttpRequest request = grab(requestInlet); + final ContextScope scope = DatadogWrapperHelper.createSpan(request); + scopes.add(scope); + push(requestOutlet, request); + // Since we haven't instrumented the pekko stream state machine, we can't rely + // on spans and scopes being propagated during the push and pull of the + // element. Instead we let the scope leak intentionally here and clean it + // up when the user response comes back, or in the actor message processing + // instrumentation that drives this state machine. + } + + @Override + public void onUpstreamFinish() throws Exception { + // We will not receive any more requests from the server and TCP layer so stop + // sending them + complete(requestOutlet); + } + + @Override + public void onUpstreamFailure(final Throwable ex) throws Exception { + // We will not receive any more requests from the server and TCP layer so stop + // sending them + fail(requestOutlet, ex); + } + }); // This is where demand comes in from the user code - setHandler( - requestOutlet, - new AbstractOutHandler() { - @Override - public void onPull() throws Exception { - pull(requestInlet); - } - - @Override - public void onDownstreamFinish() throws Exception { - // We can not send out any more requests to the user code so stop receiving them - cancel(requestInlet); - } - }); + setHandler(requestOutlet, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + pull(requestInlet); + } + + @Override + public void onDownstreamFinish() throws Exception { + // We can not send out any more requests to the user code so stop receiving them + cancel(requestInlet); + } + }); // This is where the response comes back from the user code - setHandler( - responseInlet, - new AbstractInHandler() { - @Override - public void onPush() throws Exception { - final HttpResponse response = grab(responseInlet); - final ContextScope scope = scopes.poll(); - if (scope != null) { - DatadogWrapperHelper.finishSpan(scope.context(), response); - // Check if the active span matches the scope from when the request came in, - // and close it. If it's not, then it will be cleaned up actor message - // processing instrumentation that drives this state machine - AgentSpan activeSpan = activeSpan(); - AgentSpan span = fromContext(scope.context()); - if (activeSpan == span) { - scope.close(); - } - } - push(responseOutlet, response); + setHandler(responseInlet, new AbstractInHandler() { + @Override + public void onPush() throws Exception { + final HttpResponse response = grab(responseInlet); + final ContextScope scope = scopes.poll(); + if (scope != null) { + DatadogWrapperHelper.finishSpan(scope.context(), response); + // Check if the active span matches the scope from when the request came in, + // and close it. If it's not, then it will be cleaned up actor message + // processing instrumentation that drives this state machine + AgentSpan activeSpan = activeSpan(); + AgentSpan span = fromContext(scope.context()); + if (activeSpan == span) { + scope.close(); } - - @Override - public void onUpstreamFinish() throws Exception { - // We will not receive any more responses from the user code, so clean up any - // remaining spans - ContextScope scope = scopes.poll(); - while (scope != null) { - fromContext(scope.context()).finish(); - scope = scopes.poll(); - } - completeStage(); - } - - @Override - public void onUpstreamFailure(final Throwable ex) throws Exception { - ContextScope scope = scopes.poll(); - if (scope != null) { - // Mark the span as failed - DatadogWrapperHelper.finishSpan(scope.context(), ex); - } - // We will not receive any more responses from the user code, so clean up any - // remaining spans - scope = scopes.poll(); - while (scope != null) { - fromContext(scope.context()).finish(); - scope = scopes.poll(); - } - fail(responseOutlet, ex); - } - }); + } + push(responseOutlet, response); + } + + @Override + public void onUpstreamFinish() throws Exception { + // We will not receive any more responses from the user code, so clean up any + // remaining spans + ContextScope scope = scopes.poll(); + while (scope != null) { + fromContext(scope.context()).finish(); + scope = scopes.poll(); + } + completeStage(); + } + + @Override + public void onUpstreamFailure(final Throwable ex) throws Exception { + ContextScope scope = scopes.poll(); + if (scope != null) { + // Mark the span as failed + DatadogWrapperHelper.finishSpan(scope.context(), ex); + } + // We will not receive any more responses from the user code, so clean up any + // remaining spans + scope = scopes.poll(); + while (scope != null) { + fromContext(scope.context()).finish(); + scope = scopes.poll(); + } + fail(responseOutlet, ex); + } + }); // This is where demand comes in from the server and TCP layer - setHandler( - responseOutlet, - new AbstractOutHandler() { - @Override - public void onPull() throws Exception { - pull(responseInlet); - } - - @Override - public void onDownstreamFinish() throws Exception { - // We can not send out any more responses to the server and TCP layer so stop - // receiving them - cancel(responseInlet); - } - }); + setHandler(responseOutlet, new AbstractOutHandler() { + @Override + public void onPull() throws Exception { + pull(responseInlet); + } + + @Override + public void onDownstreamFinish() throws Exception { + // We can not send out any more responses to the server and TCP layer so stop + // receiving them + cancel(responseInlet); + } + }); } }; } diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/FormFieldDirectivesInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/FormFieldDirectivesInstrumentation.java index 6940bfa918a..70ad1fddc31 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/FormFieldDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/FormFieldDirectivesInstrumentation.java @@ -70,10 +70,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("formField").or(named("formFields"))) .and(returns(Object.class)) .and(takesArguments(2)) - .and( - takesArgument( - 0, - named("org.apache.pekko.http.scaladsl.server.directives.FormFieldDirectives"))) + .and(takesArgument( + 0, named("org.apache.pekko.http.scaladsl.server.directives.FormFieldDirectives"))) .and( takesArgument( 1, @@ -86,9 +84,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(not(isStatic())) .and(named("formField").or(named("formFields"))) - .and( - returns(Object.class) - .or(returns(named("org.apache.pekko.http.scaladsl.server.Directive")))) + .and(returns(Object.class) + .or(returns(named("org.apache.pekko.http.scaladsl.server.Directive")))) .and(takesArguments(1)) .and( takesArgument( diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/MarshallingDirectivesInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/MarshallingDirectivesInstrumentation.java index e50e16b3bce..81e0594ce08 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/MarshallingDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/MarshallingDirectivesInstrumentation.java @@ -57,14 +57,10 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("entity")) .and(returns(named("org.apache.pekko.http.scaladsl.server.Directive"))) .and(takesArguments(2)) - .and( - takesArgument( - 0, - named( - "org.apache.pekko.http.scaladsl.server.directives.MarshallingDirectives"))) - .and( - takesArgument( - 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))), + .and(takesArgument( + 0, named("org.apache.pekko.http.scaladsl.server.directives.MarshallingDirectives"))) + .and(takesArgument( + 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))), MarshallingDirectivesInstrumentation.class.getName() + "$TaintUnmarshallerInputOldScalaAdvice"); @@ -74,9 +70,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("entity")) .and(returns(named("org.apache.pekko.http.scaladsl.server.Directive"))) .and(takesArguments(1)) - .and( - takesArgument( - 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))), + .and(takesArgument( + 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))), MarshallingDirectivesInstrumentation.class.getName() + "$TaintUnmarshallerInputNewScalaAdvice"); } diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesImplInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesImplInstrumentation.java index 97008705072..53c66b9e906 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesImplInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesImplInstrumentation.java @@ -52,9 +52,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("filter")) .and(takesArguments(2)) .and(takesArgument(0, String.class)) - .and( - takesArgument( - 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))) + .and(takesArgument( + 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))) .and(returns(named("org.apache.pekko.http.scaladsl.server.Directive"))), ParameterDirectivesImplInstrumentation.class.getName() + "$FilterAdvice"); @@ -65,9 +64,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("repeatedFilter")) .and(takesArguments(2)) .and(takesArgument(0, String.class)) - .and( - takesArgument( - 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))) + .and(takesArgument( + 1, named("org.apache.pekko.http.scaladsl.unmarshalling.Unmarshaller"))) .and(returns(named("org.apache.pekko.http.scaladsl.server.Directive"))), ParameterDirectivesImplInstrumentation.class.getName() + "$RepeatedFilterAdvice"); } diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesInstrumentation.java index ab4b1e3a18b..1676b12f42b 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/ParameterDirectivesInstrumentation.java @@ -69,10 +69,8 @@ public void methodAdvice(MethodTransformer transformer) { .and(named("parameter").or(named("parameters"))) .and(returns(Object.class)) .and(takesArguments(2)) - .and( - takesArgument( - 0, - named("org.apache.pekko.http.scaladsl.server.directives.ParameterDirectives"))) + .and(takesArgument( + 0, named("org.apache.pekko.http.scaladsl.server.directives.ParameterDirectives"))) .and( takesArgument( 1, @@ -85,9 +83,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(not(isStatic())) .and(named("parameter").or(named("parameters"))) - .and( - returns(Object.class) - .or(returns(named("org.apache.pekko.http.scaladsl.server.Directive")))) + .and(returns(Object.class) + .or(returns(named("org.apache.pekko.http.scaladsl.server.Directive")))) .and(takesArguments(1)) .and( takesArgument( @@ -140,9 +137,8 @@ static void after( } try { - retval = - ((Directive) retval) - .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); + retval = ((Directive) retval) + .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); } catch (Exception e) { throw new RuntimeException(e); // propagate so it's logged } @@ -160,9 +156,8 @@ static void after( } try { - retval = - ((Directive) retval) - .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); + retval = ((Directive) retval) + .tmap(new TaintSingleParameterFunction<>(pmag), Tupler$.MODULE$.forTuple(null)); } catch (Exception e) { throw new RuntimeException(e); // propagate so it's logged } diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/TraitMethodMatchers.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/TraitMethodMatchers.java index abd2a1d5f25..cd916a22c37 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/TraitMethodMatchers.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/TraitMethodMatchers.java @@ -15,10 +15,9 @@ public class TraitMethodMatchers { public static ElementMatcher.Junction isTraitDirectiveMethod( String traitName, String name, String... argumentTypes) { - ElementMatcher.Junction scalaOldArgs = - isStatic() - .and(takesArguments(argumentTypes.length + 1)) - .and(takesArgument(0, named(traitName))); + ElementMatcher.Junction scalaOldArgs = isStatic() + .and(takesArguments(argumentTypes.length + 1)) + .and(takesArgument(0, named(traitName))); ElementMatcher.Junction scalaNewArgs = not(isStatic()).and(takesArguments(argumentTypes.length)); diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintFutureHelper.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintFutureHelper.java index fe1459d632f..4e4a41c82c8 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintFutureHelper.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintFutureHelper.java @@ -10,14 +10,13 @@ public class TaintFutureHelper { public static Future wrapFuture( Future f, Object input, PropagationModule mod, ExecutionContext ec) { - JFunction1 mapf = - t -> { - IastContext ctx = IastContext.Provider.get(AgentTracer.activeSpan()); - if (ctx != null) { - mod.taintObjectIfTainted(ctx, t, input); - } - return t; - }; + JFunction1 mapf = t -> { + IastContext ctx = IastContext.Provider.get(AgentTracer.activeSpan()); + if (ctx != null) { + mod.taintObjectIfTainted(ctx, t, input); + } + return t; + }; return f.map(mapf, ec); } } diff --git a/dd-java-agent/instrumentation/play-ws/play-ws-common/src/main/java/datadog/trace/instrumentation/playws/BasePlayWSClientInstrumentation.java b/dd-java-agent/instrumentation/play-ws/play-ws-common/src/main/java/datadog/trace/instrumentation/playws/BasePlayWSClientInstrumentation.java index d10ef50ad78..f785835662f 100644 --- a/dd-java-agent/instrumentation/play-ws/play-ws-common/src/main/java/datadog/trace/instrumentation/playws/BasePlayWSClientInstrumentation.java +++ b/dd-java-agent/instrumentation/play-ws/play-ws-common/src/main/java/datadog/trace/instrumentation/playws/BasePlayWSClientInstrumentation.java @@ -36,9 +36,8 @@ public ElementMatcher hierarchyMatcher() { // CachingAsyncHttpClient rejects overrides to AsyncHandler // It also delegates to another AsyncHttpClient return nameStartsWith("play.") - .and( - implementsInterface(named(hierarchyMarkerType())) - .and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient")))); + .and(implementsInterface(named(hierarchyMarkerType())) + .and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient")))); } @Override diff --git a/dd-java-agent/instrumentation/play/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestHelper.java b/dd-java-agent/instrumentation/play/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestHelper.java index 071dbdd35f3..fdcda6248b0 100644 --- a/dd-java-agent/instrumentation/play/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestHelper.java +++ b/dd-java-agent/instrumentation/play/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestHelper.java @@ -73,20 +73,18 @@ public static Request withTag(final Request request, final String key, final Str } else if (COPY != null) { RequestHeader header = request; try { - newHeader = - (RequestHeader) - COPY.invokeExact( - header, - header.id(), - header.tags().updated(key, value), - header.uri(), - header.path(), - header.method(), - header.version(), - header.queryString(), - header.headers(), - (Function0) SFunction0.from(header::remoteAddress), - (Function0) SFunction0.from(header::secure)); + newHeader = (RequestHeader) COPY.invokeExact( + header, + header.id(), + header.tags().updated(key, value), + header.uri(), + header.path(), + header.method(), + header.version(), + header.queryString(), + header.headers(), + (Function0) SFunction0.from(header::remoteAddress), + (Function0) SFunction0.from(header::secure)); } catch (Throwable ignored1) { } } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/MuzzleReferences.java b/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/MuzzleReferences.java index 227d1fdf3bc..854a532609c 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/MuzzleReferences.java +++ b/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/MuzzleReferences.java @@ -8,9 +8,8 @@ private MuzzleReferences() {} public static final Reference[] PLAY_26_PLUS = new Reference[] {new Reference.Builder("play.components.BodyParserComponents").build()}; - public static final Reference[] PLAY_26_ONLY = - new Reference[] { - new Reference.Builder("play.components.BodyParserComponents").build(), - new Reference.Builder("play.Configuration").build() - }; + public static final Reference[] PLAY_26_ONLY = new Reference[] { + new Reference.Builder("play.components.BodyParserComponents").build(), + new Reference.Builder("play.Configuration").build() + }; } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java b/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java index 1018b576f3d..8d3c97525cb 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java +++ b/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java @@ -53,11 +53,8 @@ public class PlayHttpServerDecorator MethodHandle typedKeyGetUnderlyingCheck = null; try { // This method was added in Play 2.6.8 - typedKeyGetUnderlyingCheck = - lookup.findVirtual( - TypedKey.class, - "asScala", - MethodType.methodType(play.api.libs.typedmap.TypedKey.class)); + typedKeyGetUnderlyingCheck = lookup.findVirtual( + TypedKey.class, "asScala", MethodType.methodType(play.api.libs.typedmap.TypedKey.class)); } catch (final NoSuchMethodException | IllegalAccessException ignored) { } // Fallback @@ -139,19 +136,14 @@ protected void doOnRequest( Option defOption = Option.empty(); if (TYPED_KEY_GET_UNDERLYING != null) { // Should always be non-null but just to make sure try { - defOption = - request - .attrs() - .get( - (play.api.libs.typedmap.TypedKey) - TYPED_KEY_GET_UNDERLYING.invokeExact(Router.Attrs.HANDLER_DEF)); + defOption = request.attrs().get((play.api.libs.typedmap.TypedKey) + TYPED_KEY_GET_UNDERLYING.invokeExact(Router.Attrs.HANDLER_DEF)); } catch (final Throwable ignored) { } } if (!defOption.isEmpty()) { - CharSequence path = - PATH_CACHE.computeIfAbsent( - defOption.get().path(), p -> addMissingSlash(p, request.path())); + CharSequence path = PATH_CACHE.computeIfAbsent( + defOption.get().path(), p -> addMissingSlash(p, request.path())); HTTP_RESOURCE_DECORATOR.withRoute(span, request.method(), path, true); dispatchRoute(span, path); } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java index 8b7c89dcc8f..843259e1bd5 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java @@ -40,9 +40,8 @@ public R apply(Object o) { Map conv = Collections.singletonMap("0", o); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routeTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routeTo"); if (t != null) { throw t; } @@ -78,9 +77,8 @@ public R apply(Object o1, Object o2) { conv.put("0", o1); conv.put("1", o2); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routeTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routeTo"); if (t != null) { throw t; } @@ -118,9 +116,8 @@ public R apply(Object o1, Object o2, Object o3) throws Throwable { conv.put("1", o2); conv.put("2", o3); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routeTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routeTo"); if (t != null) { throw t; } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpers.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpers.java index 0eba7744dff..3a9600b1af7 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpers.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpers.java @@ -84,12 +84,9 @@ public class BodyParserHelpers { } catch (Exception ignored) { } try { - file = - Class.forName( - "play.api.libs.Files$TemporaryFile", - false, - BodyParserHelpers.class.getClassLoader()) - .getMethod("file"); + file = Class.forName( + "play.api.libs.Files$TemporaryFile", false, BodyParserHelpers.class.getClassLoader()) + .getMethod("file"); } catch (Exception ignored) { } FILE_PART_REF = ref; diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/MuzzleReferences.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/MuzzleReferences.java index b56b9ea27d5..dd0777c2b0a 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/MuzzleReferences.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/MuzzleReferences.java @@ -6,9 +6,8 @@ public class MuzzleReferences { public static final Reference[] PLAY_25_PLUS = new Reference[] {}; - public static final Reference[] PLAY_25_ONLY = - new Reference[] { - new Reference.Builder("play.libs.concurrent.Futures").build(), - new Reference.Builder("play.Routes").build() - }; + public static final Reference[] PLAY_25_ONLY = new Reference[] { + new Reference.Builder("play.libs.concurrent.Futures").build(), + new Reference.Builder("play.Routes").build() + }; } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersMultipartFormDataAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersMultipartFormDataAdvice.java index 1250bc4a40a..89e7dca7987 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersMultipartFormDataAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersMultipartFormDataAdvice.java @@ -12,9 +12,8 @@ public class PlayBodyParsersMultipartFormDataAdvice { @Advice.OnMethodExit(suppress = Throwable.class) static void after( @Advice.Return(readOnly = false) BodyParser> parser) { - parser = - parser.map( - BodyParserHelpers.getHandleMultipartFormDataF(), - Execution.Implicits$.MODULE$.internalContext()); + parser = parser.map( + BodyParserHelpers.getHandleMultipartFormDataF(), + Execution.Implicits$.MODULE$.internalContext()); } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantFormUrlEncodedAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantFormUrlEncodedAdvice.java index edeb7a2e014..beedd06292f 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantFormUrlEncodedAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantFormUrlEncodedAdvice.java @@ -10,9 +10,8 @@ public class PlayBodyParsersTolerantFormUrlEncodedAdvice { static void after( @Advice.Return(readOnly = false) BodyParser>> parser) { - parser = - parser.map( - BodyParserHelpers.getHandleUrlEncodedMapF(), - Execution.Implicits$.MODULE$.internalContext()); + parser = parser.map( + BodyParserHelpers.getHandleUrlEncodedMapF(), + Execution.Implicits$.MODULE$.internalContext()); } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantJsonAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantJsonAdvice.java index 76272033305..507c457dabe 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantJsonAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantJsonAdvice.java @@ -11,8 +11,7 @@ public class PlayBodyParsersTolerantJsonAdvice { @Advice.OnMethodExit(suppress = Throwable.class) static void after(@Advice.Return(readOnly = false) BodyParser parser) { - parser = - parser.map( - BodyParserHelpers.getHandleJsonF(), Execution.Implicits$.MODULE$.internalContext()); + parser = parser.map( + BodyParserHelpers.getHandleJsonF(), Execution.Implicits$.MODULE$.internalContext()); } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantTextAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantTextAdvice.java index 2c519597326..1f47af02c53 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantTextAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PlayBodyParsersTolerantTextAdvice.java @@ -7,9 +7,7 @@ public class PlayBodyParsersTolerantTextAdvice { @Advice.OnMethodExit(suppress = Throwable.class) static void after(@Advice.Return(readOnly = false) BodyParser parser) { - parser = - parser.map( - BodyParserHelpers.getHandleStringMapF(), - Execution.Implicits$.MODULE$.internalContext()); + parser = parser.map( + BodyParserHelpers.getHandleStringMapF(), Execution.Implicits$.MODULE$.internalContext()); } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java index 5f346fccbf6..c51fc827913 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java @@ -30,8 +30,7 @@ static void after( conv.put(Integer.toString(i), stringList.apply(i)); } - t = - PathExtractionHelpers.callRequestPathParamsCallback( - reqCtx, conv, "sird.PathExtractor#extract"); + t = PathExtractionHelpers.callRequestPathParamsCallback( + reqCtx, conv, "sird.PathExtractor#extract"); } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/test/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpersTest.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/test/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpersTest.java index e14f55c7d74..c9d0a43d9f6 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/test/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpersTest.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/test/java/datadog/trace/instrumentation/play25/appsec/BodyParserHelpersTest.java @@ -115,36 +115,29 @@ void collectFilenames_emptyIterator() { @Test void collectFilenames_nullFilenameExcluded() throws Exception { - List result = - BodyParserHelpers.collectFilenames( - Collections.singletonList(filePart("f", null)).iterator()); + List result = BodyParserHelpers.collectFilenames( + Collections.singletonList(filePart("f", null)).iterator()); assertTrue(result.isEmpty()); } @Test void collectFilenames_emptyFilenameExcluded() throws Exception { - List result = - BodyParserHelpers.collectFilenames( - Collections.singletonList(filePart("f", "")).iterator()); + List result = BodyParserHelpers.collectFilenames( + Collections.singletonList(filePart("f", "")).iterator()); assertTrue(result.isEmpty()); } @Test void collectFilenames_validFilenameIncluded() throws Exception { - List result = - BodyParserHelpers.collectFilenames( - Collections.singletonList(filePart("f", "evil.php")).iterator()); + List result = BodyParserHelpers.collectFilenames( + Collections.singletonList(filePart("f", "evil.php")).iterator()); assertEquals(Collections.singletonList("evil.php"), result); } @Test void collectFilenames_mixedPartsFiltered() throws Exception { - List parts = - Arrays.asList( - filePart("f1", "a.pdf"), - filePart("f2", null), - filePart("f3", ""), - filePart("f4", "b.jpg")); + List parts = Arrays.asList( + filePart("f1", "a.pdf"), filePart("f2", null), filePart("f3", ""), filePart("f4", "b.jpg")); List result = BodyParserHelpers.collectFilenames(parts.iterator()); assertEquals(Arrays.asList("a.pdf", "b.jpg"), result); } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java index 26f716b3414..2c5261da237 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java @@ -40,9 +40,8 @@ public R apply(Object o) { Map conv = Collections.singletonMap("0", o); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routeTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routeTo"); if (t != null) { throw t; } @@ -78,9 +77,8 @@ public R apply(Object o1, Object o2) { conv.put("0", o1); conv.put("1", o2); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routeTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routeTo"); if (t != null) { throw t; } @@ -118,9 +116,8 @@ public R apply(Object o1, Object o2, Object o3) throws Throwable { conv.put("1", o2); conv.put("2", o3); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routeTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routeTo"); if (t != null) { throw t; } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java index 4f1fff4b5fa..09688c856b2 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java @@ -94,12 +94,9 @@ public class BodyParserHelpers { } catch (Exception ignored) { } try { - file = - Class.forName( - "play.api.libs.Files$TemporaryFile", - false, - BodyParserHelpers.class.getClassLoader()) - .getMethod("file"); + file = Class.forName( + "play.api.libs.Files$TemporaryFile", false, BodyParserHelpers.class.getClassLoader()) + .getMethod("file"); } catch (Exception ignored) { } FILE_PART_REF = ref; @@ -593,7 +590,8 @@ private static Object nodeToJavaObject(Node node, int maxRecursion) { } if (node instanceof Elem) { - scala.collection.immutable.Map attributes = node.attributes().asAttrMap(); + scala.collection.immutable.Map attributes = + node.attributes().asAttrMap(); int size = node.child().size(); List childList = Collections.emptyList(); diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java index 5eef4e9d065..d9e78697c7c 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java @@ -71,9 +71,8 @@ static void after( play.mvc.Result, Http.MultipartFormData>> acc = ret; - ret = - acc.recover( - JavaMultipartFormDataRegisterExcF.INSTANCE, JavaParsers$.MODULE$.trampoline()); + ret = acc.recover( + JavaMultipartFormDataRegisterExcF.INSTANCE, JavaParsers$.MODULE$.trampoline()); } } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java index 2fbfdc02810..0880f062617 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java @@ -72,14 +72,13 @@ public void methodAdvice(MethodTransformer transformer) { .and(returns(named("play.api.mvc.BodyParser"))) .and( /* only if prev didn't match */ - hasNoDeclaredMethod( - isTraitMethod( - TRAIT_NAME, - "multipartFormData", - "scala.Function1", - long.class, - boolean.class) - .and(returns(named("play.api.mvc.BodyParser"))))), + hasNoDeclaredMethod(isTraitMethod( + TRAIT_NAME, + "multipartFormData", + "scala.Function1", + long.class, + boolean.class) + .and(returns(named("play.api.mvc.BodyParser"))))), PlayBodyParsersInstrumentation.class.getName() + "$MultipartFormDataAdvice"); transformer.applyAdvice( isTraitMethod(TRAIT_NAME, "tolerantJson", is(int.class).or(is(long.class))) @@ -96,10 +95,8 @@ static class UrlEncodedAdvice { static void after( @Advice.Return(readOnly = false) BodyParser>> parser) { - parser = - parser.map( - BodyParserHelpers.getHandleUrlEncodedMapF(), - Execution.Implicits$.MODULE$.trampoline()); + parser = parser.map( + BodyParserHelpers.getHandleUrlEncodedMapF(), Execution.Implicits$.MODULE$.trampoline()); } } @@ -117,9 +114,8 @@ static void after( return; } - parser = - parser.map( - BodyParserHelpers.getHandleStringMapF(), Execution.Implicits$.MODULE$.trampoline()); + parser = parser.map( + BodyParserHelpers.getHandleStringMapF(), Execution.Implicits$.MODULE$.trampoline()); } } @@ -127,10 +123,9 @@ static class MultipartFormDataAdvice { @Advice.OnMethodExit(suppress = Throwable.class) static void after(@Advice.Return(readOnly = false) BodyParser> parser) { - parser = - parser.map( - BodyParserHelpers.getHandleMultipartFormDataF(), - Execution.Implicits$.MODULE$.trampoline()); + parser = parser.map( + BodyParserHelpers.getHandleMultipartFormDataF(), + Execution.Implicits$.MODULE$.trampoline()); } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java index cfa61d26931..dc4cc4e9056 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java @@ -79,9 +79,8 @@ static void after( conv.put(Integer.toString(i), stringList.apply(i)); } - t = - PathExtractionHelpers.callRequestPathParamsCallback( - reqCtx, conv, "sird.PathExtractor#extract"); + t = PathExtractionHelpers.callRequestPathParamsCallback( + reqCtx, conv, "sird.PathExtractor#extract"); } } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpersTest.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpersTest.java index 17fd88344a1..57bec240dd9 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpersTest.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpersTest.java @@ -116,36 +116,29 @@ void collectFilenames_emptyIterator() { @Test void collectFilenames_nullFilenameExcluded() throws Exception { - List result = - BodyParserHelpers.collectFilenames( - Collections.singletonList(filePart("f", null)).iterator()); + List result = BodyParserHelpers.collectFilenames( + Collections.singletonList(filePart("f", null)).iterator()); assertTrue(result.isEmpty()); } @Test void collectFilenames_emptyFilenameExcluded() throws Exception { - List result = - BodyParserHelpers.collectFilenames( - Collections.singletonList(filePart("f", "")).iterator()); + List result = BodyParserHelpers.collectFilenames( + Collections.singletonList(filePart("f", "")).iterator()); assertTrue(result.isEmpty()); } @Test void collectFilenames_validFilenameIncluded() throws Exception { - List result = - BodyParserHelpers.collectFilenames( - Collections.singletonList(filePart("f", "evil.php")).iterator()); + List result = BodyParserHelpers.collectFilenames( + Collections.singletonList(filePart("f", "evil.php")).iterator()); assertEquals(Collections.singletonList("evil.php"), result); } @Test void collectFilenames_mixedPartsFiltered() throws Exception { - List parts = - Arrays.asList( - filePart("f1", "a.pdf"), - filePart("f2", null), - filePart("f3", ""), - filePart("f4", "b.jpg")); + List parts = Arrays.asList( + filePart("f1", "a.pdf"), filePart("f2", null), filePart("f3", ""), filePart("f4", "b.jpg")); List result = BodyParserHelpers.collectFilenames(parts.iterator()); assertEquals(Arrays.asList("a.pdf", "b.jpg"), result); } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java index d32fdb49773..1420d139601 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java @@ -58,9 +58,8 @@ public R apply(Http.Request req, Object o1) { Map conv = Collections.singletonMap("0", o1); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routingTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routingTo"); if (t != null) { throw t; } @@ -97,9 +96,8 @@ public R apply(Http.Request req, Object o1, Object o2) throws Throwable { conv.put("0", o1); conv.put("1", o2); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routingTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routingTo"); if (t != null) { throw t; } @@ -138,9 +136,8 @@ public R apply(Http.Request req, Object o1, Object o2, Object o3) throws Throwab conv.put("1", o2); conv.put("2", o3); - BlockingException t = - PathExtractionHelpers.callRequestPathParamsCallback( - requestContext, conv, "RoutingDsl#routingTo"); + BlockingException t = PathExtractionHelpers.callRequestPathParamsCallback( + requestContext, conv, "RoutingDsl#routingTo"); if (t != null) { throw t; } diff --git a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java index 2780015a5bf..d60eddff562 100644 --- a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java +++ b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java @@ -88,20 +88,12 @@ public void methodAdvice(MethodTransformer transformer) { // We want the advice applied in a specific order. transformer.applyAdvice( isMethod() - .and( - not( - isGetter() - .or(isSetter()) - .or(nameEndsWith("Listener")) - .or(nameEndsWith("Listeners")) - .or( - namedOneOf( - "processAsync", - "open", - "close", - "abort", - "basicGet", - "basicPublish")))) + .and(not(isGetter() + .or(isSetter()) + .or(nameEndsWith("Listener")) + .or(nameEndsWith("Listeners")) + .or(namedOneOf( + "processAsync", "open", "close", "abort", "basicGet", "basicPublish")))) .and(isPublic()) .and(canThrow(IOException.class).or(canThrow(InterruptedException.class))), RabbitChannelInstrumentation.class.getName() + "$ChannelMethodAdvice"); @@ -231,22 +223,21 @@ public static void onEnter( } DataStreamsContext dsmContext = DataStreamsContext.fromTags(tags); defaultPropagator().inject(span.with(dsmContext), headers, SETTER); - props = - new AMQP.BasicProperties( - props.getContentType(), - props.getContentEncoding(), - headers, - props.getDeliveryMode(), - props.getPriority(), - props.getCorrelationId(), - props.getReplyTo(), - props.getExpiration(), - props.getMessageId(), - props.getTimestamp(), - props.getType(), - props.getUserId(), - props.getAppId(), - props.getClusterId()); + props = new AMQP.BasicProperties( + props.getContentType(), + props.getContentEncoding(), + headers, + props.getDeliveryMode(), + props.getPriority(), + props.getCorrelationId(), + props.getReplyTo(), + props.getExpiration(), + props.getMessageId(), + props.getTimestamp(), + props.getType(), + props.getUserId(), + props.getAppId(), + props.getClusterId()); } } @@ -277,16 +268,14 @@ public static void extractAndStartSpan( } final Connection connection = channel.getConnection(); final Config config = Config.get(); - final boolean propagate = - config.isRabbitPropagationEnabled() - && !config.isRabbitPropagationDisabledForDestination(queue); - final AgentScope scope = - RabbitDecorator.startReceivingSpan( - propagate, - spanStartMillis, - null != response ? response.getProps() : null, - null != response ? response.getBody() : null, - queue); + final boolean propagate = config.isRabbitPropagationEnabled() + && !config.isRabbitPropagationDisabledForDestination(queue); + final AgentScope scope = RabbitDecorator.startReceivingSpan( + propagate, + spanStartMillis, + null != response ? response.getProps() : null, + null != response ? response.getBody() : null, + queue); final AgentSpan span = scope.span(); CONSUMER_DECORATE.setPeerPort(span, connection.getPort()); CONSUMER_DECORATE.onGet(span, queue); diff --git a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java index e73bf99c34a..62fa8d58f16 100644 --- a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java +++ b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java @@ -36,15 +36,13 @@ public class RabbitDecorator extends MessagingClientDecorator { public static final CharSequence OPERATION_AMQP_COMMAND = UTF8BytesString.create("amqp.command"); - public static final CharSequence OPERATION_AMQP_INBOUND = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation("amqp")); + public static final CharSequence OPERATION_AMQP_INBOUND = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation("amqp")); public static final CharSequence OPERATION_AMQP_DELIVER = UTF8BytesString.create("amqp.deliver"); - public static final CharSequence OPERATION_AMQP_OUTBOUND = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().outboundOperation("amqp")); + public static final CharSequence OPERATION_AMQP_OUTBOUND = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().outboundOperation("amqp")); public static final CharSequence RABBITMQ_AMQP = UTF8BytesString.create("rabbitmq-amqp"); public static final boolean RABBITMQ_LEGACY_TRACING = @@ -54,35 +52,31 @@ public class RabbitDecorator extends MessagingClientDecorator { public static final boolean TIME_IN_QUEUE_ENABLED = Config.get().isTimeInQueueEnabled(!RABBITMQ_LEGACY_TRACING, "rabbit", "rabbitmq"); - public static final RabbitDecorator CLIENT_DECORATE = - new RabbitDecorator( - Tags.SPAN_KIND_CLIENT, - InternalSpanTypes.MESSAGE_CLIENT, - SpanNaming.instance() - .namingSchema() - .messaging() - .outboundService("rabbitmq", RABBITMQ_LEGACY_TRACING)); - public static final RabbitDecorator PRODUCER_DECORATE = - new RabbitDecorator( - Tags.SPAN_KIND_PRODUCER, - InternalSpanTypes.MESSAGE_PRODUCER, - SpanNaming.instance() - .namingSchema() - .messaging() - .outboundService("rabbitmq", RABBITMQ_LEGACY_TRACING)); - public static final RabbitDecorator CONSUMER_DECORATE = - new RabbitDecorator( - Tags.SPAN_KIND_CONSUMER, - InternalSpanTypes.MESSAGE_CONSUMER, - SpanNaming.instance() - .namingSchema() - .messaging() - .inboundService("rabbitmq", RABBITMQ_LEGACY_TRACING)); - public static final RabbitDecorator BROKER_DECORATE = - new RabbitDecorator( - Tags.SPAN_KIND_BROKER, - InternalSpanTypes.MESSAGE_BROKER, - SpanNaming.instance().namingSchema().messaging().timeInQueueService("rabbitmq")); + public static final RabbitDecorator CLIENT_DECORATE = new RabbitDecorator( + Tags.SPAN_KIND_CLIENT, + InternalSpanTypes.MESSAGE_CLIENT, + SpanNaming.instance() + .namingSchema() + .messaging() + .outboundService("rabbitmq", RABBITMQ_LEGACY_TRACING)); + public static final RabbitDecorator PRODUCER_DECORATE = new RabbitDecorator( + Tags.SPAN_KIND_PRODUCER, + InternalSpanTypes.MESSAGE_PRODUCER, + SpanNaming.instance() + .namingSchema() + .messaging() + .outboundService("rabbitmq", RABBITMQ_LEGACY_TRACING)); + public static final RabbitDecorator CONSUMER_DECORATE = new RabbitDecorator( + Tags.SPAN_KIND_CONSUMER, + InternalSpanTypes.MESSAGE_CONSUMER, + SpanNaming.instance() + .namingSchema() + .messaging() + .inboundService("rabbitmq", RABBITMQ_LEGACY_TRACING)); + public static final RabbitDecorator BROKER_DECORATE = new RabbitDecorator( + Tags.SPAN_KIND_BROKER, + InternalSpanTypes.MESSAGE_BROKER, + SpanNaming.instance().namingSchema().messaging().timeInQueueService("rabbitmq")); private final String spanKind; private final CharSequence spanType; @@ -122,10 +116,9 @@ protected CharSequence spanType() { public void onPublish(final AgentSpan span, final String exchange, final String routingKey) { final String exchangeName = exchange == null || exchange.isEmpty() ? "" : exchange; - final String routing = - routingKey == null || routingKey.isEmpty() - ? "" - : routingKey.startsWith("amq.gen-") ? "" : routingKey; + final String routing = routingKey == null || routingKey.isEmpty() + ? "" + : routingKey.startsWith("amq.gen-") ? "" : routingKey; span.setResourceName(buildResourceName("basic.publish", exchangeName, routing)); span.setTag(AMQP_EXCHANGE, exchange); span.setTag(AMQP_ROUTING_KEY, routingKey); @@ -181,11 +174,11 @@ private String normalizeQueueName(String queueName) { private String buildResourceName( final String opName, final String exchangeName, final String routingKey) { // pre-size to the worst case length - final StringBuilder prefix = - new StringBuilder(opName.length() + exchangeName.length() + routingKey.length() + 5) - .append(opName) - .append(' ') - .append(exchangeName); + final StringBuilder prefix = new StringBuilder( + opName.length() + exchangeName.length() + routingKey.length() + 5) + .append(opName) + .append(' ') + .append(exchangeName); if (Config.get().isRabbitIncludeRoutingKeyInResource()) { prefix.append(" -> ").append(routingKey); } @@ -204,10 +197,9 @@ public static AgentScope startReceivingSpan( String queue) { final Map headers = propagate && null != properties ? properties.getHeaders() : null; - AgentSpanContext parentSpanContext = - null != headers - ? extractContextAndGetSpanContext(headers, ContextVisitors.objectValuesMap()) - : null; + AgentSpanContext parentSpanContext = null != headers + ? extractContextAndGetSpanContext(headers, ContextVisitors.objectValuesMap()) + : null; // TODO: check dynamically bound queues - // https://github.com/DataDog/dd-trace-java/pull/2955#discussion_r677787875 @@ -222,12 +214,11 @@ public static AgentScope startReceivingSpan( AgentSpan queueSpan = null; if (queueStartMillis != 0) { queueStartMillis = Math.min(spanStartMillis, queueStartMillis); - queueSpan = - startSpan( - RABBITMQ_AMQP.toString(), - OPERATION_AMQP_DELIVER, - parentSpanContext, - TimeUnit.MILLISECONDS.toMicros(queueStartMillis)); + queueSpan = startSpan( + RABBITMQ_AMQP.toString(), + OPERATION_AMQP_DELIVER, + parentSpanContext, + TimeUnit.MILLISECONDS.toMicros(queueStartMillis)); BROKER_DECORATE.afterStart(queueSpan); BROKER_DECORATE.onTimeInQueue(queueSpan, queue, body); parentSpanContext = queueSpan.spanContext(); @@ -235,9 +226,8 @@ public static AgentScope startReceivingSpan( // The queueSpan will be finished after the inner span has been activated to ensure that the // spans are written out together by the TraceStructureWriter when running in strict mode } - final AgentSpan span = - startSpan( - RABBITMQ_AMQP.toString(), OPERATION_AMQP_INBOUND, parentSpanContext, spanStartMicros); + final AgentSpan span = startSpan( + RABBITMQ_AMQP.toString(), OPERATION_AMQP_INBOUND, parentSpanContext, spanStartMicros); if (null != body) { span.setTag("message.size", body.length); diff --git a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/TracedDelegatingConsumer.java b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/TracedDelegatingConsumer.java index 314a3cc1af7..5eef1542744 100644 --- a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/TracedDelegatingConsumer.java +++ b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/TracedDelegatingConsumer.java @@ -27,9 +27,8 @@ public class TracedDelegatingConsumer implements Consumer { public TracedDelegatingConsumer(final String queue, final Consumer delegate) { this.queue = queue; - this.propagate = - Config.get().isRabbitPropagationEnabled() - && !Config.get().isRabbitPropagationDisabledForDestination(queue); + this.propagate = Config.get().isRabbitPropagationEnabled() + && !Config.get().isRabbitPropagationDisabledForDestination(queue); this.delegate = delegate; } diff --git a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/PathHandlerInstrumentation.java b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/PathHandlerInstrumentation.java index e712e5e0601..49375b81922 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/PathHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/PathHandlerInstrumentation.java @@ -30,14 +30,14 @@ public String[] helperClassNames() { }; } - private static final Reference TOKEN_PATH_BINDER_TOKEN_NAMES = - new Reference.Builder("ratpack.path.internal.TokenPathBinder") - .withField( - new String[0], - Reference.EXPECTS_NON_STATIC, - "tokenNames", - "Lcom/google/common/collect/ImmutableList;") - .build(); + private static final Reference TOKEN_PATH_BINDER_TOKEN_NAMES = new Reference.Builder( + "ratpack.path.internal.TokenPathBinder") + .withField( + new String[0], + Reference.EXPECTS_NON_STATIC, + "tokenNames", + "Lcom/google/common/collect/ImmutableList;") + .build(); // so it doesn't apply to ratpack < 1.5 private static final Reference FILE_IO = new Reference.Builder("ratpack.file.FileIo").build(); diff --git a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestBodyCollectionPublisher.java b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestBodyCollectionPublisher.java index 6ec7376249e..daeccf198ee 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestBodyCollectionPublisher.java +++ b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestBodyCollectionPublisher.java @@ -28,70 +28,69 @@ public RequestBodyCollectionPublisher(StoredByteBody storedByteBody, Publisher outSubscriber) { - input.subscribe( - new Subscriber() { + input.subscribe(new Subscriber() { - private final AtomicBoolean done = new AtomicBoolean(); + private final AtomicBoolean done = new AtomicBoolean(); - @Override - public void onSubscribe(Subscription subscription) { - outSubscriber.onSubscribe(subscription); - } + @Override + public void onSubscribe(Subscription subscription) { + outSubscriber.onSubscribe(subscription); + } - @Override - public void onNext(ByteBuf in) { - // duplicate in order not to move indexes. Release is unnecessary - cb.byteBuf = in.duplicate(); - storedByteBody.appendData(cb, cb.byteBuf.readableBytes()); - if (!done.get()) { - outSubscriber.onNext(in); - } - } + @Override + public void onNext(ByteBuf in) { + // duplicate in order not to move indexes. Release is unnecessary + cb.byteBuf = in.duplicate(); + storedByteBody.appendData(cb, cb.byteBuf.readableBytes()); + if (!done.get()) { + outSubscriber.onNext(in); + } + } - @Override - public void onError(Throwable t) { - Flow flow = storedByteBody.maybeNotify(); - Flow.Action action = flow.getAction(); - if (action instanceof Flow.Action.RequestBlockingAction) { - block((Flow.Action.RequestBlockingAction) action, t); - } else if (done.compareAndSet(false, true)) { - outSubscriber.onError(t); - } - } + @Override + public void onError(Throwable t) { + Flow flow = storedByteBody.maybeNotify(); + Flow.Action action = flow.getAction(); + if (action instanceof Flow.Action.RequestBlockingAction) { + block((Flow.Action.RequestBlockingAction) action, t); + } else if (done.compareAndSet(false, true)) { + outSubscriber.onError(t); + } + } - @Override - public void onComplete() { - Flow flow = storedByteBody.maybeNotify(); - Flow.Action action = flow.getAction(); - if (action instanceof Flow.Action.RequestBlockingAction) { - block( - (Flow.Action.RequestBlockingAction) action, - new BlockingException("Blocked request (for RequestBody/readStream)")); - } else if (done.compareAndSet(false, true)) { - outSubscriber.onComplete(); - } - } + @Override + public void onComplete() { + Flow flow = storedByteBody.maybeNotify(); + Flow.Action action = flow.getAction(); + if (action instanceof Flow.Action.RequestBlockingAction) { + block( + (Flow.Action.RequestBlockingAction) action, + new BlockingException("Blocked request (for RequestBody/readStream)")); + } else if (done.compareAndSet(false, true)) { + outSubscriber.onComplete(); + } + } - private void block(Flow.Action.RequestBlockingAction rba, Throwable t) { - AgentSpan agentSpan = activeSpan(); - if (agentSpan == null) { - return; - } - RequestContext requestContext = agentSpan.getRequestContext(); - BlockResponseFunction blockResponseFunction = requestContext.getBlockResponseFunction(); - if (blockResponseFunction == null) { - return; - } - blockResponseFunction.tryCommitBlockingResponse(requestContext.getTraceSegment(), rba); + private void block(Flow.Action.RequestBlockingAction rba, Throwable t) { + AgentSpan agentSpan = activeSpan(); + if (agentSpan == null) { + return; + } + RequestContext requestContext = agentSpan.getRequestContext(); + BlockResponseFunction blockResponseFunction = requestContext.getBlockResponseFunction(); + if (blockResponseFunction == null) { + return; + } + blockResponseFunction.tryCommitBlockingResponse(requestContext.getTraceSegment(), rba); - // we can't directly interrupt user code here by throwing an exception - // user code must listen for errors and implement its own logic to prevent - // the request processing from continue (although we always commit the error response) - if (done.compareAndSet(false, true)) { - outSubscriber.onError(t); - } - } - }); + // we can't directly interrupt user code here by throwing an exception + // user code must listen for errors and implement its own logic to prevent + // the request processing from continue (although we always commit the error response) + if (done.compareAndSet(false, true)) { + outSubscriber.onError(t); + } + } + }); } public static class ByteBufIntoByteBufferCallback diff --git a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestURIAdapterAdapter.java b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestURIAdapterAdapter.java index 565afaf6b1b..1a822f3cb3a 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestURIAdapterAdapter.java +++ b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/RequestURIAdapterAdapter.java @@ -15,14 +15,13 @@ final class RequestURIAdapterAdapter extends URIDataAdapterBase { // of the local address of the socket. Usually there will be only one element private static final DDCache DOMAIN_NAME_MAPPING = DDCaches.newFixedSizeCache(4); - private static final Function GET_CANONICAL_NAME = - ip -> { - try { - return InetAddress.getByName(ip).getCanonicalHostName(); - } catch (UnknownHostException e) { - return ip; - } - }; + private static final Function GET_CANONICAL_NAME = ip -> { + try { + return InetAddress.getByName(ip).getCanonicalHostName(); + } catch (UnknownHostException e) { + return ip; + } + }; private final Request request; private final HostAndPort hostAndPort; diff --git a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/ServerRegistryAdvice.java b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/ServerRegistryAdvice.java index 24425d80eeb..e501dd72196 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/ServerRegistryAdvice.java +++ b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/ServerRegistryAdvice.java @@ -7,8 +7,8 @@ public class ServerRegistryAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void injectTracing(@Advice.Return(readOnly = false) Registry registry) { - registry = - registry.join( - Registry.builder().add(HandlerDecorator.prepend(TracingHandler.INSTANCE)).build()); + registry = registry.join(Registry.builder() + .add(HandlerDecorator.prepend(TracingHandler.INSTANCE)) + .build()); } } diff --git a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java index 7c5ad8b19b2..f46e3ab2a51 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java +++ b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java @@ -47,20 +47,18 @@ public void handle(final Context ctx) { try (final ContextScope scope = activateSpan(ratpackSpan)) { - ctx.getResponse() - .beforeSend( - response -> { - try (final ContextScope ignored = activateSpan(ratpackSpan)) { - if (nettySpan != null) { - // Rename the netty span resource name with the ratpack route. - DECORATE.onContext(nettySpan, ctx); - } - DECORATE.onResponse(ratpackSpan, response); - DECORATE.onContext(ratpackSpan, ctx); - DECORATE.beforeFinish(ratpackSpan); - ratpackSpan.finish(); - } - }); + ctx.getResponse().beforeSend(response -> { + try (final ContextScope ignored = activateSpan(ratpackSpan)) { + if (nettySpan != null) { + // Rename the netty span resource name with the ratpack route. + DECORATE.onContext(nettySpan, ctx); + } + DECORATE.onResponse(ratpackSpan, response); + DECORATE.onContext(ratpackSpan, ctx); + DECORATE.beforeFinish(ratpackSpan); + ratpackSpan.finish(); + } + }); setFinalizer = true; diff --git a/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/annotatedsample/ReactiveStreamsTracedMethods.java b/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/annotatedsample/ReactiveStreamsTracedMethods.java index 68713f90cdc..51c1f47b413 100644 --- a/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/annotatedsample/ReactiveStreamsTracedMethods.java +++ b/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/annotatedsample/ReactiveStreamsTracedMethods.java @@ -55,21 +55,20 @@ public void subscribe(Subscriber s) { throw new RuntimeException(e); } - s.onSubscribe( - new Subscription() { - @Override - public void request(long n) { - if (error != null) { - s.onError(error); - } else { - s.onNext(element); - s.onComplete(); - } - } - - @Override - public void cancel() {} - }); + s.onSubscribe(new Subscription() { + @Override + public void request(long n) { + if (error != null) { + s.onError(error); + } else { + s.onNext(element); + s.onComplete(); + } + } + + @Override + public void cancel() {} + }); } } diff --git a/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/datadog/trace/instrumentation/reactivestreams/ReactiveStreamsContextPropagationTest.java b/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/datadog/trace/instrumentation/reactivestreams/ReactiveStreamsContextPropagationTest.java index ab99ae9c3ae..32268067abd 100644 --- a/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/datadog/trace/instrumentation/reactivestreams/ReactiveStreamsContextPropagationTest.java +++ b/dd-java-agent/instrumentation/reactive-streams-1.0/src/test/java/datadog/trace/instrumentation/reactivestreams/ReactiveStreamsContextPropagationTest.java @@ -37,9 +37,8 @@ void publisherCapturedContextOverridesActiveContext() { try (ContextScope activeScope = active.attach()) { assertSame(active, Context.current()); - final ContextScope scope = - ReactiveStreamsContextPropagation.captureOnSubscribe( - publisher, subscriber, publisherContexts, subscriberContexts); + final ContextScope scope = ReactiveStreamsContextPropagation.captureOnSubscribe( + publisher, subscriber, publisherContexts, subscriberContexts); try { // The captured context must win over the ambient active one assertNotNull(scope, "captured context should be attached over the active context"); @@ -76,9 +75,8 @@ void publisherContextFromAnotherThreadIsIgnored() throws InterruptedException { final Context active = Context.root().with(KEY, "active"); try (ContextScope activeScope = active.attach()) { - final ContextScope scope = - ReactiveStreamsContextPropagation.captureOnSubscribe( - publisher, subscriber, publisherContexts, subscriberContexts); + final ContextScope scope = ReactiveStreamsContextPropagation.captureOnSubscribe( + publisher, subscriber, publisherContexts, subscriberContexts); if (scope != null) { scope.close(); } @@ -103,9 +101,8 @@ void anyThreadPublisherContextIsAdoptedAcrossThreads() throws InterruptedExcepti producer.start(); producer.join(); - final ContextScope scope = - ReactiveStreamsContextPropagation.captureOnSubscribe( - publisher, subscriber, publisherContexts, subscriberContexts); + final ContextScope scope = ReactiveStreamsContextPropagation.captureOnSubscribe( + publisher, subscriber, publisherContexts, subscriberContexts); if (scope != null) { scope.close(); } diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/java/annotatedsample/ReactorTracedMethods.java b/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/java/annotatedsample/ReactorTracedMethods.java index a3450a31e20..36a78853275 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/java/annotatedsample/ReactorTracedMethods.java +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/java/annotatedsample/ReactorTracedMethods.java @@ -12,39 +12,35 @@ public class ReactorTracedMethods { @WithSpan public static Mono traceAsyncMono(CountDownLatch latch) { - return Mono.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Mono.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Mono traceAsyncFailingMono(CountDownLatch latch, Exception exception) { - return Mono.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Mono.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Flux traceAsyncFlux(CountDownLatch latch) { - return Flux.create( - emitter -> { - await(latch); - emitter.next("hello"); - emitter.complete(); - }); + return Flux.create(emitter -> { + await(latch); + emitter.next("hello"); + emitter.complete(); + }); } @WithSpan public static Flux traceAsyncFailingFlux(CountDownLatch latch, Exception exception) { - return Flux.create( - emitter -> { - await(latch); - emitter.error(exception); - }); + return Flux.create(emitter -> { + await(latch); + emitter.error(exception); + }); } private static void await(CountDownLatch latch) { diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/CorePublisherInstrumentation.java b/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/CorePublisherInstrumentation.java index 0d6053b0cd2..bbdaadcef1a 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/CorePublisherInstrumentation.java +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/CorePublisherInstrumentation.java @@ -32,10 +32,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return implementsInterface(named("reactor.core.CorePublisher")) // from 3.1.7 - .or( - hasSuperType( - namedOneOf( - "reactor.core.publisher.Mono", "reactor.core.publisher.Flux"))); // < 3.1.7 + .or(hasSuperType( + namedOneOf("reactor.core.publisher.Mono", "reactor.core.publisher.Flux"))); // < 3.1.7 } @Override diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/test/java/annotatedsample/ReactorTracedMethods.java b/dd-java-agent/instrumentation/reactor-core-3.1/src/test/java/annotatedsample/ReactorTracedMethods.java index a3450a31e20..36a78853275 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/test/java/annotatedsample/ReactorTracedMethods.java +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/test/java/annotatedsample/ReactorTracedMethods.java @@ -12,39 +12,35 @@ public class ReactorTracedMethods { @WithSpan public static Mono traceAsyncMono(CountDownLatch latch) { - return Mono.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Mono.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Mono traceAsyncFailingMono(CountDownLatch latch, Exception exception) { - return Mono.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Mono.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Flux traceAsyncFlux(CountDownLatch latch) { - return Flux.create( - emitter -> { - await(latch); - emitter.next("hello"); - emitter.complete(); - }); + return Flux.create(emitter -> { + await(latch); + emitter.next("hello"); + emitter.complete(); + }); } @WithSpan public static Flux traceAsyncFailingFlux(CountDownLatch latch, Exception exception) { - return Flux.create( - emitter -> { - await(latch); - emitter.error(exception); - }); + return Flux.create(emitter -> { + await(latch); + emitter.error(exception); + }); } private static void await(CountDownLatch latch) { diff --git a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java index 41daf101e96..45a76db7eb5 100644 --- a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java +++ b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java @@ -12,14 +12,13 @@ public class CaptureConnectSpan @Override public Mono apply(Mono mono) { - return mono.contextWrite( - reactorCtx -> { - final Context context = Context.current(); - if (context != Context.root()) { - return reactorCtx.put(CONNECT_CONTEXT, context); - } else { - return reactorCtx; - } - }); + return mono.contextWrite(reactorCtx -> { + final Context context = Context.current(); + if (context != Context.root()) { + return reactorCtx.put(CONNECT_CONTEXT, context); + } else { + return reactorCtx; + } + }); } } diff --git a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java index 0e58a33b624..85b35c5a634 100644 --- a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java +++ b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java @@ -17,11 +17,10 @@ public void accept(HttpClientRequest clientRequest, Connection connection) { return; } ContextContinuation newContinuation = context.capture(); - ContextContinuation oldContinuation = - connection - .channel() - .attr(CONNECT_PARENT_CONTINUATION_ATTRIBUTE_KEY) - .getAndSet(newContinuation); + ContextContinuation oldContinuation = connection + .channel() + .attr(CONNECT_PARENT_CONTINUATION_ATTRIBUTE_KEY) + .getAndSet(newContinuation); if (null != oldContinuation) { oldContinuation.release(); } diff --git a/dd-java-agent/instrumentation/reactor-netty-1.0/src/test/java/ReactorNettyBaggagePropagationTest.java b/dd-java-agent/instrumentation/reactor-netty-1.0/src/test/java/ReactorNettyBaggagePropagationTest.java index 7ecca93164d..555f1519542 100644 --- a/dd-java-agent/instrumentation/reactor-netty-1.0/src/test/java/ReactorNettyBaggagePropagationTest.java +++ b/dd-java-agent/instrumentation/reactor-netty-1.0/src/test/java/ReactorNettyBaggagePropagationTest.java @@ -46,23 +46,20 @@ class ReactorNettyBaggagePropagationTest extends AbstractInstrumentationTest { static void startServer() throws IOException { capturedBaggage.set(null); mockServer = HttpServer.create(new InetSocketAddress("localhost", 0), 0); - mockServer.createContext( - "/capture", - exchange -> { - capturedBaggage.set(exchange.getRequestHeaders().getFirst("baggage")); - byte[] body = "ok".getBytes(StandardCharsets.UTF_8); - exchange.sendResponseHeaders(200, body.length); - exchange.getResponseBody().write(body); - exchange.close(); - }); + mockServer.createContext("/capture", exchange -> { + capturedBaggage.set(exchange.getRequestHeaders().getFirst("baggage")); + byte[] body = "ok".getBytes(StandardCharsets.UTF_8); + exchange.sendResponseHeaders(200, body.length); + exchange.getResponseBody().write(body); + exchange.close(); + }); serverExecutor = Executors.newCachedThreadPool(); mockServer.setExecutor(serverExecutor); mockServer.start(); - baseUrl = - "http://" - + mockServer.getAddress().getHostString() - + ":" - + mockServer.getAddress().getPort(); + baseUrl = "http://" + + mockServer.getAddress().getHostString() + + ":" + + mockServer.getAddress().getPort(); } @AfterAll diff --git a/dd-java-agent/instrumentation/rediscala-1.8/src/main/java/datadog/trace/instrumentation/rediscala/RediscalaInstrumentation.java b/dd-java-agent/instrumentation/rediscala-1.8/src/main/java/datadog/trace/instrumentation/rediscala/RediscalaInstrumentation.java index 0dd5e434c21..bf9c42fa112 100644 --- a/dd-java-agent/instrumentation/rediscala-1.8/src/main/java/datadog/trace/instrumentation/rediscala/RediscalaInstrumentation.java +++ b/dd-java-agent/instrumentation/rediscala-1.8/src/main/java/datadog/trace/instrumentation/rediscala/RediscalaInstrumentation.java @@ -46,13 +46,12 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return NameMatchers.nameStartsWith("redis.") - .and( - implementsInterface( - namedOneOf( // traits - "redis.Request", - "redis.ActorRequest", - "redis.BufferedRequest", - "redis.RoundRobinPoolRequest"))); + .and(implementsInterface( + namedOneOf( // traits + "redis.Request", + "redis.ActorRequest", + "redis.BufferedRequest", + "redis.RoundRobinPoolRequest"))); } @Override diff --git a/dd-java-agent/instrumentation/redisson/redisson-2.3.0/src/main/java/datadog/trace/instrumentation/redisson23/RedissonInstrumentation.java b/dd-java-agent/instrumentation/redisson/redisson-2.3.0/src/main/java/datadog/trace/instrumentation/redisson23/RedissonInstrumentation.java index 89f26d43be9..2d544188384 100644 --- a/dd-java-agent/instrumentation/redisson/redisson-2.3.0/src/main/java/datadog/trace/instrumentation/redisson23/RedissonInstrumentation.java +++ b/dd-java-agent/instrumentation/redisson/redisson-2.3.0/src/main/java/datadog/trace/instrumentation/redisson23/RedissonInstrumentation.java @@ -68,7 +68,8 @@ public static AgentScope onEnter( } final AgentSpan span = startSpan("redis-command", RedissonClientDecorator.OPERATION_NAME); RedissonClientDecorator.DECORATE.afterStart(span); - RedissonClientDecorator.DECORATE.onPeerConnection(span, thiz.getRedisClient().getAddr()); + RedissonClientDecorator.DECORATE.onPeerConnection( + span, thiz.getRedisClient().getAddr()); RedissonClientDecorator.DECORATE.onStatement(span, command.getCommand().getName()); ((RFuture) command.getPromise()) .addListener(new SpanFinishListener(AgentTracer.captureSpan(span))); @@ -94,7 +95,8 @@ public static AgentScope onEnter( final AgentSpan span = startSpan("redis-command", RedissonClientDecorator.OPERATION_NAME); RedissonClientDecorator.DECORATE.afterStart(span); - RedissonClientDecorator.DECORATE.onPeerConnection(span, thiz.getRedisClient().getAddr()); + RedissonClientDecorator.DECORATE.onPeerConnection( + span, thiz.getRedisClient().getAddr()); List commandResourceNames = new ArrayList<>(); for (CommandData commandData : command.getCommands()) { diff --git a/dd-java-agent/instrumentation/redisson/redisson-3.10.3/src/main/java/datadog/trace/instrumentation/redisson30/RedissonInstrumentation.java b/dd-java-agent/instrumentation/redisson/redisson-3.10.3/src/main/java/datadog/trace/instrumentation/redisson30/RedissonInstrumentation.java index 372a5a1e807..c16cccfe1be 100644 --- a/dd-java-agent/instrumentation/redisson/redisson-3.10.3/src/main/java/datadog/trace/instrumentation/redisson30/RedissonInstrumentation.java +++ b/dd-java-agent/instrumentation/redisson/redisson-3.10.3/src/main/java/datadog/trace/instrumentation/redisson30/RedissonInstrumentation.java @@ -73,7 +73,8 @@ public static AgentScope onEnter( } final AgentSpan span = startSpan("redis-command", RedissonClientDecorator.OPERATION_NAME); RedissonClientDecorator.DECORATE.afterStart(span); - RedissonClientDecorator.DECORATE.onPeerConnection(span, thiz.getRedisClient().getAddr()); + RedissonClientDecorator.DECORATE.onPeerConnection( + span, thiz.getRedisClient().getAddr()); RedissonClientDecorator.DECORATE.onStatement(span, command.getCommand().getName()); promise.whenComplete(new SpanFinishListener(AgentTracer.captureSpan(span))); return activateSpan(span); @@ -104,7 +105,8 @@ public static AgentScope onEnter( } final AgentSpan span = startSpan("redis-command", RedissonClientDecorator.OPERATION_NAME); RedissonClientDecorator.DECORATE.afterStart(span); - RedissonClientDecorator.DECORATE.onPeerConnection(span, thiz.getRedisClient().getAddr()); + RedissonClientDecorator.DECORATE.onPeerConnection( + span, thiz.getRedisClient().getAddr()); List commandResourceNames = new ArrayList<>(); for (CommandData commandData : command.getCommands()) { diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerInstrumentation.java index ab4f661d69c..7d9b76a1dd0 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerInstrumentation.java @@ -117,9 +117,8 @@ public static class SupplierAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) Supplier result) { - result = - new WrapperWithContext.SupplierWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.SupplierWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -128,9 +127,8 @@ public static class CallableAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) Callable result) { - result = - new WrapperWithContext.CallableWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.CallableWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -139,9 +137,8 @@ public static class RunnableAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) Runnable result) { - result = - new WrapperWithContext.RunnableWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.RunnableWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -150,9 +147,8 @@ public static class FunctionAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) Function result) { - result = - new WrapperWithContext.FunctionWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.FunctionWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -161,9 +157,8 @@ public static class CheckedSupplierAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) CheckedSupplier result) { - result = - new WrapperWithContext.CheckedSupplierWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.CheckedSupplierWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -172,9 +167,8 @@ public static class CheckedFunctionAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) CheckedFunction result) { - result = - new WrapperWithContext.CheckedFunctionWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.CheckedFunctionWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -183,9 +177,8 @@ public static class CheckedConsumerAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) CheckedConsumer result) { - result = - new WrapperWithContext.CheckedConsumerWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.CheckedConsumerWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -194,9 +187,8 @@ public static class CheckedRunnableAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) CheckedRunnable result) { - result = - new WrapperWithContext.CheckedRunnableWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.CheckedRunnableWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -205,9 +197,8 @@ public static class ConsumerAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) Consumer result) { - result = - new WrapperWithContext.ConsumerWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.ConsumerWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -216,9 +207,8 @@ public static class CompletionStageAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) Supplier> result) { - result = - new WrapperWithContext.SupplierOfCompletionStageWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.SupplierOfCompletionStageWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } @@ -227,9 +217,8 @@ public static class FutureAdvice { public static void afterExecute( @Advice.Argument(value = 0) CircuitBreaker circuitBreaker, @Advice.Return(readOnly = false) Supplier> result) { - result = - new WrapperWithContext.SupplierOfFutureWithContext<>( - result, CircuitBreakerDecorator.DECORATE, circuitBreaker); + result = new WrapperWithContext.SupplierOfFutureWithContext<>( + result, CircuitBreakerDecorator.DECORATE, circuitBreaker); } } } diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCallableInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCallableInstrumentation.java index 9a48ce40ff5..ec2e21ebd4d 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCallableInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCallableInstrumentation.java @@ -27,9 +27,8 @@ public static class CallableAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void afterExecute( @Advice.FieldValue(value = "callable", readOnly = false) Callable callable) { - callable = - new WrapperWithContext.CallableWithContext<>( - callable, Resilience4jSpanDecorator.DECORATE, null); + callable = new WrapperWithContext.CallableWithContext<>( + callable, Resilience4jSpanDecorator.DECORATE, null); } // 2.0.0+ diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCheckedSupplierInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCheckedSupplierInstrumentation.java index 8748a3faac9..0f3447ac036 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCheckedSupplierInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCheckedSupplierInstrumentation.java @@ -26,9 +26,8 @@ public static class CheckedSupplierAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void afterExecute( @Advice.FieldValue(value = "supplier", readOnly = false) CheckedSupplier supplier) { - supplier = - new WrapperWithContext.CheckedSupplierWithContext<>( - supplier, Resilience4jSpanDecorator.DECORATE, null); + supplier = new WrapperWithContext.CheckedSupplierWithContext<>( + supplier, Resilience4jSpanDecorator.DECORATE, null); } } } diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCompletionStageInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCompletionStageInstrumentation.java index 36e4414f4cb..e5c7c056135 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCompletionStageInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackCompletionStageInstrumentation.java @@ -29,9 +29,8 @@ public static class CompletionStageAdvice { public static void afterExecute( @Advice.FieldValue(value = "stageSupplier", readOnly = false) Supplier> stageSupplier) { - stageSupplier = - new WrapperWithContext.SupplierOfCompletionStageWithContext<>( - stageSupplier, Resilience4jSpanDecorator.DECORATE, null); + stageSupplier = new WrapperWithContext.SupplierOfCompletionStageWithContext<>( + stageSupplier, Resilience4jSpanDecorator.DECORATE, null); } // 2.0.0+ diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackSupplierInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackSupplierInstrumentation.java index dfab63300fb..1624b263459 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackSupplierInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackSupplierInstrumentation.java @@ -27,9 +27,8 @@ public static class SupplierAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void afterExecute( @Advice.FieldValue(value = "supplier", readOnly = false) Supplier supplier) { - supplier = - new WrapperWithContext.SupplierWithContext<>( - supplier, Resilience4jSpanDecorator.DECORATE, null); + supplier = new WrapperWithContext.SupplierWithContext<>( + supplier, Resilience4jSpanDecorator.DECORATE, null); } // 2.0.0+ diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryInstrumentation.java index 8857a2a3ce0..3c768bbd439 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryInstrumentation.java @@ -119,9 +119,8 @@ public static class CheckedFunctionAdvice { public static void afterExecute( @Advice.Argument(value = 0) Retry retry, @Advice.Return(readOnly = false) CheckedFunction result) { - result = - new WrapperWithContext.CheckedFunctionWithContext<>( - result, RetryDecorator.DECORATE, retry); + result = new WrapperWithContext.CheckedFunctionWithContext<>( + result, RetryDecorator.DECORATE, retry); } } @@ -130,9 +129,8 @@ public static class CheckedSupplierAdvice { public static void afterExecute( @Advice.Argument(value = 0) Retry retry, @Advice.Return(readOnly = false) CheckedSupplier result) { - result = - new WrapperWithContext.CheckedSupplierWithContext<>( - result, RetryDecorator.DECORATE, retry); + result = new WrapperWithContext.CheckedSupplierWithContext<>( + result, RetryDecorator.DECORATE, retry); } } @@ -141,9 +139,8 @@ public static class CheckedRunnableAdvice { public static void afterExecute( @Advice.Argument(value = 0) Retry retry, @Advice.Return(readOnly = false) CheckedRunnable result) { - result = - new WrapperWithContext.CheckedRunnableWithContext<>( - result, RetryDecorator.DECORATE, retry); + result = new WrapperWithContext.CheckedRunnableWithContext<>( + result, RetryDecorator.DECORATE, retry); } } @@ -152,9 +149,8 @@ public static class CompletionStageAdvice { public static void afterExecute( @Advice.Argument(value = 0) Retry retry, @Advice.Return(readOnly = false) Supplier> result) { - result = - new WrapperWithContext.SupplierOfCompletionStageWithContext<>( - result, RetryDecorator.DECORATE, retry); + result = new WrapperWithContext.SupplierOfCompletionStageWithContext<>( + result, RetryDecorator.DECORATE, retry); } } diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/WrapperWithContext.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/WrapperWithContext.java index 6d4553508d1..2b24c3c959b 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/WrapperWithContext.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/WrapperWithContext.java @@ -214,12 +214,9 @@ public SupplierOfCompletionStageWithContext( @Override public CompletionStage get() { try (ContextScope ignore = activateScope()) { - return delegate - .get() - .whenComplete( - (v, e) -> { - finishSpanIfNeeded(); - }); + return delegate.get().whenComplete((v, e) -> { + finishSpanIfNeeded(); + }); } } } @@ -239,11 +236,9 @@ public Future get() { try (ContextScope ignore = activateScope()) { Future future = delegate.get(); if (future instanceof CompletableFuture) { - ((CompletableFuture) future) - .whenComplete( - (v, e) -> { - finishSpanIfNeeded(); - }); + ((CompletableFuture) future).whenComplete((v, e) -> { + finishSpanIfNeeded(); + }); return future; } return new FinishOnGetFuture<>(future, this); diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerOperatorInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerOperatorInstrumentation.java index 7dbc912eb44..09e0ec1a1e9 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerOperatorInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/CircuitBreakerOperatorInstrumentation.java @@ -35,13 +35,11 @@ public static void after( @Advice.Return(readOnly = false) Publisher result, @Advice.FieldValue(value = "circuitBreaker") CircuitBreaker circuitBreaker) { - result = - ReactorHelper.wrapPublisher( - result, - CircuitBreakerDecorator.DECORATE, - circuitBreaker, - ReactorHelper.putInto( - InstrumentationContext.get(Publisher.class, HandoffContext.class))); + result = ReactorHelper.wrapPublisher( + result, + CircuitBreakerDecorator.DECORATE, + circuitBreaker, + ReactorHelper.putInto(InstrumentationContext.get(Publisher.class, HandoffContext.class))); } } } diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackOperatorInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackOperatorInstrumentation.java index ed9f5ebbd2f..4350e450dfb 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackOperatorInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/FallbackOperatorInstrumentation.java @@ -26,9 +26,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("decorate")) - .and( - takesArgument(0, named("java.util.function.UnaryOperator")) - .and(returns(named("java.util.function.Function")))), + .and(takesArgument(0, named("java.util.function.UnaryOperator")) + .and(returns(named("java.util.function.Function")))), FallbackOperatorInstrumentation.class.getName() + "$DecorateAdvice"); } @@ -38,11 +37,10 @@ public static class DecorateAdvice { public static void after( @Advice.Return(readOnly = false) Function, Publisher> result) { - result = - ReactorHelper.wrapFunction( - result, - ReactorHelper.putIfAbsentInto( - InstrumentationContext.get(Publisher.class, HandoffContext.class))); + result = ReactorHelper.wrapFunction( + result, + ReactorHelper.putIfAbsentInto( + InstrumentationContext.get(Publisher.class, HandoffContext.class))); } // 2.0.0+ diff --git a/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryOperatorInstrumentation.java b/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryOperatorInstrumentation.java index 1b395be55ab..5fcce31e5af 100644 --- a/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryOperatorInstrumentation.java +++ b/dd-java-agent/instrumentation/resilience4j/resilience4j-reactor-2.0/src/main/java/datadog/trace/instrumentation/resilience4j/RetryOperatorInstrumentation.java @@ -34,13 +34,11 @@ public static void after( @Advice.Return(readOnly = false) Publisher result, @Advice.FieldValue(value = "retry") Retry retry) { - result = - ReactorHelper.wrapPublisher( - result, - RetryDecorator.DECORATE, - retry, - ReactorHelper.putInto( - InstrumentationContext.get(Publisher.class, HandoffContext.class))); + result = ReactorHelper.wrapPublisher( + result, + RetryDecorator.DECORATE, + retry, + ReactorHelper.putInto(InstrumentationContext.get(Publisher.class, HandoffContext.class))); } } } diff --git a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/DecodedFormParametersInstrumentation.java b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/DecodedFormParametersInstrumentation.java index 6cb2eb998ca..436d10d8db6 100644 --- a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/DecodedFormParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/DecodedFormParametersInstrumentation.java @@ -65,11 +65,10 @@ public ReferenceProvider runtimeMuzzleReferences() { } public static class CustomReferenceProvider implements ReferenceProvider { - private static final Reference BASE_HTTP_REQUEST_DECODED_PARAMETERS = - new Reference.Builder("org.jboss.resteasy.plugins.server.BaseHttpRequest") - .withField( - new String[0], 0, "decodedFormParameters", "Ljavax/ws/rs/core/MultivaluedMap;") - .build(); + private static final Reference BASE_HTTP_REQUEST_DECODED_PARAMETERS = new Reference.Builder( + "org.jboss.resteasy.plugins.server.BaseHttpRequest") + .withField(new String[0], 0, "decodedFormParameters", "Ljavax/ws/rs/core/MultivaluedMap;") + .build(); private static final Reference HTTP_SERVLET_INPUT_MESSAGE_DECODED_PARAMETERS = new Reference.Builder("org.jboss.resteasy.plugins.server.servlet.HttpServletInputMessage") @@ -77,11 +76,10 @@ public static class CustomReferenceProvider implements ReferenceProvider { new String[0], 0, "decodedFormParameters", "Ljavax/ws/rs/core/MultivaluedMap;") .build(); - private static final Reference NETTY_HTTP_REQUEST_DECODED_PARAMETERS = - new Reference.Builder(NETTY_HTTP_REQUEST_CLASS_NAME) - .withField( - new String[0], 0, "decodedFormParameters", "Ljavax/ws/rs/core/MultivaluedMap;") - .build(); + private static final Reference NETTY_HTTP_REQUEST_DECODED_PARAMETERS = new Reference.Builder( + NETTY_HTTP_REQUEST_CLASS_NAME) + .withField(new String[0], 0, "decodedFormParameters", "Ljavax/ws/rs/core/MultivaluedMap;") + .build(); @Override public Iterable buildReferences(TypePool typePool) { diff --git a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MessageBodyReaderInvocationInstrumentation.java b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MessageBodyReaderInvocationInstrumentation.java index a9e5ec578c7..5262f4ab216 100644 --- a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MessageBodyReaderInvocationInstrumentation.java +++ b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MessageBodyReaderInvocationInstrumentation.java @@ -81,9 +81,8 @@ static void after( BlockResponseFunction blockResponseFunction = reqCtx.getBlockResponseFunction(); if (blockResponseFunction != null) { blockResponseFunction.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); - t = - new BlockingException( - "Blocked request (for AbstractReaderInterceptorContext/readFrom)"); + t = new BlockingException( + "Blocked request (for AbstractReaderInterceptorContext/readFrom)"); reqCtx.getTraceSegment().effectivelyBlocked(); } } diff --git a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MultipartFormDataReaderInstrumentation.java b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MultipartFormDataReaderInstrumentation.java index 4a435fb0c93..ce4c7d79a9b 100644 --- a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MultipartFormDataReaderInstrumentation.java +++ b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/src/main/java/datadog/trace/instrumentation/resteasy/MultipartFormDataReaderInstrumentation.java @@ -54,10 +54,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("readFrom") .and(takesArguments(6)) - .and( - returns( - named( - "org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput"))), + .and(returns( + named("org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput"))), MultipartFormDataReaderInstrumentation.class.getName() + "$ReadFromAdvice"); } @@ -95,9 +93,8 @@ static void after( } Flow flow = callback.apply(reqCtx, m); - BlockingException be = - MultipartHelper.tryBlock( - reqCtx, flow, "Blocked request (for MultipartFormDataInput/readFrom)"); + BlockingException be = MultipartHelper.tryBlock( + reqCtx, flow, "Blocked request (for MultipartFormDataInput/readFrom)"); if (be != null) { t = be; } @@ -108,9 +105,8 @@ static void after( if (!filenames.isEmpty()) { Flow filenamesFlow = filenamesCallback.apply(reqCtx, filenames); if (t == null) { - BlockingException be = - MultipartHelper.tryBlock( - reqCtx, filenamesFlow, "Blocked request (multipart file upload)"); + BlockingException be = MultipartHelper.tryBlock( + reqCtx, filenamesFlow, "Blocked request (multipart file upload)"); if (be != null) { t = be; } @@ -122,9 +118,8 @@ static void after( List filesContent = MultipartHelper.collectFilesContent(ret); if (!filesContent.isEmpty()) { Flow contentFlow = contentCallback.apply(reqCtx, filesContent); - BlockingException be = - MultipartHelper.tryBlock( - reqCtx, contentFlow, "Blocked request (multipart file upload content)"); + BlockingException be = MultipartHelper.tryBlock( + reqCtx, contentFlow, "Blocked request (multipart file upload content)"); if (be != null) { t = be; } diff --git a/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/ResourceDecorator.java b/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/ResourceDecorator.java index a92b5ac0730..f190a524b2a 100644 --- a/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/ResourceDecorator.java +++ b/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/ResourceDecorator.java @@ -40,9 +40,8 @@ public void onRestletSpan( final AgentSpan parent, final ServerResource serverResource, final Method method) { - Series
headers = - (Series
) - serverResource.getRequest().getAttributes().get("org.restlet.http.headers"); + Series
headers = (Series
) + serverResource.getRequest().getAttributes().get("org.restlet.http.headers"); String route = headers.getFirstValue(RESTLET_ROUTE); span.setSpanType(InternalSpanTypes.HTTP_SERVER); diff --git a/dd-java-agent/instrumentation/rs/jakarta-rs-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakarta3/JakartaRsAnnotationsInstrumentation.java b/dd-java-agent/instrumentation/rs/jakarta-rs-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakarta3/JakartaRsAnnotationsInstrumentation.java index d7fbe26311d..43a4822b2d1 100644 --- a/dd-java-agent/instrumentation/rs/jakarta-rs-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakarta3/JakartaRsAnnotationsInstrumentation.java +++ b/dd-java-agent/instrumentation/rs/jakarta-rs-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakarta3/JakartaRsAnnotationsInstrumentation.java @@ -69,9 +69,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { - return hasSuperType( - declaresAnnotation(named(hierarchyMarkerType())) - .or(declaresMethod(isAnnotatedWith(named(hierarchyMarkerType()))))); + return hasSuperType(declaresAnnotation(named(hierarchyMarkerType())) + .or(declaresMethod(isAnnotatedWith(named(hierarchyMarkerType()))))); } @Override diff --git a/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1.1.1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java b/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1.1.1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java index 8dc6dfdead0..bdf7d58d25f 100644 --- a/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1.1.1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java +++ b/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1.1.1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java @@ -67,9 +67,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { - return hasSuperType( - declaresAnnotation(named(hierarchyMarkerType())) - .or(declaresMethod(isAnnotatedWith(named(hierarchyMarkerType()))))); + return hasSuperType(declaresAnnotation(named(hierarchyMarkerType())) + .or(declaresMethod(isAnnotatedWith(named(hierarchyMarkerType()))))); } @Override diff --git a/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-2.0/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java b/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-2.0/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java index 963637e91f8..aa49a6831f2 100644 --- a/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-2.0/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java +++ b/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-2.0/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java @@ -77,9 +77,8 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { - return hasSuperType( - declaresAnnotation(named(hierarchyMarkerType())) - .or(declaresMethod(isAnnotatedWith(named(hierarchyMarkerType()))))); + return hasSuperType(declaresAnnotation(named(hierarchyMarkerType())) + .or(declaresMethod(isAnnotatedWith(named(hierarchyMarkerType()))))); } @Override diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-1.0/src/main/java/datadog/trace/instrumentation/rxjava/TracedOnSubscribe.java b/dd-java-agent/instrumentation/rxjava/rxjava-1.0/src/main/java/datadog/trace/instrumentation/rxjava/TracedOnSubscribe.java index f88a82fa3d6..5d41ff95302 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-1.0/src/main/java/datadog/trace/instrumentation/rxjava/TracedOnSubscribe.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-1.0/src/main/java/datadog/trace/instrumentation/rxjava/TracedOnSubscribe.java @@ -34,9 +34,8 @@ protected String instrumentationName() { @Override public void call(final Subscriber subscriber) { - final AgentSpan span = - startSpan( - instrumentationName(), operationName, parent != null ? parent.spanContext() : null); + final AgentSpan span = startSpan( + instrumentationName(), operationName, parent != null ? parent.spanContext() : null); afterStart(span); try (final ContextScope scope = activateSpan(span)) { diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/MaybeInstrumentation.java b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/MaybeInstrumentation.java index 2608e91873d..08c5f35637b 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/MaybeInstrumentation.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/MaybeInstrumentation.java @@ -50,7 +50,8 @@ public static ContextScope onSubscribe( @Advice.This final Maybe maybe, @Advice.Argument(value = 0, readOnly = false) MaybeObserver observer) { if (observer != null) { - Context parentContext = InstrumentationContext.get(Maybe.class, Context.class).get(maybe); + Context parentContext = + InstrumentationContext.get(Maybe.class, Context.class).get(maybe); if (parentContext != null) { // wrap the observer so spans from its events treat the captured span as their parent observer = new TracingMaybeObserver<>(observer, parentContext); diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/SingleInstrumentation.java b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/SingleInstrumentation.java index a94a48f2968..08d8860489a 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/SingleInstrumentation.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/main/java/datadog/trace/instrumentation/rxjava2/SingleInstrumentation.java @@ -51,7 +51,8 @@ public static ContextScope onSubscribe( @Advice.This final Single single, @Advice.Argument(value = 0, readOnly = false) SingleObserver observer) { if (observer != null) { - Context parentContext = InstrumentationContext.get(Single.class, Context.class).get(single); + Context parentContext = + InstrumentationContext.get(Single.class, Context.class).get(single); if (parentContext != null) { // wrap the observer so spans from its events treat the captured span as their parent observer = new TracingSingleObserver<>(observer, parentContext); diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/java/annotatedsample/RxJava2TracedMethods.java b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/java/annotatedsample/RxJava2TracedMethods.java index 5036f5e0ff7..2ede5d7b015 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/java/annotatedsample/RxJava2TracedMethods.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/java/annotatedsample/RxJava2TracedMethods.java @@ -19,85 +19,76 @@ public static Completable traceAsyncCompletable(CountDownLatch latch) { @WithSpan public static Completable traceAsyncFailingCompletable( CountDownLatch latch, Exception exception) { - return Completable.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Completable.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Maybe traceAsyncMaybe(CountDownLatch latch) { - return Maybe.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Maybe.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Maybe traceAsyncFailingMaybe(CountDownLatch latch, Exception exception) { - return Maybe.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Maybe.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Single traceAsyncSingle(CountDownLatch latch) { - return Single.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Single.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Single traceAsyncFailingSingle(CountDownLatch latch, Exception exception) { - return Single.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Single.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Observable traceAsyncObservable(CountDownLatch latch) { - return Observable.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Observable.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Observable traceAsyncFailingObservable( CountDownLatch latch, Exception exception) { - return Observable.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Observable.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Flowable traceAsyncFlowable(CountDownLatch latch) { - return Flowable.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Flowable.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Flowable traceAsyncFailingFlowable( CountDownLatch latch, Exception exception) { - return Flowable.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Flowable.fromCallable(() -> { + await(latch); + throw exception; + }); } private static void await(CountDownLatch latch) { diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/MaybeInstrumentation.java b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/MaybeInstrumentation.java index 0bc833922be..edcecb6505b 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/MaybeInstrumentation.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/MaybeInstrumentation.java @@ -50,7 +50,8 @@ public static ContextScope onSubscribe( @Advice.This final Maybe maybe, @Advice.Argument(value = 0, readOnly = false) MaybeObserver observer) { if (observer != null) { - Context parentContext = InstrumentationContext.get(Maybe.class, Context.class).get(maybe); + Context parentContext = + InstrumentationContext.get(Maybe.class, Context.class).get(maybe); if (parentContext != null) { observer = new TracingMaybeObserver<>(observer, parentContext); // attach the context here in case additional observers are created during subscribe diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/SingleInstrumentation.java b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/SingleInstrumentation.java index 3dfc1382da2..7fd0aea1abd 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/SingleInstrumentation.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/main/java/datadog/trace/instrumentation/rxjava3/SingleInstrumentation.java @@ -51,7 +51,8 @@ public static ContextScope onSubscribe( @Advice.This final Single single, @Advice.Argument(value = 0, readOnly = false) SingleObserver observer) { if (observer != null) { - Context parentContext = InstrumentationContext.get(Single.class, Context.class).get(single); + Context parentContext = + InstrumentationContext.get(Single.class, Context.class).get(single); if (parentContext != null) { observer = new TracingSingleObserver<>(observer, parentContext); // attach the context here in case additional observers are created during subscribe diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/annotatedsample/RxJava3TracedMethods.java b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/annotatedsample/RxJava3TracedMethods.java index 163f5fb4b69..82fcccdaf24 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/annotatedsample/RxJava3TracedMethods.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/annotatedsample/RxJava3TracedMethods.java @@ -19,85 +19,76 @@ public static Completable traceAsyncCompletable(CountDownLatch latch) { @WithSpan public static Completable traceAsyncFailingCompletable( CountDownLatch latch, Exception exception) { - return Completable.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Completable.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Maybe traceAsyncMaybe(CountDownLatch latch) { - return Maybe.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Maybe.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Maybe traceAsyncFailingMaybe(CountDownLatch latch, Exception exception) { - return Maybe.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Maybe.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Single traceAsyncSingle(CountDownLatch latch) { - return Single.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Single.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Single traceAsyncFailingSingle(CountDownLatch latch, Exception exception) { - return Single.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Single.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Observable traceAsyncObservable(CountDownLatch latch) { - return Observable.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Observable.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Observable traceAsyncFailingObservable( CountDownLatch latch, Exception exception) { - return Observable.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Observable.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan public static Flowable traceAsyncFlowable(CountDownLatch latch) { - return Flowable.fromCallable( - () -> { - await(latch); - return "hello"; - }); + return Flowable.fromCallable(() -> { + await(latch); + return "hello"; + }); } @WithSpan public static Flowable traceAsyncFailingFlowable( CountDownLatch latch, Exception exception) { - return Flowable.fromCallable( - () -> { - await(latch); - throw exception; - }); + return Flowable.fromCallable(() -> { + await(latch); + throw exception; + }); } @WithSpan diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3InteropTest.java b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3InteropTest.java index 207ca3f6ca1..3509f5611b2 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3InteropTest.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3InteropTest.java @@ -48,85 +48,75 @@ static T runUnderParent(Supplier work) { @Test void fromCompletionStageSync() { Integer result = - Worker.runUnderParent( - () -> - Single.fromCompletionStage(CompletableFuture.completedFuture(1)) - .map(Worker::child) - .blockingGet()); + Worker.runUnderParent(() -> Single.fromCompletionStage(CompletableFuture.completedFuture(1)) + .map(Worker::child) + .blockingGet()); assertEquals(2, result); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("interop-parent").resourceName("interop-parent"), - span() - .childOfIndex(0) - .operationName("child") - .resourceName("child") - .tags(componentTrace(), defaultTags()))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("interop-parent").resourceName("interop-parent"), + span() + .childOfIndex(0) + .operationName("child") + .resourceName("child") + .tags(componentTrace(), defaultTags()))); } @Test void fromCompletionStageAsync() { - Integer result = - Worker.runUnderParent( - () -> - Single.fromCompletionStage(CompletableFuture.supplyAsync(() -> 1)) - .map(Worker::child) - .blockingGet()); + Integer result = Worker.runUnderParent( + () -> Single.fromCompletionStage(CompletableFuture.supplyAsync(() -> 1)) + .map(Worker::child) + .blockingGet()); assertEquals(2, result); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("interop-parent").resourceName("interop-parent"), - span() - .childOfIndex(0) - .operationName("child") - .resourceName("child") - .tags(componentTrace(), defaultTags()))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("interop-parent").resourceName("interop-parent"), + span() + .childOfIndex(0) + .operationName("child") + .resourceName("child") + .tags(componentTrace(), defaultTags()))); } @Test void fromOptional() { - Integer result = - Worker.runUnderParent( - () -> Maybe.fromOptional(Optional.of(1)).map(Worker::child).blockingGet()); + Integer result = Worker.runUnderParent( + () -> Maybe.fromOptional(Optional.of(1)).map(Worker::child).blockingGet()); assertEquals(2, result); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("interop-parent").resourceName("interop-parent"), - span() - .childOfIndex(0) - .operationName("child") - .resourceName("child") - .tags(componentTrace(), defaultTags()))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("interop-parent").resourceName("interop-parent"), + span() + .childOfIndex(0) + .operationName("child") + .resourceName("child") + .tags(componentTrace(), defaultTags()))); } @Test void fromStream() { - List result = - Worker.runUnderParent( - () -> Flowable.fromStream(Stream.of(1, 2)).map(Worker::child).toList().blockingGet()); + List result = Worker.runUnderParent( + () -> Flowable.fromStream(Stream.of(1, 2)).map(Worker::child).toList().blockingGet()); assertEquals(2, result.size()); assertEquals(2, result.get(0)); assertEquals(3, result.get(1)); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("interop-parent").resourceName("interop-parent"), - span() - .childOfIndex(0) - .operationName("child") - .resourceName("child") - .tags(componentTrace(), defaultTags()), - span() - .childOfIndex(0) - .operationName("child") - .resourceName("child") - .tags(componentTrace(), defaultTags()))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("interop-parent").resourceName("interop-parent"), + span() + .childOfIndex(0) + .operationName("child") + .resourceName("child") + .tags(componentTrace(), defaultTags()), + span() + .childOfIndex(0) + .operationName("child") + .resourceName("child") + .tags(componentTrace(), defaultTags()))); } } diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3ResultExtensionTest.java b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3ResultExtensionTest.java index 500a92c7637..3d6893bf9fe 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3ResultExtensionTest.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3ResultExtensionTest.java @@ -175,10 +175,8 @@ void success(ReactiveType type) { type.runTerminal(asyncType); String method = "traceAsync" + type.type; - assertTraces( - trace( - otelSpan("RxJava3TracedMethods." + method) - .tags(defaultTags(), otelComponent(), internalSpanKind()))); + assertTraces(trace(otelSpan("RxJava3TracedMethods." + method) + .tags(defaultTags(), otelComponent(), internalSpanKind()))); } @ParameterizedTest(name = "test WithSpan annotated async method failing {0}") @@ -194,15 +192,13 @@ void failing(ReactiveType type) { assertThrows(IllegalStateException.class, () -> type.runTerminal(asyncType)); String method = "traceAsyncFailing" + type.type; - assertTraces( - trace( - otelSpan("RxJava3TracedMethods." + method) - .error() - .tags( - defaultTags(), - otelComponent(), - internalSpanKind(), - error(IllegalStateException.class, EXCEPTION_MESSAGE)))); + assertTraces(trace(otelSpan("RxJava3TracedMethods." + method) + .error() + .tags( + defaultTags(), + otelComponent(), + internalSpanKind(), + error(IllegalStateException.class, EXCEPTION_MESSAGE)))); } @ParameterizedTest(name = "test WithSpan annotated async method cancelled {0}") @@ -217,10 +213,8 @@ void cancelled(ReactiveType type) { type.subscribeAndDispose(asyncType); String method = "traceAsync" + type.type; - assertTraces( - trace( - otelSpan("RxJava3TracedMethods." + method) - .tags(defaultTags(), otelComponent(), internalSpanKind()))); + assertTraces(trace(otelSpan("RxJava3TracedMethods." + method) + .tags(defaultTags(), otelComponent(), internalSpanKind()))); } @ParameterizedTest(name = "test WithSpan annotated never async method cancelled {0}") @@ -233,9 +227,7 @@ void cancelledNever(ReactiveType type) { type.subscribeAndDispose(asyncType); String method = "traceAsyncNever" + type.type; - assertTraces( - trace( - otelSpan("RxJava3TracedMethods." + method) - .tags(defaultTags(), otelComponent(), internalSpanKind()))); + assertTraces(trace(otelSpan("RxJava3TracedMethods." + method) + .tags(defaultTags(), otelComponent(), internalSpanKind()))); } } diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3Test.java b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3Test.java index 092156d84ee..2501928e1fa 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3Test.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/RxJava3Test.java @@ -124,22 +124,21 @@ static void cancelUnderTrace(Supplier publisherSupplier) { } try { - flowable.subscribe( - new Subscriber() { - @Override - public void onSubscribe(Subscription subscription) { - subscription.cancel(); - } - - @Override - public void onNext(Object t) {} - - @Override - public void onError(Throwable error) {} - - @Override - public void onComplete() {} - }); + flowable.subscribe(new Subscriber() { + @Override + public void onSubscribe(Subscription subscription) { + subscription.cancel(); + } + + @Override + public void onNext(Object t) {} + + @Override + public void onError(Throwable error) {} + + @Override + public void onComplete() {} + }); } finally { scope.close(); span.finish(); @@ -157,73 +156,34 @@ static Object runUnderTraceParent(Supplier work) { static List publisherSuccessArgs() { return Arrays.asList( + Arguments.of("basic maybe", new Object[] {2}, 1, (Supplier) + () -> Maybe.just(1).map(Worker::addOne)), + Arguments.of("two operations maybe", new Object[] {4}, 2, (Supplier) + () -> Maybe.just(2).map(Worker::addOne).map(Worker::addOne)), + Arguments.of("delayed maybe", new Object[] {4}, 1, (Supplier) + () -> Maybe.just(3).delay(100, MILLISECONDS).map(Worker::addOne)), Arguments.of( - "basic maybe", - new Object[] {2}, - 1, - (Supplier) () -> Maybe.just(1).map(Worker::addOne)), - Arguments.of( - "two operations maybe", - new Object[] {4}, - 2, - (Supplier) () -> Maybe.just(2).map(Worker::addOne).map(Worker::addOne)), - Arguments.of( - "delayed maybe", - new Object[] {4}, - 1, - (Supplier) () -> Maybe.just(3).delay(100, MILLISECONDS).map(Worker::addOne)), - Arguments.of( - "delayed twice maybe", - new Object[] {6}, - 2, - (Supplier) - () -> - Maybe.just(4) - .delay(100, MILLISECONDS) - .map(Worker::addOne) - .delay(100, MILLISECONDS) - .map(Worker::addOne)), - Arguments.of( - "basic flowable", - new Object[] {6, 7}, - 2, - (Supplier) - () -> Flowable.fromIterable(Arrays.asList(5, 6)).map(Worker::addOne)), - Arguments.of( - "two operations flowable", - new Object[] {8, 9}, - 4, - (Supplier) - () -> - Flowable.fromIterable(Arrays.asList(6, 7)) - .map(Worker::addOne) - .map(Worker::addOne)), - Arguments.of( - "delayed flowable", - new Object[] {8, 9}, - 2, - (Supplier) - () -> - Flowable.fromIterable(Arrays.asList(7, 8)) - .delay(100, MILLISECONDS) - .map(Worker::addOne)), - Arguments.of( - "delayed twice flowable", - new Object[] {10, 11}, - 4, - (Supplier) - () -> - Flowable.fromIterable(Arrays.asList(8, 9)) - .delay(100, MILLISECONDS) - .map(Worker::addOne) - .delay(100, MILLISECONDS) - .map(Worker::addOne)), - Arguments.of( - "maybe from callable", - new Object[] {12}, - 2, - (Supplier) - () -> Maybe.fromCallable(() -> Worker.addOne(10)).map(Worker::addOne))); + "delayed twice maybe", new Object[] {6}, 2, (Supplier) () -> Maybe.just(4) + .delay(100, MILLISECONDS) + .map(Worker::addOne) + .delay(100, MILLISECONDS) + .map(Worker::addOne)), + Arguments.of("basic flowable", new Object[] {6, 7}, 2, (Supplier) + () -> Flowable.fromIterable(Arrays.asList(5, 6)).map(Worker::addOne)), + Arguments.of("two operations flowable", new Object[] {8, 9}, 4, (Supplier) () -> + Flowable.fromIterable(Arrays.asList(6, 7)).map(Worker::addOne).map(Worker::addOne)), + Arguments.of("delayed flowable", new Object[] {8, 9}, 2, (Supplier) + () -> Flowable.fromIterable(Arrays.asList(7, 8)) + .delay(100, MILLISECONDS) + .map(Worker::addOne)), + Arguments.of("delayed twice flowable", new Object[] {10, 11}, 4, (Supplier) + () -> Flowable.fromIterable(Arrays.asList(8, 9)) + .delay(100, MILLISECONDS) + .map(Worker::addOne) + .delay(100, MILLISECONDS) + .map(Worker::addOne)), + Arguments.of("maybe from callable", new Object[] {12}, 2, (Supplier) + () -> Maybe.fromCallable(() -> Worker.addOne(10)).map(Worker::addOne))); } @ParameterizedTest(name = "Publisher ''{0}'' test") @@ -238,26 +198,23 @@ void publisherSuccess(String name, Object[] expected, int workSpans, Supplier publisherErrorArgs() { return Arrays.asList( Arguments.of( "maybe", (Supplier) () -> Maybe.error(new RuntimeException(EXCEPTION_MESSAGE))), - Arguments.of( - "flowable", - (Supplier) () -> Flowable.error(new RuntimeException(EXCEPTION_MESSAGE)))); + Arguments.of("flowable", (Supplier) + () -> Flowable.error(new RuntimeException(EXCEPTION_MESSAGE)))); } @ParameterizedTest(name = "Publisher error ''{0}'' test") @@ -281,45 +237,35 @@ void publisherError(String name, Supplier supplier) { assertThrows(RuntimeException.class, () -> Worker.assemblePublisherUnderTrace(supplier)); assertEquals(EXCEPTION_MESSAGE, exception.getMessage()); - assertTraces( - trace( - SORT_BY_START_TIME, - span() - .root() - .operationName("trace-parent") - .resourceName("trace-parent") - .error() - .tags( - componentTrace(), - error(RuntimeException.class, EXCEPTION_MESSAGE), - defaultTags()), - // It's important that we don't attach errors at the reactive level so that we don't - // impact the spans on reactive integrations such as netty and lettuce. - span() - .id(Worker.publisherParentId) - .childOf(Worker.traceParentId) - .operationName("publisher-parent") - .resourceName("publisher-parent") - .tags(defaultTags()))); + assertTraces(trace( + SORT_BY_START_TIME, + span() + .root() + .operationName("trace-parent") + .resourceName("trace-parent") + .error() + .tags( + componentTrace(), error(RuntimeException.class, EXCEPTION_MESSAGE), defaultTags()), + // It's important that we don't attach errors at the reactive level so that we don't + // impact the spans on reactive integrations such as netty and lettuce. + span() + .id(Worker.publisherParentId) + .childOf(Worker.traceParentId) + .operationName("publisher-parent") + .resourceName("publisher-parent") + .tags(defaultTags()))); } // --- Publisher step error ------------------------------------------------ static List publisherStepErrorArgs() { return Arrays.asList( - Arguments.of( - "basic maybe failure", - 1, - (Supplier) - () -> Maybe.just(1).map(Worker::addOne).map(i -> Worker.throwException())), - Arguments.of( - "basic flowable failure", - 1, - (Supplier) - () -> - Flowable.fromIterable(Arrays.asList(5, 6)) - .map(Worker::addOne) - .map(i -> Worker.throwException()))); + Arguments.of("basic maybe failure", 1, (Supplier) + () -> Maybe.just(1).map(Worker::addOne).map(i -> Worker.throwException())), + Arguments.of("basic flowable failure", 1, (Supplier) + () -> Flowable.fromIterable(Arrays.asList(5, 6)) + .map(Worker::addOne) + .map(i -> Worker.throwException()))); } @ParameterizedTest(name = "Publisher step ''{0}'' test") @@ -330,28 +276,24 @@ void publisherStepError(String name, int workSpans, Supplier supplier) { assertEquals(EXCEPTION_MESSAGE, exception.getMessage()); SpanMatcher[] matchers = new SpanMatcher[workSpans + 2]; - matchers[0] = - span() - .root() - .operationName("trace-parent") - .resourceName("trace-parent") - .error() - .tags( - componentTrace(), error(RuntimeException.class, EXCEPTION_MESSAGE), defaultTags()); - matchers[1] = - span() - .id(Worker.publisherParentId) - .childOf(Worker.traceParentId) - .operationName("publisher-parent") - .resourceName("publisher-parent") - .tags(defaultTags()); + matchers[0] = span() + .root() + .operationName("trace-parent") + .resourceName("trace-parent") + .error() + .tags(componentTrace(), error(RuntimeException.class, EXCEPTION_MESSAGE), defaultTags()); + matchers[1] = span() + .id(Worker.publisherParentId) + .childOf(Worker.traceParentId) + .operationName("publisher-parent") + .resourceName("publisher-parent") + .tags(defaultTags()); for (int i = 0; i < workSpans; i++) { - matchers[2 + i] = - span() - .childOf(Worker.publisherParentId) - .operationName("addOne") - .resourceName("addOne") - .tags(componentTrace(), defaultTags()); + matchers[2 + i] = span() + .childOf(Worker.publisherParentId) + .operationName("addOne") + .resourceName("addOne") + .tags(componentTrace(), defaultTags()); } assertTraces(trace(SORT_BY_START_TIME, matchers)); @@ -365,9 +307,8 @@ static List cancelArgs() { Arguments.of( "basic flowable", (Supplier) () -> Flowable.fromIterable(Arrays.asList(5, 6))), Arguments.of("basic single", (Supplier) () -> Single.just(1)), - Arguments.of( - "basic observable", - (Supplier) () -> Observable.fromIterable(Arrays.asList(5, 6))), + Arguments.of("basic observable", (Supplier) + () -> Observable.fromIterable(Arrays.asList(5, 6))), Arguments.of("basic completable", (Supplier) Completable::complete)); } @@ -376,44 +317,34 @@ static List cancelArgs() { void cancel(String name, Supplier supplier) { Worker.cancelUnderTrace(supplier); - assertTraces( - trace( - SORT_BY_START_TIME, - span() - .root() - .operationName("trace-parent") - .resourceName("trace-parent") - .tags(componentTrace(), defaultTags()), - span() - .id(Worker.publisherParentId) - .childOf(Worker.traceParentId) - .operationName("publisher-parent") - .resourceName("publisher-parent") - .tags(defaultTags()))); + assertTraces(trace( + SORT_BY_START_TIME, + span() + .root() + .operationName("trace-parent") + .resourceName("trace-parent") + .tags(componentTrace(), defaultTags()), + span() + .id(Worker.publisherParentId) + .childOf(Worker.traceParentId) + .operationName("publisher-parent") + .resourceName("publisher-parent") + .tags(defaultTags()))); } // --- Chain spans correct parent ------------------------------------------ static List chainParentArgs() { return Arrays.asList( - Arguments.of( - "basic maybe", - 3, - (Supplier) - () -> - Maybe.just(1) - .map(Worker::addOne) - .map(Worker::addOne) - .concatWith(Maybe.just(1).map(Worker::addOne))), - Arguments.of( - "basic flowable", - 5, - (Supplier) - () -> - Flowable.fromIterable(Arrays.asList(5, 6)) - .map(Worker::addOne) - .map(Worker::addOne) - .concatWith(Maybe.just(1).map(Worker::addOne).toFlowable()))); + Arguments.of("basic maybe", 3, (Supplier) () -> Maybe.just(1) + .map(Worker::addOne) + .map(Worker::addOne) + .concatWith(Maybe.just(1).map(Worker::addOne))), + Arguments.of("basic flowable", 5, (Supplier) + () -> Flowable.fromIterable(Arrays.asList(5, 6)) + .map(Worker::addOne) + .map(Worker::addOne) + .concatWith(Maybe.just(1).map(Worker::addOne).toFlowable()))); } @ParameterizedTest(name = "Publisher chain spans have the correct parent for ''{0}''") @@ -422,26 +353,23 @@ void chainParent(String name, int workSpans, Supplier supplier) { Worker.assemblePublisherUnderTrace(supplier); SpanMatcher[] matchers = new SpanMatcher[workSpans + 2]; - matchers[0] = - span() - .root() - .operationName("trace-parent") - .resourceName("trace-parent") - .tags(componentTrace(), defaultTags()); - matchers[1] = - span() - .id(Worker.publisherParentId) - .childOf(Worker.traceParentId) - .operationName("publisher-parent") - .resourceName("publisher-parent") - .tags(defaultTags()); + matchers[0] = span() + .root() + .operationName("trace-parent") + .resourceName("trace-parent") + .tags(componentTrace(), defaultTags()); + matchers[1] = span() + .id(Worker.publisherParentId) + .childOf(Worker.traceParentId) + .operationName("publisher-parent") + .resourceName("publisher-parent") + .tags(defaultTags()); for (int i = 0; i < workSpans; i++) { - matchers[2 + i] = - span() - .childOf(Worker.publisherParentId) - .operationName("addOne") - .resourceName("addOne") - .tags(componentTrace(), defaultTags()); + matchers[2 + i] = span() + .childOf(Worker.publisherParentId) + .operationName("addOne") + .resourceName("addOne") + .tags(componentTrace(), defaultTags()); } assertTraces(trace(SORT_BY_START_TIME, matchers)); @@ -453,24 +381,22 @@ void chainParent(String name, int workSpans, Supplier supplier) { void correctParentsFromSubscriptionTimeBlockingGet() { Maybe maybe = Maybe.just(42).map(Worker::addOne).map(Worker::addTwo); - Worker.runUnderTraceParent( - () -> { - maybe.blockingGet(); - return null; - }); + Worker.runUnderTraceParent(() -> { + maybe.blockingGet(); + return null; + }); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("trace-parent").resourceName("trace-parent"), - span() - .childOf(Worker.traceParentId) - .operationName("addOne") - .tags(componentTrace(), defaultTags()), - span() - .childOf(Worker.traceParentId) - .operationName("addTwo") - .tags(componentTrace(), defaultTags()))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("trace-parent").resourceName("trace-parent"), + span() + .childOf(Worker.traceParentId) + .operationName("addOne") + .tags(componentTrace(), defaultTags()), + span() + .childOf(Worker.traceParentId) + .operationName("addTwo") + .tags(componentTrace(), defaultTags()))); } // --- Correct parents from subscription time (intermediate span) ---------- @@ -478,11 +404,8 @@ void correctParentsFromSubscriptionTimeBlockingGet() { static List subscriptionTimeIntermediateArgs() { return Arrays.asList( Arguments.of("basic maybe", 1, (Supplier) () -> Maybe.just(1).map(Worker::addOne)), - Arguments.of( - "basic flowable", - 2, - (Supplier) - () -> Flowable.fromIterable(Arrays.asList(1, 2)).map(Worker::addOne))); + Arguments.of("basic flowable", 2, (Supplier) + () -> Flowable.fromIterable(Arrays.asList(1, 2)).map(Worker::addOne))); } @ParameterizedTest( @@ -490,62 +413,56 @@ static List subscriptionTimeIntermediateArgs() { @MethodSource("subscriptionTimeIntermediateArgs") @SuppressWarnings("unchecked") void correctParentsFromSubscriptionTime(String name, int workItems, Supplier supplier) { - Worker.assemblePublisherUnderTrace( - () -> { - // The "add one" operations are assembled under publisher-parent and stay its children. - // The "add two" operations are assembled under intermediate, but intermediate is finished - // before subscription, so re-activating its context at delivery time is a no-op and - // addTwo falls back to the still-active publisher-parent as well. - Object publisher = supplier.get(); - - AgentSpan intermediate = startSpan("test", "intermediate"); - Worker.intermediateId = intermediate.getSpanId(); - AgentScope scope = activateSpan(intermediate); - try { - if (publisher instanceof Maybe) { - return ((Maybe) publisher).map(Worker::addTwo); - } else if (publisher instanceof Flowable) { - return ((Flowable) publisher).map(Worker::addTwo); - } - throw new IllegalStateException("Unknown publisher type"); - } finally { - scope.close(); - intermediate.finish(); - } - }); + Worker.assemblePublisherUnderTrace(() -> { + // The "add one" operations are assembled under publisher-parent and stay its children. + // The "add two" operations are assembled under intermediate, but intermediate is finished + // before subscription, so re-activating its context at delivery time is a no-op and + // addTwo falls back to the still-active publisher-parent as well. + Object publisher = supplier.get(); + + AgentSpan intermediate = startSpan("test", "intermediate"); + Worker.intermediateId = intermediate.getSpanId(); + AgentScope scope = activateSpan(intermediate); + try { + if (publisher instanceof Maybe) { + return ((Maybe) publisher).map(Worker::addTwo); + } else if (publisher instanceof Flowable) { + return ((Flowable) publisher).map(Worker::addTwo); + } + throw new IllegalStateException("Unknown publisher type"); + } finally { + scope.close(); + intermediate.finish(); + } + }); SpanMatcher[] matchers = new SpanMatcher[3 + 2 * workItems]; - matchers[0] = - span() - .root() - .operationName("trace-parent") - .resourceName("trace-parent") - .tags(componentTrace(), defaultTags()); - matchers[1] = - span() - .id(Worker.publisherParentId) - .childOf(Worker.traceParentId) - .operationName("publisher-parent") - .resourceName("publisher-parent") - .tags(defaultTags()); - matchers[2] = - span() - .id(Worker.intermediateId) - .childOf(Worker.publisherParentId) - .operationName("intermediate") - .resourceName("intermediate") - .tags(defaultTags()); + matchers[0] = span() + .root() + .operationName("trace-parent") + .resourceName("trace-parent") + .tags(componentTrace(), defaultTags()); + matchers[1] = span() + .id(Worker.publisherParentId) + .childOf(Worker.traceParentId) + .operationName("publisher-parent") + .resourceName("publisher-parent") + .tags(defaultTags()); + matchers[2] = span() + .id(Worker.intermediateId) + .childOf(Worker.publisherParentId) + .operationName("intermediate") + .resourceName("intermediate") + .tags(defaultTags()); for (int i = 0; i < 2 * workItems; i += 2) { - matchers[3 + i] = - span() - .childOf(Worker.publisherParentId) - .operationName("addOne") - .tags(componentTrace(), defaultTags()); - matchers[4 + i] = - span() - .childOf(Worker.publisherParentId) - .operationName("addTwo") - .tags(componentTrace(), defaultTags()); + matchers[3 + i] = span() + .childOf(Worker.publisherParentId) + .operationName("addOne") + .tags(componentTrace(), defaultTags()); + matchers[4 + i] = span() + .childOf(Worker.publisherParentId) + .operationName("addTwo") + .tags(componentTrace(), defaultTags()); } assertTraces(trace(SORT_BY_START_TIME, matchers)); @@ -564,17 +481,15 @@ static List schedulerArgs() { @ParameterizedTest(name = "Flowables produce the right number of results on ''{0}'' scheduler") @MethodSource("schedulerArgs") void schedulers(String schedulerName, Scheduler scheduler) { - List values = - Flowable.fromIterable(Arrays.asList(1, 2, 3, 4)) - .parallel() - .runOn(scheduler) - .flatMap( - num -> - Maybe.just(num.toString() + " on " + Thread.currentThread().getName()) - .toFlowable()) - .sequential() - .toList() - .blockingGet(); + List values = Flowable.fromIterable(Arrays.asList(1, 2, 3, 4)) + .parallel() + .runOn(scheduler) + .flatMap( + num -> Maybe.just(num.toString() + " on " + Thread.currentThread().getName()) + .toFlowable()) + .sequential() + .toList() + .blockingGet(); assertEquals(4, values.size()); @@ -592,35 +507,30 @@ void schedulers(String schedulerName, Scheduler scheduler) { @ParameterizedTest(name = "Flowable propagates context on ''{0}'' scheduler") @MethodSource("schedulerArgs") void flowableParallelContextPropagation(String schedulerName, Scheduler scheduler) { - Worker.assemblePublisherUnderTrace( - () -> - Flowable.fromIterable(Arrays.asList(1, 2, 3, 4)) - .parallel() - .runOn(scheduler) - .flatMap(num -> Maybe.just(num).map(Worker::addOne).toFlowable()) - .sequential()); + Worker.assemblePublisherUnderTrace(() -> Flowable.fromIterable(Arrays.asList(1, 2, 3, 4)) + .parallel() + .runOn(scheduler) + .flatMap(num -> Maybe.just(num).map(Worker::addOne).toFlowable()) + .sequential()); SpanMatcher[] matchers = new SpanMatcher[6]; - matchers[0] = - span() - .root() - .operationName("trace-parent") - .resourceName("trace-parent") - .tags(componentTrace(), defaultTags()); - matchers[1] = - span() - .id(Worker.publisherParentId) - .childOf(Worker.traceParentId) - .operationName("publisher-parent") - .resourceName("publisher-parent") - .tags(defaultTags()); + matchers[0] = span() + .root() + .operationName("trace-parent") + .resourceName("trace-parent") + .tags(componentTrace(), defaultTags()); + matchers[1] = span() + .id(Worker.publisherParentId) + .childOf(Worker.traceParentId) + .operationName("publisher-parent") + .resourceName("publisher-parent") + .tags(defaultTags()); for (int i = 0; i < 4; i++) { - matchers[2 + i] = - span() - .childOf(Worker.publisherParentId) - .operationName("addOne") - .resourceName("addOne") - .tags(componentTrace(), defaultTags()); + matchers[2 + i] = span() + .childOf(Worker.publisherParentId) + .operationName("addOne") + .resourceName("addOne") + .tags(componentTrace(), defaultTags()); } assertTraces(trace(SORT_BY_START_TIME, matchers)); @@ -632,14 +542,11 @@ void flowableParallelContextPropagation(String schedulerName, Scheduler schedule // no active trace: the instrumentation must not synthesize any spans of its own. static List noSpuriousTracesArgs() { return Arrays.asList( - Arguments.of( - "observable", - (Supplier) - () -> - Observable.fromIterable(Arrays.asList(1, 2, 3, 4)) - .map(i -> i + 1) - .toList() - .blockingGet()), + Arguments.of("observable", (Supplier) + () -> Observable.fromIterable(Arrays.asList(1, 2, 3, 4)) + .map(i -> i + 1) + .toList() + .blockingGet()), Arguments.of( "single", (Supplier) () -> Single.just(1).map(i -> i + 1).blockingGet())); } diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/SubscriptionTest.java b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/SubscriptionTest.java index d2f76d17a9b..2219687969e 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/SubscriptionTest.java +++ b/dd-java-agent/instrumentation/rxjava/rxjava-3.0/src/test/java/testdog/trace/instrumentation/rxjava3/SubscriptionTest.java @@ -28,21 +28,19 @@ void maybeSubscriptionPropagatesParentSpan() throws InterruptedException { AgentSpan parent = startSpan("test", "parent"); try (AgentScope scope = activateSpan(parent)) { Maybe connection = Maybe.create(emitter -> emitter.onSuccess(new Connection())); - connection.subscribe( - c -> { - c.query(); - latch.countDown(); - }); + connection.subscribe(c -> { + c.query(); + latch.countDown(); + }); } finally { parent.finish(); } latch.await(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("Connection.query"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("Connection.query"))); } @Test @@ -52,21 +50,19 @@ void singleSubscriptionPropagatesParentSpan() throws InterruptedException { AgentSpan parent = startSpan("test", "parent"); try (AgentScope scope = activateSpan(parent)) { Single connection = Single.create(emitter -> emitter.onSuccess(new Connection())); - connection.subscribe( - c -> { - c.query(); - latch.countDown(); - }); + connection.subscribe(c -> { + c.query(); + latch.countDown(); + }); } finally { parent.finish(); } latch.await(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("Connection.query"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("Connection.query"))); } @Test @@ -76,21 +72,19 @@ void completableSubscriptionPropagatesParentSpan() throws InterruptedException { AgentSpan parent = startSpan("test", "parent"); try (AgentScope scope = activateSpan(parent)) { Completable action = Completable.create(emitter -> emitter.onComplete()); - action.subscribe( - () -> { - new Connection().query(); - latch.countDown(); - }); + action.subscribe(() -> { + new Connection().query(); + latch.countDown(); + }); } finally { parent.finish(); } latch.await(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("Connection.query"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("Connection.query"))); } @Test @@ -99,27 +93,23 @@ void observableSubscriptionPropagatesParentSpan() throws InterruptedException { AgentSpan parent = startSpan("test", "parent"); try (AgentScope scope = activateSpan(parent)) { - Observable connection = - Observable.create( - emitter -> { - emitter.onNext(new Connection()); - emitter.onComplete(); - }); - connection.subscribe( - c -> { - c.query(); - latch.countDown(); - }); + Observable connection = Observable.create(emitter -> { + emitter.onNext(new Connection()); + emitter.onComplete(); + }); + connection.subscribe(c -> { + c.query(); + latch.countDown(); + }); } finally { parent.finish(); } latch.await(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("Connection.query"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("Connection.query"))); } @Test @@ -128,28 +118,25 @@ void flowableSubscriptionPropagatesParentSpan() throws InterruptedException { AgentSpan parent = startSpan("test", "parent"); try (AgentScope scope = activateSpan(parent)) { - Flowable connection = - Flowable.create( - emitter -> { - emitter.onNext(new Connection()); - emitter.onComplete(); - }, - BackpressureStrategy.BUFFER); - connection.subscribe( - c -> { - c.query(); - latch.countDown(); - }); + Flowable connection = Flowable.create( + emitter -> { + emitter.onNext(new Connection()); + emitter.onComplete(); + }, + BackpressureStrategy.BUFFER); + connection.subscribe(c -> { + c.query(); + latch.countDown(); + }); } finally { parent.finish(); } latch.await(); - assertTraces( - trace( - SORT_BY_START_TIME, - span().root().operationName("parent"), - span().childOfPrevious().operationName("Connection.query"))); + assertTraces(trace( + SORT_BY_START_TIME, + span().root().operationName("parent"), + span().childOfPrevious().operationName("Connection.query"))); } static class Connection { diff --git a/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.10/src/main/java/datadog/trace/instrumentation/scala210/concurrent/CallbackRunnableInstrumentation.java b/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.10/src/main/java/datadog/trace/instrumentation/scala210/concurrent/CallbackRunnableInstrumentation.java index 78038465abe..1243af6275b 100644 --- a/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.10/src/main/java/datadog/trace/instrumentation/scala210/concurrent/CallbackRunnableInstrumentation.java +++ b/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.10/src/main/java/datadog/trace/instrumentation/scala210/concurrent/CallbackRunnableInstrumentation.java @@ -63,13 +63,12 @@ public static void beforeExecute( InstrumentationContext.get(CallbackRunnable.class, State.class); State state = contextStore.get(task); if (PromiseHelper.completionPriority) { - state = - PromiseHelper.executeCaptureContext( - InstrumentationContext.get(Try.class, Context.class), - resolved, - contextStore, - task, - state); + state = PromiseHelper.executeCaptureContext( + InstrumentationContext.get(Try.class, Context.class), + resolved, + contextStore, + task, + state); } // If nothing else has been picked up, then try to pick up the current Scope if (null == state) { diff --git a/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.13/src/main/java/datadog/trace/instrumentation/scala213/concurrent/PromiseTransformationInstrumentation.java b/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.13/src/main/java/datadog/trace/instrumentation/scala213/concurrent/PromiseTransformationInstrumentation.java index e57eb714a05..f0fd2e37ed0 100644 --- a/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.13/src/main/java/datadog/trace/instrumentation/scala213/concurrent/PromiseTransformationInstrumentation.java +++ b/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-2.13/src/main/java/datadog/trace/instrumentation/scala213/concurrent/PromiseTransformationInstrumentation.java @@ -64,7 +64,8 @@ public static void after(@Advice.Enter ContextScope scope) { public static final class Cancel { @Advice.OnMethodEnter public static void cancel(@Advice.This Transformation task) { - State state = InstrumentationContext.get(Transformation.class, State.class).get(task); + State state = + InstrumentationContext.get(Transformation.class, State.class).get(task); if (null != state) { state.closeContinuation(); } @@ -80,13 +81,12 @@ public static void beforeExecute( InstrumentationContext.get(Transformation.class, State.class); State state = contextStore.get(task); if (PromiseHelper.completionPriority) { - state = - PromiseHelper.executeCaptureContext( - InstrumentationContext.get(Try.class, Context.class), - resolved, - contextStore, - task, - state); + state = PromiseHelper.executeCaptureContext( + InstrumentationContext.get(Try.class, Context.class), + resolved, + contextStore, + task, + state); } // If nothing else has been picked up, then try to pick up the current Scope if (null == state) { diff --git a/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-common/src/main/java/datadog/trace/instrumentation/scala/PromiseHelper.java b/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-common/src/main/java/datadog/trace/instrumentation/scala/PromiseHelper.java index b3e6b27d7ac..47d00d6ad13 100644 --- a/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-common/src/main/java/datadog/trace/instrumentation/scala/PromiseHelper.java +++ b/dd-java-agent/instrumentation/scala/scala-promise/scala-promise-common/src/main/java/datadog/trace/instrumentation/scala/PromiseHelper.java @@ -13,10 +13,8 @@ import scala.util.Try; public class PromiseHelper { - public static final boolean completionPriority = - InstrumenterConfig.get() - .isIntegrationEnabled( - Collections.singletonList("scala_promise_completion_priority"), false); + public static final boolean completionPriority = InstrumenterConfig.get() + .isIntegrationEnabled(Collections.singletonList("scala_promise_completion_priority"), false); /** * Get the {@code Try} that should be associated with the {@code Context}. Will create a new copy diff --git a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java index a0e9e378cc4..f69691c85e0 100644 --- a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java +++ b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java @@ -165,12 +165,10 @@ public TestExecutionTracker getExecutionTracker(TestIdentifier testIdentifier) { @Nullable public TestExecutionTracker popExecutionTracker(TestIdentifier testIdentifier) { TestExecutionPolicy[] holder = new TestExecutionPolicy[1]; - executionPolicies.computeIfPresent( - testIdentifier, - (ti, policy) -> { - holder[0] = policy; - return policy.applicable() ? policy : null; - }); + executionPolicies.computeIfPresent(testIdentifier, (ti, policy) -> { + holder[0] = policy; + return policy.applicable() ? policy : null; + }); return holder[0]; } diff --git a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java index 22149f9a2a4..44cb5f07892 100644 --- a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java +++ b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java @@ -81,13 +81,12 @@ public static void apply( // This shouldn't happen. // If it does, instrumentation isn't working as expected, or Scalatest internals changed. // Either of the two means associating filters with runs should be done differently. - throw new IllegalStateException( - "Attempting to associate filter " - + filter - + " with runstamp " - + runStamp - + ", while already associated with " - + existingContext.getRunStamp()); + throw new IllegalStateException("Attempting to associate filter " + + filter + + " with runstamp " + + runStamp + + ", while already associated with " + + existingContext.getRunStamp()); } } } diff --git a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestUtils.java b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestUtils.java index c6be5171199..e1da050012e 100644 --- a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestUtils.java +++ b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestUtils.java @@ -18,16 +18,15 @@ public abstract class ScalatestUtils { private static final ClassLoader CLASS_LOADER = Reporter.class.getClassLoader(); - public static final List CAPABILITIES = - Arrays.asList( - LibraryCapability.TIA, - LibraryCapability.EFD, - LibraryCapability.ATR, - LibraryCapability.IMPACTED, - LibraryCapability.FTR, - LibraryCapability.QUARANTINE, - LibraryCapability.DISABLED, - LibraryCapability.ATTEMPT_TO_FIX); + public static final List CAPABILITIES = Arrays.asList( + LibraryCapability.TIA, + LibraryCapability.EFD, + LibraryCapability.ATR, + LibraryCapability.IMPACTED, + LibraryCapability.FTR, + LibraryCapability.QUARANTINE, + LibraryCapability.DISABLED, + LibraryCapability.ATTEMPT_TO_FIX); private ScalatestUtils() {} diff --git a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/execution/ScalatestExecutionInstrumentation.java b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/execution/ScalatestExecutionInstrumentation.java index 31579b04ec7..077abb0b3a5 100644 --- a/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/execution/ScalatestExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/scalatest-3.0.8/src/main/java/datadog/trace/instrumentation/scalatest/execution/ScalatestExecutionInstrumentation.java @@ -84,9 +84,8 @@ public static void beforeTest( RunContext context = RunContext.getOrCreate(runStamp); TestIdentifier testIdentifier = new TestIdentifier(suite.suiteId(), testName, null); TestSourceData testSourceData = new TestSourceData(suite.getClass(), null, null); - TestExecutionPolicy executionPolicy = - context.getOrCreateExecutionPolicy( - testIdentifier, testSourceData, context.tags(testIdentifier)); + TestExecutionPolicy executionPolicy = context.getOrCreateExecutionPolicy( + testIdentifier, testSourceData, context.tags(testIdentifier)); invokeWithFixture = new TestExecutionWrapper(invokeWithFixture, executionPolicy); } @@ -106,10 +105,8 @@ public static void afterTest( throws Throwable { TestExecutionWrapper invokeWrapper = (TestExecutionWrapper) invokeWithFixture; if (invokeWrapper.applicable()) { - status = - (Status) - runTest.invokeWithArguments( - engine, suite, testName, args, includeIcon, invokeWithFixture); + status = (Status) runTest.invokeWithArguments( + engine, suite, testName, args, includeIcon, invokeWithFixture); } } } diff --git a/dd-java-agent/instrumentation/selenium-3.13/src/main/java/datadog/trace/instrumentation/selenium/SeleniumUtils.java b/dd-java-agent/instrumentation/selenium-3.13/src/main/java/datadog/trace/instrumentation/selenium/SeleniumUtils.java index 5910e3aa3f1..0ed66e036cd 100644 --- a/dd-java-agent/instrumentation/selenium-3.13/src/main/java/datadog/trace/instrumentation/selenium/SeleniumUtils.java +++ b/dd-java-agent/instrumentation/selenium-3.13/src/main/java/datadog/trace/instrumentation/selenium/SeleniumUtils.java @@ -154,9 +154,8 @@ public static void beforePageClose(WebDriver driver) { if (capabilities != null) { String browserName = capabilities.getBrowserName(); String browserVersion = - String.valueOf( - Optional.ofNullable(capabilities.getCapability("browserVersion")) - .orElse(Optional.ofNullable(capabilities.getCapability("version")).orElse(""))); + String.valueOf(Optional.ofNullable(capabilities.getCapability("browserVersion")) + .orElse(Optional.ofNullable(capabilities.getCapability("version")).orElse(""))); span.setTag(Tags.TEST_BROWSER_NAME, browserName); span.setTag(Tags.TEST_BROWSER_VERSION, browserVersion); } diff --git a/dd-java-agent/instrumentation/servicetalk/servicetalk-0.42.0/src/main/java/datadog/trace/instrumentation/servicetalk0_42_0/ContextMapInstrumentation.java b/dd-java-agent/instrumentation/servicetalk/servicetalk-0.42.0/src/main/java/datadog/trace/instrumentation/servicetalk0_42_0/ContextMapInstrumentation.java index 72f9fd3d43b..cdd4465ddc1 100644 --- a/dd-java-agent/instrumentation/servicetalk/servicetalk-0.42.0/src/main/java/datadog/trace/instrumentation/servicetalk0_42_0/ContextMapInstrumentation.java +++ b/dd-java-agent/instrumentation/servicetalk/servicetalk-0.42.0/src/main/java/datadog/trace/instrumentation/servicetalk0_42_0/ContextMapInstrumentation.java @@ -30,10 +30,8 @@ public void methodAdvice(MethodTransformer transformer) { isConstructor() .and(isPrivate()) .and(takesArguments(1)) - .and( - takesArgument( - 0, - named("io.servicetalk.concurrent.api.CopyOnWriteContextMap$CopyContextMap"))), + .and(takesArgument( + 0, named("io.servicetalk.concurrent.api.CopyOnWriteContextMap$CopyContextMap"))), getClass().getName() + "$Construct"); } diff --git a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/IastOptOutJakartaHttpServletRequestInstrumentation.java b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/IastOptOutJakartaHttpServletRequestInstrumentation.java index 2dbda417503..a5a038781ec 100644 --- a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/IastOptOutJakartaHttpServletRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/IastOptOutJakartaHttpServletRequestInstrumentation.java @@ -61,7 +61,9 @@ protected boolean isOptOutEnabled() { @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( - named("getSession").and(returns(named("jakarta.servlet.http.HttpSession"))).and(isPublic()), + named("getSession") + .and(returns(named("jakarta.servlet.http.HttpSession"))) + .and(isPublic()), CLASS_NAME + "$GetHttpSessionAdvice"); } @@ -85,7 +87,8 @@ public static void onExit( } final ServletContext context = request.getServletContext(); - if (InstrumentationContext.get(ServletContext.class, SessionTrackingMode.class).get(context) + if (InstrumentationContext.get(ServletContext.class, SessionTrackingMode.class) + .get(context) != null) { return; } diff --git a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletRequestInstrumentation.java b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletRequestInstrumentation.java index b9f2eef01dc..2cf0888eb4f 100644 --- a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletRequestInstrumentation.java @@ -134,9 +134,8 @@ public static void onExit( return; } IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - enumeration = - TaintableEnumeration.wrap( - ctx, enumeration, module, SourceTypes.REQUEST_HEADER_VALUE, name); + enumeration = TaintableEnumeration.wrap( + ctx, enumeration, module, SourceTypes.REQUEST_HEADER_VALUE, name); } } @@ -155,9 +154,8 @@ public static void onExit( return; } IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - enumeration = - TaintableEnumeration.wrap( - ctx, enumeration, module, SourceTypes.REQUEST_HEADER_NAME, true); + enumeration = TaintableEnumeration.wrap( + ctx, enumeration, module, SourceTypes.REQUEST_HEADER_NAME, true); } } @@ -246,9 +244,8 @@ public static void onExit( return; } IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - enumeration = - TaintableEnumeration.wrap( - ctx, enumeration, module, SourceTypes.REQUEST_PARAMETER_NAME, true); + enumeration = TaintableEnumeration.wrap( + ctx, enumeration, module, SourceTypes.REQUEST_PARAMETER_NAME, true); } } diff --git a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletResponseInstrumentation.java b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletResponseInstrumentation.java index 13f6ca9ccd3..547f3f42e48 100644 --- a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaHttpServletResponseInstrumentation.java @@ -74,13 +74,12 @@ public static void onEnter(@Advice.Argument(0) final jakarta.servlet.http.Cookie if (cookie != null) { HttpResponseHeaderModule mod = InstrumentationBridge.RESPONSE_HEADER_MODULE; if (mod != null) { - mod.onCookie( - Cookie.named(cookie.getName()) - .value(cookie.getValue()) - .secure(cookie.getSecure()) - .httpOnly(cookie.isHttpOnly()) - .maxAge(cookie.getMaxAge()) - .build()); + mod.onCookie(Cookie.named(cookie.getName()) + .value(cookie.getValue()) + .secure(cookie.getSecure()) + .httpOnly(cookie.isHttpOnly()) + .maxAge(cookie.getMaxAge()) + .build()); } } } diff --git a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java index f9c1e49c30d..3d21f75c7f0 100644 --- a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/JakartaServletInstrumentation.java @@ -87,14 +87,12 @@ public static AgentSpan before( if (maybeRumWrapper instanceof RumControllableResponse) { rumServletWrapper = (RumControllableResponse) maybeRumWrapper; } else { - rumServletWrapper = - new RumHttpServletResponseWrapper( - httpServletRequest, (HttpServletResponse) response); + rumServletWrapper = new RumHttpServletResponseWrapper( + httpServletRequest, (HttpServletResponse) response); httpServletRequest.setAttribute(DD_RUM_INJECTED, rumServletWrapper); response = (ServletResponse) rumServletWrapper; - request = - new RumHttpServletRequestWrapper( - httpServletRequest, (HttpServletResponse) rumServletWrapper); + request = new RumHttpServletRequestWrapper( + httpServletRequest, (HttpServletResponse) rumServletWrapper); } } } diff --git a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java index 25b3f2c9964..fdc0b5c5312 100644 --- a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java +++ b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java @@ -51,18 +51,15 @@ public ServletOutputStream getOutputStream() throws IOException { if (encoding == null) { encoding = Charset.defaultCharset().name(); } - outputStream = - new WrappedServletOutputStream( - super.getOutputStream(), - rumInjector.getMarkerBytes(encoding), - rumInjector.getSnippetBytes(encoding), - this::onInjected, - bytes -> - RumInjector.getTelemetryCollector() - .onInjectionResponseSize(servletVersion, bytes), - milliseconds -> - RumInjector.getTelemetryCollector() - .onInjectionTime(servletVersion, milliseconds)); + outputStream = new WrappedServletOutputStream( + super.getOutputStream(), + rumInjector.getMarkerBytes(encoding), + rumInjector.getSnippetBytes(encoding), + this::onInjected, + bytes -> + RumInjector.getTelemetryCollector().onInjectionResponseSize(servletVersion, bytes), + milliseconds -> + RumInjector.getTelemetryCollector().onInjectionTime(servletVersion, milliseconds)); } catch (Exception e) { RumInjector.getTelemetryCollector().onInjectionFailed(servletVersion, contentEncoding); throw e; @@ -80,18 +77,15 @@ public PrintWriter getWriter() throws IOException { return super.getWriter(); } try { - wrappedPipeWriter = - new InjectingPipeWriter( - super.getWriter(), - rumInjector.getMarkerChars(), - rumInjector.getSnippetChars(), - this::onInjected, - bytes -> - RumInjector.getTelemetryCollector() - .onInjectionResponseSize(servletVersion, bytes), - milliseconds -> - RumInjector.getTelemetryCollector() - .onInjectionTime(servletVersion, milliseconds)); + wrappedPipeWriter = new InjectingPipeWriter( + super.getWriter(), + rumInjector.getMarkerChars(), + rumInjector.getSnippetChars(), + this::onInjected, + bytes -> + RumInjector.getTelemetryCollector().onInjectionResponseSize(servletVersion, bytes), + milliseconds -> + RumInjector.getTelemetryCollector().onInjectionTime(servletVersion, milliseconds)); printWriter = new PrintWriter(wrappedPipeWriter); } catch (Exception e) { RumInjector.getTelemetryCollector().onInjectionFailed(servletVersion, contentEncoding); diff --git a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/WrappedServletOutputStream.java b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/WrappedServletOutputStream.java index fe2a87774ac..a21a42de712 100644 --- a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/WrappedServletOutputStream.java +++ b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/src/main/java/datadog/trace/instrumentation/servlet5/WrappedServletOutputStream.java @@ -17,9 +17,8 @@ public WrappedServletOutputStream( Runnable onInjected, LongConsumer onBytesWritten, LongConsumer onInjectionTime) { - this.filtered = - new InjectingPipeOutputStream( - delegate, marker, contentToInject, onInjected, onBytesWritten, onInjectionTime); + this.filtered = new InjectingPipeOutputStream( + delegate, marker, contentToInject, onInjected, onBytesWritten, onInjectionTime); this.delegate = delegate; } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/IastOptOutHttpServletRequest3Instrumentation.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/IastOptOutHttpServletRequest3Instrumentation.java index 57289e26ab7..dc5424376b8 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/IastOptOutHttpServletRequest3Instrumentation.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/IastOptOutHttpServletRequest3Instrumentation.java @@ -64,7 +64,9 @@ public ElementMatcher hierarchyMatcher() { @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( - named("getSession").and(returns(named("javax.servlet.http.HttpSession"))).and(isPublic()), + named("getSession") + .and(returns(named("javax.servlet.http.HttpSession"))) + .and(isPublic()), getClass().getName() + "$GetHttpSessionAdvice"); } @@ -92,7 +94,8 @@ public static void onExit( return; } final ServletContext context = request.getServletContext(); - if (InstrumentationContext.get(ServletContext.class, SessionTrackingMode.class).get(context) + if (InstrumentationContext.get(ServletContext.class, SessionTrackingMode.class) + .get(context) != null) { return; } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java index cbd0b6f845b..6b2032f738a 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java @@ -69,18 +69,15 @@ public ServletOutputStream getOutputStream() throws IOException { if (encoding == null) { encoding = Charset.defaultCharset().name(); } - outputStream = - new WrappedServletOutputStream( - super.getOutputStream(), - rumInjector.getMarkerBytes(encoding), - rumInjector.getSnippetBytes(encoding), - this::onInjected, - bytes -> - RumInjector.getTelemetryCollector() - .onInjectionResponseSize(servletVersion, bytes), - milliseconds -> - RumInjector.getTelemetryCollector() - .onInjectionTime(servletVersion, milliseconds)); + outputStream = new WrappedServletOutputStream( + super.getOutputStream(), + rumInjector.getMarkerBytes(encoding), + rumInjector.getSnippetBytes(encoding), + this::onInjected, + bytes -> + RumInjector.getTelemetryCollector().onInjectionResponseSize(servletVersion, bytes), + milliseconds -> + RumInjector.getTelemetryCollector().onInjectionTime(servletVersion, milliseconds)); } catch (Exception e) { RumInjector.getTelemetryCollector().onInjectionFailed(servletVersion, contentEncoding); throw e; @@ -99,18 +96,15 @@ public PrintWriter getWriter() throws IOException { return super.getWriter(); } try { - wrappedPipeWriter = - new InjectingPipeWriter( - super.getWriter(), - rumInjector.getMarkerChars(), - rumInjector.getSnippetChars(), - this::onInjected, - bytes -> - RumInjector.getTelemetryCollector() - .onInjectionResponseSize(servletVersion, bytes), - milliseconds -> - RumInjector.getTelemetryCollector() - .onInjectionTime(servletVersion, milliseconds)); + wrappedPipeWriter = new InjectingPipeWriter( + super.getWriter(), + rumInjector.getMarkerChars(), + rumInjector.getSnippetChars(), + this::onInjected, + bytes -> + RumInjector.getTelemetryCollector().onInjectionResponseSize(servletVersion, bytes), + milliseconds -> + RumInjector.getTelemetryCollector().onInjectionTime(servletVersion, milliseconds)); printWriter = new PrintWriter(wrappedPipeWriter); } catch (Exception e) { RumInjector.getTelemetryCollector().onInjectionFailed(servletVersion, contentEncoding); diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java index d4799961504..e0cf49f72e1 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java @@ -55,9 +55,8 @@ public static boolean onEnter( new RumHttpServletResponseWrapper(httpServletRequest, (HttpServletResponse) response); httpServletRequest.setAttribute(DD_RUM_INJECTED, rumServletWrapper); response = (ServletResponse) rumServletWrapper; - request = - new RumHttpServletRequestWrapper( - httpServletRequest, (HttpServletResponse) rumServletWrapper); + request = new RumHttpServletRequestWrapper( + httpServletRequest, (HttpServletResponse) rumServletWrapper); } } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/WrappedServletOutputStream.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/WrappedServletOutputStream.java index c4b575836ff..5a095481290 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/WrappedServletOutputStream.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/src/main/java/datadog/trace/instrumentation/servlet3/WrappedServletOutputStream.java @@ -36,9 +36,8 @@ public WrappedServletOutputStream( Runnable onInjected, LongConsumer onBytesWritten, LongConsumer onInjectionTime) { - this.filtered = - new InjectingPipeOutputStream( - delegate, marker, contentToInject, onInjected, onBytesWritten, onInjectionTime); + this.filtered = new InjectingPipeOutputStream( + delegate, marker, contentToInject, onInjected, onBytesWritten, onInjectionTime); this.delegate = delegate; } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java index 88b2ce98782..ae5fab7334f 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java @@ -115,11 +115,10 @@ public static ContextScope start( parent = servletSpan.spanContext(); } - final AgentSpan span = - startSpan( - JAVA_WEB_SERVLET_DISPATCHER.toString(), - SPAN_NAME_CACHE.computeIfAbsent(method, SERVLET_PREFIX), - parent); + final AgentSpan span = startSpan( + JAVA_WEB_SERVLET_DISPATCHER.toString(), + SPAN_NAME_CACHE.computeIfAbsent(method, SERVLET_PREFIX), + parent); DECORATE.afterStart(span); span.setTag(SERVLET_CONTEXT, request.getAttribute(DD_CONTEXT_PATH_ATTRIBUTE)); span.setTag(SERVLET_PATH, request.getAttribute(DD_SERVLET_PATH_ATTRIBUTE)); diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java index b1af9e2ea13..3c4c808c9ad 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java @@ -77,10 +77,9 @@ public static AgentScope start(@Advice.Origin final Method method) { return null; } - final AgentSpan span = - startSpan( - HttpServletDecorator.JAVA_WEB_SERVLET_SERVICE.toString(), - SPAN_NAME_CACHE.computeIfAbsent(method.getName(), SERVLET_PREFIX)); + final AgentSpan span = startSpan( + HttpServletDecorator.JAVA_WEB_SERVLET_SERVICE.toString(), + SPAN_NAME_CACHE.computeIfAbsent(method.getName(), SERVLET_PREFIX)); DECORATE.afterStart(span); // Here we use the Method instead of "this.class.name" to distinguish calls to "super". diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletRequestInstrumentation.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletRequestInstrumentation.java index 2a378ee33cb..9edc83b2b58 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletRequestInstrumentation.java @@ -134,9 +134,8 @@ public static void onExit( return; } IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - enumeration = - TaintableEnumeration.wrap( - ctx, enumeration, module, SourceTypes.REQUEST_HEADER_VALUE, name); + enumeration = TaintableEnumeration.wrap( + ctx, enumeration, module, SourceTypes.REQUEST_HEADER_VALUE, name); } } @@ -155,9 +154,8 @@ public static void onExit( return; } IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - enumeration = - TaintableEnumeration.wrap( - ctx, enumeration, module, SourceTypes.REQUEST_HEADER_NAME, true); + enumeration = TaintableEnumeration.wrap( + ctx, enumeration, module, SourceTypes.REQUEST_HEADER_NAME, true); } } @@ -246,9 +244,8 @@ public static void onExit( return; } IastContext ctx = reqCtx.getData(RequestContextSlot.IAST); - enumeration = - TaintableEnumeration.wrap( - ctx, enumeration, module, SourceTypes.REQUEST_PARAMETER_NAME, true); + enumeration = TaintableEnumeration.wrap( + ctx, enumeration, module, SourceTypes.REQUEST_PARAMETER_NAME, true); } } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/groovy/RequestDispatcherUtils.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/groovy/RequestDispatcherUtils.java index 60ee45c4dc6..ea299a8a4b7 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/groovy/RequestDispatcherUtils.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/groovy/RequestDispatcherUtils.java @@ -178,14 +178,12 @@ class TestDispatcher implements RequestDispatcher { @Override public void forward(final ServletRequest servletRequest, final ServletResponse servletResponse) throws ServletException { - runUnderTrace( - "forward-child", - new Callable() { - @Override - public Object call() throws Exception { - return null; - } - }); + runUnderTrace("forward-child", new Callable() { + @Override + public Object call() throws Exception { + return null; + } + }); if (toThrow != null) { throw toThrow; } @@ -194,14 +192,12 @@ public Object call() throws Exception { @Override public void include(final ServletRequest servletRequest, final ServletResponse servletResponse) throws ServletException { - runUnderTrace( - "include-child", - new Callable() { - @Override - public Object call() throws Exception { - return null; - } - }); + runUnderTrace("include-child", new Callable() { + @Override + public Object call() throws Exception { + return null; + } + }); if (toThrow != null) { throw toThrow; } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/java/RequestDispatcherRecursionTest.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/java/RequestDispatcherRecursionTest.java index ea9f498909e..1a6dff3ef21 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/java/RequestDispatcherRecursionTest.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-common/src/test/java/RequestDispatcherRecursionTest.java @@ -68,16 +68,13 @@ private static void simulateFilterChain(int depth) { /** Creates a proxy stub for {@code iface} where all methods return null / 0 / false. */ @SuppressWarnings("unchecked") static T nullStub(Class iface) { - return (T) - Proxy.newProxyInstance( - iface.getClassLoader(), - new Class[] {iface}, - (proxy, method, args) -> { - Class ret = method.getReturnType(); - if (ret == boolean.class) return false; - if (ret == int.class || ret == long.class) return 0; - return null; - }); + return (T) Proxy.newProxyInstance( + iface.getClassLoader(), new Class[] {iface}, (proxy, method, args) -> { + Class ret = method.getReturnType(); + if (ret == boolean.class) return false; + if (ret == int.class || ret == long.class) return 0; + return null; + }); } @Test @@ -110,12 +107,10 @@ public void setAttribute(String name, Object value) { }; // runUnderTrace provides an active span; without one the advice exits before injectContext(). - runUnderTrace( - "test", - () -> { - dispatcher.forward(recursiveRequest, response); - return null; - }); + runUnderTrace("test", () -> { + dispatcher.forward(recursiveRequest, response); + return null; + }); assertTrue( maxDepth.get() >= 1, @@ -172,12 +167,10 @@ public void setAttribute(String name, Object value) { }; try { - runUnderTrace( - "test", - () -> { - dispatcher.forward(recursiveRequest, response); - return null; - }); + runUnderTrace("test", () -> { + dispatcher.forward(recursiveRequest, response); + return null; + }); } catch (StackOverflowError ignored) { // SOE may reach this level if it is not fully absorbed at inner levels. } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpServletResponseInstrumentation.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpServletResponseInstrumentation.java index 4ddeefa013e..546bd5ceb04 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpServletResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpServletResponseInstrumentation.java @@ -77,12 +77,11 @@ public static void onEnter(@Advice.Argument(0) final javax.servlet.http.Cookie c if (null != cookie) { HttpResponseHeaderModule mod = InstrumentationBridge.RESPONSE_HEADER_MODULE; if (mod != null) { - mod.onCookie( - Cookie.named(cookie.getName()) - .value(cookie.getValue()) - .secure(cookie.getSecure()) - .maxAge(cookie.getMaxAge()) - .build()); + mod.onCookie(Cookie.named(cookie.getName()) + .value(cookie.getValue()) + .secure(cookie.getSecure()) + .maxAge(cookie.getMaxAge()) + .build()); } } } diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpSessionInstrumentation.java b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpSessionInstrumentation.java index dea9c24bfa9..e3e4b3222c4 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpSessionInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-iast/src/main/java/datadog/trace/instrumentation/servlet/HttpSessionInstrumentation.java @@ -38,11 +38,9 @@ public String hierarchyMarkerType() { @Override public ElementMatcher hierarchyMatcher() { return implementsInterface(named(hierarchyMarkerType())) - .and( - not( - namedOneOf( - "com.ibm.ws.session.HttpSessionFacade", - "org.apache.catalina.session.StandardSessionFacade"))); + .and(not(namedOneOf( + "com.ibm.ws.session.HttpSessionFacade", + "org.apache.catalina.session.StandardSessionFacade"))); } @Override diff --git a/dd-java-agent/instrumentation/snakeyaml-1.33/src/main/java/datadog/trace/instrumentation/snakeyaml/SnakeYamlInstrumentation.java b/dd-java-agent/instrumentation/snakeyaml-1.33/src/main/java/datadog/trace/instrumentation/snakeyaml/SnakeYamlInstrumentation.java index 83c43bf92bb..52db5949382 100644 --- a/dd-java-agent/instrumentation/snakeyaml-1.33/src/main/java/datadog/trace/instrumentation/snakeyaml/SnakeYamlInstrumentation.java +++ b/dd-java-agent/instrumentation/snakeyaml-1.33/src/main/java/datadog/trace/instrumentation/snakeyaml/SnakeYamlInstrumentation.java @@ -59,10 +59,9 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("load") .and(isMethod()) - .and( - takesArguments(String.class) - .or(takesArguments(InputStream.class)) - .or(takesArguments(Reader.class))), + .and(takesArguments(String.class) + .or(takesArguments(InputStream.class)) + .or(takesArguments(Reader.class))), SnakeYamlInstrumentation.class.getName() + "$LoadAdvice"); } diff --git a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/ProviderProxyInvokerInstrumentation.java b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/ProviderProxyInvokerInstrumentation.java index 18c0650bd3f..0953cfcc176 100644 --- a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/ProviderProxyInvokerInstrumentation.java +++ b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/ProviderProxyInvokerInstrumentation.java @@ -51,10 +51,9 @@ public static AgentScope enter(@Advice.Argument(0) SofaRequest request) { // explicit parent naturally attaches to the active grpc.server span. For REST, // parentContext will also be null and the active netty.request span becomes the parent. AgentSpanContext parentContext = extractContextAndGetSpanContext(request, GETTER); - AgentSpan span = - parentContext != null - ? startSpan("sofarpc-server", SOFA_RPC_SERVER, parentContext) - : startSpan("sofarpc-server", SOFA_RPC_SERVER); + AgentSpan span = parentContext != null + ? startSpan("sofarpc-server", SOFA_RPC_SERVER, parentContext) + : startSpan("sofarpc-server", SOFA_RPC_SERVER); DECORATE.afterStart(span); DECORATE.onRequest(span, request); span.setTag("sofarpc.protocol", protocol); diff --git a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcClientDecorator.java b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcClientDecorator.java index a626be864dd..b84ef7cdb63 100644 --- a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcClientDecorator.java +++ b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcClientDecorator.java @@ -11,9 +11,8 @@ public class SofaRpcClientDecorator extends ClientDecorator { - public static final CharSequence SOFA_RPC_CLIENT = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().client().operationForProtocol("sofarpc")); + public static final CharSequence SOFA_RPC_CLIENT = UTF8BytesString.create( + SpanNaming.instance().namingSchema().client().operationForProtocol("sofarpc")); private static final CharSequence COMPONENT_NAME = UTF8BytesString.create("sofarpc-client"); diff --git a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcServerDecorator.java b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcServerDecorator.java index ba2f44bae88..e68ca456627 100644 --- a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcServerDecorator.java +++ b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/main/java/datadog/trace/instrumentation/sofarpc/SofaRpcServerDecorator.java @@ -12,9 +12,8 @@ public class SofaRpcServerDecorator extends ServerDecorator { - public static final CharSequence SOFA_RPC_SERVER = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().server().operationForProtocol("sofarpc")); + public static final CharSequence SOFA_RPC_SERVER = UTF8BytesString.create( + SpanNaming.instance().namingSchema().server().operationForProtocol("sofarpc")); private static final CharSequence COMPONENT_NAME = UTF8BytesString.create("sofarpc-server"); diff --git a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcRestTest.java b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcRestTest.java index d2e37d64761..8a17cd5d258 100644 --- a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcRestTest.java +++ b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcRestTest.java @@ -48,24 +48,22 @@ public class SofaRpcRestTest extends AbstractInstrumentationTest { @BeforeAll void setupServers() { - restProviderConfig = - new ProviderConfig() - .setApplication(new ApplicationConfig().setAppName("test-server")) - .setInterfaceId(RestGreeterService.class.getName()) - .setRef(new RestGreeterServiceImpl()) - .setServer(new ServerConfig().setProtocol("rest").setHost("127.0.0.1").setPort(PORT)) - .setRegister(false); + restProviderConfig = new ProviderConfig() + .setApplication(new ApplicationConfig().setAppName("test-server")) + .setInterfaceId(RestGreeterService.class.getName()) + .setRef(new RestGreeterServiceImpl()) + .setServer(new ServerConfig().setProtocol("rest").setHost("127.0.0.1").setPort(PORT)) + .setRegister(false); restProviderConfig.export(); - greeterService = - new ConsumerConfig() - .setApplication(new ApplicationConfig().setAppName("test-client")) - .setInterfaceId(RestGreeterService.class.getName()) - .setDirectUrl("rest://127.0.0.1:" + PORT) - .setProtocol("rest") - .setRegister(false) - .setSubscribe(false) - .refer(); + greeterService = new ConsumerConfig() + .setApplication(new ApplicationConfig().setAppName("test-client")) + .setInterfaceId(RestGreeterService.class.getName()) + .setDirectUrl("rest://127.0.0.1:" + PORT) + .setProtocol("rest") + .setRegister(false) + .setSubscribe(false) + .refer(); } @AfterAll @@ -99,7 +97,8 @@ void clientAndServerSpansForRestCall() throws InterruptedException, TimeoutExcep // Client span — full service unique name is available on client side assertNotNull(clientSofaSpan, "Expected sofarpc client span"); - assertEquals(serviceUniqueName + "/sayHello", clientSofaSpan.getResourceName().toString()); + assertEquals( + serviceUniqueName + "/sayHello", clientSofaSpan.getResourceName().toString()); assertEquals("rest", String.valueOf(clientSofaSpan.getTag("sofarpc.protocol"))); assertEquals("sofarpc-client", String.valueOf(clientSofaSpan.getTag("component"))); assertEquals("client", String.valueOf(clientSofaSpan.getTag("span.kind"))); diff --git a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTest.java b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTest.java index 1ce32632e97..5305256a82b 100644 --- a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTest.java +++ b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTest.java @@ -39,44 +39,39 @@ public class SofaRpcTest extends AbstractInstrumentationTest { void setupServers() { ApplicationConfig appConfig = new ApplicationConfig().setAppName("test-server"); - providerConfig = - new ProviderConfig() - .setApplication(appConfig) - .setInterfaceId(GreeterService.class.getName()) - .setRef(new GreeterServiceImpl()) - .setServer(new ServerConfig().setProtocol("bolt").setHost("127.0.0.1").setPort(PORT)) - .setRegister(false); + providerConfig = new ProviderConfig() + .setApplication(appConfig) + .setInterfaceId(GreeterService.class.getName()) + .setRef(new GreeterServiceImpl()) + .setServer(new ServerConfig().setProtocol("bolt").setHost("127.0.0.1").setPort(PORT)) + .setRegister(false); providerConfig.export(); - greeterService = - new ConsumerConfig() - .setApplication(new ApplicationConfig().setAppName("test-client")) - .setInterfaceId(GreeterService.class.getName()) - .setDirectUrl("bolt://127.0.0.1:" + PORT) - .setProtocol("bolt") - .setRegister(false) - .setSubscribe(false) - .refer(); - - errorProviderConfig = - new ProviderConfig() - .setApplication(appConfig) - .setInterfaceId(FaultyService.class.getName()) - .setRef(new FaultyServiceImpl()) - .setServer( - new ServerConfig().setProtocol("bolt").setHost("127.0.0.1").setPort(ERROR_PORT)) - .setRegister(false); + greeterService = new ConsumerConfig() + .setApplication(new ApplicationConfig().setAppName("test-client")) + .setInterfaceId(GreeterService.class.getName()) + .setDirectUrl("bolt://127.0.0.1:" + PORT) + .setProtocol("bolt") + .setRegister(false) + .setSubscribe(false) + .refer(); + + errorProviderConfig = new ProviderConfig() + .setApplication(appConfig) + .setInterfaceId(FaultyService.class.getName()) + .setRef(new FaultyServiceImpl()) + .setServer(new ServerConfig().setProtocol("bolt").setHost("127.0.0.1").setPort(ERROR_PORT)) + .setRegister(false); errorProviderConfig.export(); - faultyService = - new ConsumerConfig() - .setApplication(new ApplicationConfig().setAppName("test-client")) - .setInterfaceId(FaultyService.class.getName()) - .setDirectUrl("bolt://127.0.0.1:" + ERROR_PORT) - .setProtocol("bolt") - .setRegister(false) - .setSubscribe(false) - .refer(); + faultyService = new ConsumerConfig() + .setApplication(new ApplicationConfig().setAppName("test-client")) + .setInterfaceId(FaultyService.class.getName()) + .setDirectUrl("bolt://127.0.0.1:" + ERROR_PORT) + .setProtocol("bolt") + .setRegister(false) + .setSubscribe(false) + .refer(); } @AfterAll @@ -112,7 +107,8 @@ void clientAndServerSpansForBoltCall() throws InterruptedException, TimeoutExcep DDSpan serverSofaSpan = findSpan(allSpans, "sofarpc.request", "server"); assertNotNull(clientSofaSpan, "Expected sofarpc client span"); - assertEquals(serviceUniqueName + "/sayHello", clientSofaSpan.getResourceName().toString()); + assertEquals( + serviceUniqueName + "/sayHello", clientSofaSpan.getResourceName().toString()); assertEquals("bolt", String.valueOf(clientSofaSpan.getTag("sofarpc.protocol"))); assertEquals("sofarpc-client", String.valueOf(clientSofaSpan.getTag("component"))); assertEquals("client", String.valueOf(clientSofaSpan.getTag("span.kind"))); @@ -123,7 +119,8 @@ void clientAndServerSpansForBoltCall() throws InterruptedException, TimeoutExcep assertFalse(clientSofaSpan.isError()); assertNotNull(serverSofaSpan, "Expected sofarpc server span"); - assertEquals(serviceUniqueName + "/sayHello", serverSofaSpan.getResourceName().toString()); + assertEquals( + serviceUniqueName + "/sayHello", serverSofaSpan.getResourceName().toString()); assertEquals("bolt", String.valueOf(serverSofaSpan.getTag("sofarpc.protocol"))); assertEquals("sofarpc-server", String.valueOf(serverSofaSpan.getTag("component"))); assertEquals("server", String.valueOf(serverSofaSpan.getTag("span.kind"))); diff --git a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTripleWithGrpcForkedTest.java b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTripleWithGrpcForkedTest.java index 1645a809ab8..4e8cd5c0332 100644 --- a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTripleWithGrpcForkedTest.java +++ b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/src/test/java/datadog/trace/instrumentation/sofarpc/SofaRpcTripleWithGrpcForkedTest.java @@ -66,25 +66,22 @@ public class SofaRpcTripleWithGrpcForkedTest extends AbstractInstrumentationTest // TracingServerInterceptor at build time. @BeforeEach void setupServer() { - tripleProviderConfig = - new ProviderConfig() - .setApplication(new ApplicationConfig().setAppName("test-server")) - .setInterfaceId(TripleGreeterService.class.getName()) - .setRef(new TripleGreeterServiceImpl()) - .setServer( - new ServerConfig().setProtocol("tri").setHost("127.0.0.1").setPort(TRIPLE_PORT)) - .setRegister(false); + tripleProviderConfig = new ProviderConfig() + .setApplication(new ApplicationConfig().setAppName("test-server")) + .setInterfaceId(TripleGreeterService.class.getName()) + .setRef(new TripleGreeterServiceImpl()) + .setServer(new ServerConfig().setProtocol("tri").setHost("127.0.0.1").setPort(TRIPLE_PORT)) + .setRegister(false); tripleProviderConfig.export(); - greeterService = - new ConsumerConfig() - .setApplication(new ApplicationConfig().setAppName("test-client")) - .setInterfaceId(TripleGreeterService.class.getName()) - .setDirectUrl("tri://127.0.0.1:" + TRIPLE_PORT) - .setProtocol("tri") - .setRegister(false) - .setSubscribe(false) - .refer(); + greeterService = new ConsumerConfig() + .setApplication(new ApplicationConfig().setAppName("test-client")) + .setInterfaceId(TripleGreeterService.class.getName()) + .setDirectUrl("tri://127.0.0.1:" + TRIPLE_PORT) + .setProtocol("tri") + .setRegister(false) + .setSubscribe(false) + .refer(); } @AfterEach diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java index aa820673d1b..0b58ae3e2a9 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java @@ -171,15 +171,13 @@ public AbstractDatadogSparkListener(SparkConf sparkConf, String appId, String sp // - no guarantee it will be executed before the tracer shuts down // - no access to the exit code Runtime.getRuntime() - .addShutdownHook( - AgentThreadFactory.newAgentThread( - AgentThreadFactory.AgentThread.DATA_JOBS_MONITORING_SHUTDOWN_HOOK, - () -> { - if (!applicationEnded) { - log.info("Finishing application trace from shutdown hook"); - finishApplication(System.currentTimeMillis(), null, 0, null); - } - })); + .addShutdownHook(AgentThreadFactory.newAgentThread( + AgentThreadFactory.AgentThread.DATA_JOBS_MONITORING_SHUTDOWN_HOOK, () -> { + if (!applicationEnded) { + log.info("Finishing application trace from shutdown hook"); + finishApplication(System.currentTimeMillis(), null, 0, null); + } + })); } public void setupOpenLineage(DDTraceId traceId) { @@ -193,15 +191,14 @@ public void setupOpenLineage(DDTraceId traceId) { openLineageSparkConf.set( "spark.openlineage.transport.transports.agent.endpoint", AGENT_OL_ENDPOINT); openLineageSparkConf.set("spark.openlineage.transport.transports.agent.compression", "gzip"); - String runTags = - "_dd.trace_id:" - + traceId.toString() - + ";_dd.ol_intake.emit_spans:false;_dd.ol_service:" - + getServiceForOpenLineage(sparkConf, isRunningOnDatabricks) - + ";_dd.ol_intake.process_tags:" - + ProcessTags.getTagsForSerialization() - + ";_dd.ol_app_id:" - + appId; + String runTags = "_dd.trace_id:" + + traceId.toString() + + ";_dd.ol_intake.emit_spans:false;_dd.ol_service:" + + getServiceForOpenLineage(sparkConf, isRunningOnDatabricks) + + ";_dd.ol_intake.process_tags:" + + ProcessTags.getTagsForSerialization() + + ";_dd.ol_app_id:" + + appId; // _dd.ol_env carries the run environment so the lineage-processor can use it // as the Spark application's UGP namespace, letting the OpenLineage-created // node and the tracer-only node (djm-span-processor) resolve to the same @@ -258,10 +255,9 @@ public synchronized void onApplicationStart(SparkListenerApplicationStart applic } if (openLineageSparkListener != null) { - setupOpenLineage( - OpenlineageParentContext.from(sparkConf) - .map(context -> context.getTraceId()) - .orElse(predeterminedTraceIdContext.getTraceId())); + setupOpenLineage(OpenlineageParentContext.from(sparkConf) + .map(context -> context.getTraceId()) + .orElse(predeterminedTraceIdContext.getTraceId())); } notifyOl(x -> openLineageSparkListener.onApplicationStart(x), applicationStart); } @@ -276,11 +272,10 @@ private void initApplicationSpanIfNotInitialized() { AgentTracer.SpanBuilder builder = buildSparkSpan("spark.application", null); if (applicationStart != null) { - String ddTags = - Config.get().getGlobalTags().entrySet().stream() - .sorted(Map.Entry.comparingByKey()) - .map(e -> e.getKey() + ":" + e.getValue()) - .collect(Collectors.joining(",")); + String ddTags = Config.get().getGlobalTags().entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .map(e -> e.getKey() + ":" + e.getValue()) + .collect(Collectors.joining(",")); builder .withStartTimestamp(applicationStart.time() * 1000) @@ -452,12 +447,11 @@ private void addDatabricksSpecificTags( builder.withTag("databricks_job_run_id", databricksJobRunId); builder.withTag("databricks_task_run_id", databricksTaskRunId); - AgentSpanContext parentContext = - new DatabricksParentContext( - databricksJobId, - databricksJobRunId, - databricksTaskRunId, - getDatabricksJobRunAttempt(properties)); + AgentSpanContext parentContext = new DatabricksParentContext( + databricksJobId, + databricksJobRunId, + databricksTaskRunId, + getDatabricksJobRunAttempt(properties)); if (parentContext.getTraceId() != DDTraceId.ZERO) { if (withParentContext) { @@ -481,14 +475,13 @@ private AgentSpan getOrCreateSqlSpan( return null; } - AgentTracer.SpanBuilder spanBuilder = - buildSparkSpan("spark.sql", jobProperties) - .withStartTimestamp(queryStart.time() * 1000) - .withTag("query_id", sqlExecutionId) - .withTag("description", queryStart.description()) - .withTag("details", queryStart.details()) - .withTag("_dd.spark.physical_plan", queryStart.physicalPlanDescription()) - .withTag(DDTags.RESOURCE_NAME, queryStart.description()); + AgentTracer.SpanBuilder spanBuilder = buildSparkSpan("spark.sql", jobProperties) + .withStartTimestamp(queryStart.time() * 1000) + .withTag("query_id", sqlExecutionId) + .withTag("description", queryStart.description()) + .withTag("details", queryStart.details()) + .withTag("_dd.spark.physical_plan", queryStart.physicalPlanDescription()) + .withTag(DDTags.RESOURCE_NAME, queryStart.description()); if (batchKey != null) { AgentSpan batchSpan = @@ -514,11 +507,10 @@ public synchronized void onJobStart(SparkListenerJobStart jobStart) { return; } - AgentTracer.SpanBuilder jobSpanBuilder = - buildSparkSpan("spark.job", jobStart.properties()) - .withStartTimestamp(jobStart.time() * 1000) - .withTag("job_id", jobStart.jobId()) - .withTag("stage_count", getStageCount(jobStart)); + AgentTracer.SpanBuilder jobSpanBuilder = buildSparkSpan("spark.job", jobStart.properties()) + .withStartTimestamp(jobStart.time() * 1000) + .withTag("job_id", jobStart.jobId()) + .withTag("stage_count", getStageCount(jobStart)); String batchKey = getStreamingBatchKey(jobStart.properties()); Long sqlExecutionId = getSqlExecutionId(jobStart.properties()); @@ -636,17 +628,15 @@ public synchronized void onStageSubmitted(SparkListenerStageSubmitted stageSubmi new SparkAggregatedTaskMetrics(computeCurrentAvailableExecutorTime(submissionTimeMs))); stageProperties.put(stageSpanKey, stageSubmitted.properties()); - AgentSpan stageSpan = - buildSparkSpan("spark.stage", stageSubmitted.properties()) - .asChildOf(jobSpan.spanContext()) - .withStartTimestamp(submissionTimeMs * 1000) - .withTag("stage_id", stageId) - .withTag( - "parent_stage_ids", Arrays.toString(getStageParentIds(stageSubmitted.stageInfo()))) - .withTag("task_count", stageSubmitted.stageInfo().numTasks()) - .withTag("attempt_id", stageAttemptId) - .withTag(DDTags.RESOURCE_NAME, stageSubmitted.stageInfo().name()) - .start(); + AgentSpan stageSpan = buildSparkSpan("spark.stage", stageSubmitted.properties()) + .asChildOf(jobSpan.spanContext()) + .withStartTimestamp(submissionTimeMs * 1000) + .withTag("stage_id", stageId) + .withTag("parent_stage_ids", Arrays.toString(getStageParentIds(stageSubmitted.stageInfo()))) + .withTag("task_count", stageSubmitted.stageInfo().numTasks()) + .withTag("attempt_id", stageAttemptId) + .withTag(DDTags.RESOURCE_NAME, stageSubmitted.stageInfo().name()) + .start(); setDataJobsSamplingPriority(stageSpan); stageSpan.setMeasured(true); @@ -674,7 +664,8 @@ public synchronized void onStageCompleted(SparkListenerStageCompleted stageCompl span.setTag("details", stageCompleted.stageInfo().details()); if (stageInfo.failureReason().isDefined()) { span.setError(true); - span.setErrorMessage(getErrorMessageWithoutStackTrace(stageInfo.failureReason().get())); + span.setErrorMessage( + getErrorMessageWithoutStackTrace(stageInfo.failureReason().get())); span.setTag(DDTags.ERROR_STACK, stageInfo.failureReason().get()); span.setTag(DDTags.ERROR_TYPE, "Spark Stage Failed"); } @@ -791,21 +782,20 @@ public static boolean classIsLoadable(String className) { private void sendTaskSpan( AgentSpan stageSpan, SparkListenerTaskEnd taskEnd, Properties properties) { - AgentSpan taskSpan = - buildSparkSpan("spark.task", properties) - .asChildOf(stageSpan.spanContext()) - .withStartTimestamp(taskEnd.taskInfo().launchTime() * 1000) - .withTag("task_id", taskEnd.taskInfo().taskId()) - .withTag("task_attempt_id", taskEnd.taskInfo().attemptNumber()) - .withTag("task_type", taskEnd.taskType()) - .withTag("stage_id", taskEnd.stageId()) - .withTag("stage_attempt_id", taskEnd.stageAttemptId()) - .withTag("executor_id", taskEnd.taskInfo().executorId()) - .withTag("host", taskEnd.taskInfo().host()) - .withTag("task_locality", taskEnd.taskInfo().taskLocality().toString()) - .withTag("speculative", taskEnd.taskInfo().speculative()) - .withTag("status", taskEnd.taskInfo().status()) - .start(); + AgentSpan taskSpan = buildSparkSpan("spark.task", properties) + .asChildOf(stageSpan.spanContext()) + .withStartTimestamp(taskEnd.taskInfo().launchTime() * 1000) + .withTag("task_id", taskEnd.taskInfo().taskId()) + .withTag("task_attempt_id", taskEnd.taskInfo().attemptNumber()) + .withTag("task_type", taskEnd.taskType()) + .withTag("stage_id", taskEnd.stageId()) + .withTag("stage_attempt_id", taskEnd.stageAttemptId()) + .withTag("executor_id", taskEnd.taskInfo().executorId()) + .withTag("host", taskEnd.taskInfo().host()) + .withTag("task_locality", taskEnd.taskInfo().taskLocality().toString()) + .withTag("speculative", taskEnd.taskInfo().speculative()) + .withTag("status", taskEnd.taskInfo().status()) + .start(); if (taskEnd.reason() instanceof TaskFailedReason) { TaskFailedReason reason = (TaskFailedReason) taskEnd.reason(); @@ -906,12 +896,10 @@ private static Class findAdaptiveExecutionUpdateClass() throws ClassNotFoundE MethodHandles.Lookup lookup = MethodHandles.lookup(); executionUpdateClass = findAdaptiveExecutionUpdateClass(); - executionIdMethod = - lookup.findVirtual( - executionUpdateClass, "executionId", MethodType.methodType(long.class)); - sparkPlanMethod = - lookup.findVirtual( - executionUpdateClass, "sparkPlanInfo", MethodType.methodType(SparkPlanInfo.class)); + executionIdMethod = lookup.findVirtual( + executionUpdateClass, "executionId", MethodType.methodType(long.class)); + sparkPlanMethod = lookup.findVirtual( + executionUpdateClass, "sparkPlanInfo", MethodType.methodType(SparkPlanInfo.class)); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException ignored) { } @@ -1525,9 +1513,8 @@ private static void reportKafkaOffsets( Iterator allPartitions = topicNode.fieldNames(); while (allPartitions.hasNext()) { String partition = allPartitions.next(); - DataStreamsTags tags = - DataStreamsTags.createWithPartition( - "kafka_commit", topic, partition, null, appName); + DataStreamsTags tags = DataStreamsTags.createWithPartition( + "kafka_commit", topic, partition, null, appName); AgentTracer.get() .getDataStreamsMonitoring() .trackBacklog(tags, topicNode.get(partition).asLong()); @@ -1573,11 +1560,10 @@ private static String getAgentHttpUrl() { return agentUrl; } - StringBuilder sb = - new StringBuilder("http://") - .append(Config.get().getAgentHost()) - .append(":") - .append(Config.get().getAgentPort()); + StringBuilder sb = new StringBuilder("http://") + .append(Config.get().getAgentHost()) + .append(":") + .append(Config.get().getAgentPort()); return sb.toString(); } diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractSparkPlanSerializer.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractSparkPlanSerializer.java index 271f273660a..8189c2693d3 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractSparkPlanSerializer.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/AbstractSparkPlanSerializer.java @@ -29,34 +29,28 @@ public abstract class AbstractSparkPlanSerializer { private final String SPARK_PKG_NAME = "org.apache.spark"; private final Set SAFE_PARSE_TRAVERSE = Collections.singleton(SPARK_PKG_NAME + ".sql.catalyst.plans.physical.Partitioning"); - private final Set SAFE_PARSE_STRING = - new HashSet<>( - Arrays.asList( - SPARK_PKG_NAME + ".Partitioner", // not a product or TreeNode - SPARK_PKG_NAME - + ".sql.catalyst.expressions.Attribute", // avoid data type added by simpleString - SPARK_PKG_NAME + ".sql.catalyst.optimizer.BuildSide", // enum (v3+) - SPARK_PKG_NAME + ".sql.catalyst.plans.JoinType", // enum - SPARK_PKG_NAME - + ".sql.catalyst.plans.physical.BroadcastMode", // not a product or TreeNode - SPARK_PKG_NAME - + ".sql.execution.ShufflePartitionSpec", // not a product or TreeNode (v3+) - SPARK_PKG_NAME + ".sql.execution.exchange.ShuffleOrigin" // enum (v3+) - )); + private final Set SAFE_PARSE_STRING = new HashSet<>(Arrays.asList( + SPARK_PKG_NAME + ".Partitioner", // not a product or TreeNode + SPARK_PKG_NAME + + ".sql.catalyst.expressions.Attribute", // avoid data type added by simpleString + SPARK_PKG_NAME + ".sql.catalyst.optimizer.BuildSide", // enum (v3+) + SPARK_PKG_NAME + ".sql.catalyst.plans.JoinType", // enum + SPARK_PKG_NAME + ".sql.catalyst.plans.physical.BroadcastMode", // not a product or TreeNode + SPARK_PKG_NAME + ".sql.execution.ShufflePartitionSpec", // not a product or TreeNode (v3+) + SPARK_PKG_NAME + ".sql.execution.exchange.ShuffleOrigin" // enum (v3+) + )); // Add class here if we want to break inheritance and interface traversal early when we see // this class. In other words, we explicitly do not match these classes or their parents - private final Set NEGATIVE_CACHE = - new HashSet<>( - Arrays.asList( - "java.io.Serializable", - "java.lang.Object", - "scala.Equals", - "scala.Product", - SPARK_PKG_NAME + ".sql.catalyst.InternalRow", - SPARK_PKG_NAME + ".sql.catalyst.expressions.UnaryExpression", - SPARK_PKG_NAME + ".sql.catalyst.expressions.Unevaluable", - SPARK_PKG_NAME + ".sql.catalyst.trees.TreeNode")); + private final Set NEGATIVE_CACHE = new HashSet<>(Arrays.asList( + "java.io.Serializable", + "java.lang.Object", + "scala.Equals", + "scala.Product", + SPARK_PKG_NAME + ".sql.catalyst.InternalRow", + SPARK_PKG_NAME + ".sql.catalyst.expressions.UnaryExpression", + SPARK_PKG_NAME + ".sql.catalyst.expressions.Unevaluable", + SPARK_PKG_NAME + ".sql.catalyst.trees.TreeNode")); private final MethodHandles methodLoader = new MethodHandles(ClassLoader.getSystemClassLoader()); private final MethodHandle getSimpleString = @@ -68,11 +62,9 @@ public abstract class AbstractSparkPlanSerializer { public Map extractFormattedProduct(SparkPlan plan) { HashMap result = new HashMap<>(); - safeParseTreeNode(plan, 0) - .forEach( - (key, value) -> { - result.put(key, writeObjectToString(value)); - }); + safeParseTreeNode(plan, 0).forEach((key, value) -> { + result.put(key, writeObjectToString(value)); + }); return result; } diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/OpenlineageParentContext.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/OpenlineageParentContext.java index 51977d73f6c..3ca80ab53cc 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/OpenlineageParentContext.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/OpenlineageParentContext.java @@ -18,9 +18,8 @@ public class OpenlineageParentContext implements AgentSpanContext { private static final Logger log = LoggerFactory.getLogger(OpenlineageParentContext.class); - private static final Pattern UUID = - Pattern.compile( - "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"); + private static final Pattern UUID = Pattern.compile( + "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"); private final DDTraceId traceId; private final long spanId; @@ -72,14 +71,13 @@ public static Optional from(SparkConf sparkConf) { return Optional.empty(); } - return Optional.of( - new OpenlineageParentContext( - parentJobNamespace, - parentJobName, - parentRunId, - rootParentJobNamespace, - rootParentJobName, - rootParentRunId)); + return Optional.of(new OpenlineageParentContext( + parentJobNamespace, + parentJobName, + parentRunId, + rootParentJobNamespace, + rootParentJobName, + rootParentRunId)); } OpenlineageParentContext( diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java index 988a9507649..166d0dddcf2 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkAggregatedTaskMetrics.java @@ -129,14 +129,12 @@ public void addTaskMetrics( taskRunTimeHistogram = lazyHistogramAccept(taskRunTimeHistogram, taskRunTime); inputBytesHistogram = lazyHistogramAccept(inputBytesHistogram, taskMetrics.inputMetrics().bytesRead()); - outputBytesHistogram = - lazyHistogramAccept(outputBytesHistogram, taskMetrics.outputMetrics().bytesWritten()); - shuffleReadBytesHistogram = - lazyHistogramAccept( - shuffleReadBytesHistogram, taskMetrics.shuffleReadMetrics().totalBytesRead()); - shuffleWriteBytesHistogram = - lazyHistogramAccept( - shuffleWriteBytesHistogram, taskMetrics.shuffleWriteMetrics().bytesWritten()); + outputBytesHistogram = lazyHistogramAccept( + outputBytesHistogram, taskMetrics.outputMetrics().bytesWritten()); + shuffleReadBytesHistogram = lazyHistogramAccept( + shuffleReadBytesHistogram, taskMetrics.shuffleReadMetrics().totalBytesRead()); + shuffleWriteBytesHistogram = lazyHistogramAccept( + shuffleWriteBytesHistogram, taskMetrics.shuffleWriteMetrics().bytesWritten()); diskBytesSpilledHistogram = lazyHistogramAccept(diskBytesSpilledHistogram, taskMetrics.diskBytesSpilled()); @@ -147,23 +145,21 @@ public void addTaskMetrics( externalAccumulableHistograms = new RemoveEldestHashMap<>(MAX_ACCUMULATOR_SIZE); } - externalAccumulators.forEach( - acc -> { - HistogramWithSum hist = externalAccumulableHistograms.get(acc.id()); - if (hist == null) { - hist = - Histogram.newHistogramWithSum( - HISTOGRAM_RELATIVE_ACCURACY, HISTOGRAM_MAX_NUM_BINS); - } - - try { - // As of spark 3.5, all SQL metrics are Long, safeguard if it changes in new - // versions - hist.accept(((Number) acc.value()).doubleValue()); - externalAccumulableHistograms.put(acc.id(), hist); - } catch (ClassCastException ignored) { - } - }); + externalAccumulators.forEach(acc -> { + HistogramWithSum hist = externalAccumulableHistograms.get(acc.id()); + if (hist == null) { + hist = Histogram.newHistogramWithSum( + HISTOGRAM_RELATIVE_ACCURACY, HISTOGRAM_MAX_NUM_BINS); + } + + try { + // As of spark 3.5, all SQL metrics are Long, safeguard if it changes in new + // versions + hist.accept(((Number) acc.value()).doubleValue()); + externalAccumulableHistograms.put(acc.id(), hist); + } catch (ClassCastException ignored) { + } + }); } } } diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkConfAllowList.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkConfAllowList.java index 23c13688306..a1d10b4af58 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkConfAllowList.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkConfAllowList.java @@ -27,60 +27,58 @@ class SparkConfAllowList { * Job-specific parameters that can be used to control job execution or provide metadata about the * job being executed */ - private static final Set allowedJobParams = - new HashSet<>( - Arrays.asList( - "spark.app.id", - "spark.app.name", - "spark.app.startTime", - "spark.databricks.clusterSource", - "spark.databricks.clusterUsageTags.clusterId", - "spark.databricks.clusterUsageTags.clusterName", - "spark.databricks.clusterUsageTags.clusterNodeType", - "spark.databricks.clusterUsageTags.clusterWorkers", - "spark.databricks.clusterUsageTags.driverContainerId", - "spark.databricks.clusterUsageTags.sparkVersion", - "spark.databricks.clusterUsageTags.workerEnvironmentId", - "spark.databricks.env", - "spark.databricks.job.parentRunId", - "spark.databricks.job.type", - "spark.databricks.sparkContextId", - "spark.databricks.workload.name", - "spark.default.parallelism", - "spark.dynamicAllocation.enabled", - "spark.dynamicAllocation.executorIdleTimeout", - "spark.dynamicAllocation.initialExecutors", - "spark.dynamicAllocation.maxExecutors", - "spark.dynamicAllocation.minExecutors", - "spark.dynamicAllocation.executorAllocationRatio", - "spark.dynamicAllocation.schedulerBacklogTimeout", - "spark.driver.cores", - "spark.driver.maxResultSize", - "spark.driver.memory", - "spark.driver.memoryOverhead", - "spark.driver.memoryOverheadFactor", - "spark.executor.cores", - "spark.executor.instances", - "spark.executor.memory", - "spark.executor.pyspark.memory", - "spark.executor.memoryOverhead", - "spark.executor.memoryOverheadFactor", - "spark.files.maxPartitionBytes", - "spark.job.description", - "spark.jobGroup.id", - "spark.master", - "spark.memory.fraction", - "spark.memory.storageFraction", - "spark.memory.offHeap.enabled", - "spark.memory.offHeap.size", - "spark.submit.deployMode", - "spark.sql.autoBroadcastJoinThreshold", - "spark.sql.files.maxPartitionBytes", - "spark.sql.shuffle.partitions", - "spark.sql.execution.id", - "sql.streaming.queryId", - "streaming.sql.batchId", - "user")); + private static final Set allowedJobParams = new HashSet<>(Arrays.asList( + "spark.app.id", + "spark.app.name", + "spark.app.startTime", + "spark.databricks.clusterSource", + "spark.databricks.clusterUsageTags.clusterId", + "spark.databricks.clusterUsageTags.clusterName", + "spark.databricks.clusterUsageTags.clusterNodeType", + "spark.databricks.clusterUsageTags.clusterWorkers", + "spark.databricks.clusterUsageTags.driverContainerId", + "spark.databricks.clusterUsageTags.sparkVersion", + "spark.databricks.clusterUsageTags.workerEnvironmentId", + "spark.databricks.env", + "spark.databricks.job.parentRunId", + "spark.databricks.job.type", + "spark.databricks.sparkContextId", + "spark.databricks.workload.name", + "spark.default.parallelism", + "spark.dynamicAllocation.enabled", + "spark.dynamicAllocation.executorIdleTimeout", + "spark.dynamicAllocation.initialExecutors", + "spark.dynamicAllocation.maxExecutors", + "spark.dynamicAllocation.minExecutors", + "spark.dynamicAllocation.executorAllocationRatio", + "spark.dynamicAllocation.schedulerBacklogTimeout", + "spark.driver.cores", + "spark.driver.maxResultSize", + "spark.driver.memory", + "spark.driver.memoryOverhead", + "spark.driver.memoryOverheadFactor", + "spark.executor.cores", + "spark.executor.instances", + "spark.executor.memory", + "spark.executor.pyspark.memory", + "spark.executor.memoryOverhead", + "spark.executor.memoryOverheadFactor", + "spark.files.maxPartitionBytes", + "spark.job.description", + "spark.jobGroup.id", + "spark.master", + "spark.memory.fraction", + "spark.memory.storageFraction", + "spark.memory.offHeap.enabled", + "spark.memory.offHeap.size", + "spark.submit.deployMode", + "spark.sql.autoBroadcastJoinThreshold", + "spark.sql.files.maxPartitionBytes", + "spark.sql.shuffle.partitions", + "spark.sql.execution.id", + "sql.streaming.queryId", + "streaming.sql.batchId", + "user")); public static boolean canCaptureJobParameter(String parameterName) { return allowedJobParams.contains(parameterName); diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkExitAdvice.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkExitAdvice.java index 1306da2b373..1c83992e331 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkExitAdvice.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkExitAdvice.java @@ -9,17 +9,14 @@ public static void enter(@Advice.Argument(0) int exitCode) { try { // Using reflection as java.lang.* instrumentation have to be done at boostrap, // when spark classes have not been injected yet - Class klass = - Thread.currentThread() - .getContextClassLoader() - .loadClass("datadog.trace.instrumentation.spark.AbstractDatadogSparkListener"); + Class klass = Thread.currentThread() + .getContextClassLoader() + .loadClass("datadog.trace.instrumentation.spark.AbstractDatadogSparkListener"); Object datadogListener = klass.getDeclaredField("listener").get(null); if (datadogListener != null) { - Method method = - datadogListener - .getClass() - .getMethod( - "finishApplication", long.class, Throwable.class, int.class, String.class); + Method method = datadogListener + .getClass() + .getMethod("finishApplication", long.class, Throwable.class, int.class, String.class); method.invoke(datadogListener, System.currentTimeMillis(), null, exitCode, null); } } catch (Exception ignored) { diff --git a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkLauncherListener.java b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkLauncherListener.java index fa050768917..acdf3e21afa 100644 --- a/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkLauncherListener.java +++ b/dd-java-agent/instrumentation/spark/spark-common/src/main/java/datadog/trace/instrumentation/spark/SparkLauncherListener.java @@ -41,12 +41,11 @@ public static synchronized void createLauncherSpan(Object launcher) { } AgentTracer.TracerAPI tracer = AgentTracer.get(); - AgentSpan span = - tracer - .buildSpan("spark-launcher", "spark.launcher.launch") - .withSpanType("spark") - .withResourceName("SparkLauncher.startApplication") - .start(); + AgentSpan span = tracer + .buildSpan("spark-launcher", "spark.launcher.launch") + .withSpanType("spark") + .withResourceName("SparkLauncher.startApplication") + .start(); span.setSamplingPriority(PrioritySampling.USER_KEEP, SamplingMechanism.DATA_JOBS); setLauncherConfigTags(span, launcher); captureEmrStepId(span); @@ -58,20 +57,17 @@ public static synchronized void createLauncherSpan(Object launcher) { if (!shutdownHookRegistered) { shutdownHookRegistered = true; - Runtime.getRuntime() - .addShutdownHook( - new Thread( - () -> { - synchronized (SparkLauncherListener.class) { - AgentSpan s = launcherSpan; - if (s != null) { - log.info("Finishing spark.launcher span from shutdown hook"); - setTimingMetrics(s); - s.finish(); - launcherSpan = null; - } - } - })); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + synchronized (SparkLauncherListener.class) { + AgentSpan s = launcherSpan; + if (s != null) { + log.info("Finishing spark.launcher span from shutdown hook"); + setTimingMetrics(s); + s.finish(); + launcherSpan = null; + } + } + })); } } diff --git a/dd-java-agent/instrumentation/spark/spark-executor-common/src/main/java/datadog/trace/instrumentation/spark/SparkExecutorDecorator.java b/dd-java-agent/instrumentation/spark/spark-executor-common/src/main/java/datadog/trace/instrumentation/spark/SparkExecutorDecorator.java index a618745bbed..f94bc103773 100644 --- a/dd-java-agent/instrumentation/spark/spark-executor-common/src/main/java/datadog/trace/instrumentation/spark/SparkExecutorDecorator.java +++ b/dd-java-agent/instrumentation/spark/spark-executor-common/src/main/java/datadog/trace/instrumentation/spark/SparkExecutorDecorator.java @@ -82,7 +82,8 @@ protected void doOnTaskEnd(AgentSpan span, Executor.TaskRunner taskRunner) { span.setMetric("spark.output_records", metrics.outputMetrics().recordsWritten()); span.setMetric("spark.shuffle_read_bytes", metrics.shuffleReadMetrics().totalBytesRead()); - span.setMetric("spark.shuffle_read_bytes_local", metrics.shuffleReadMetrics().localBytesRead()); + span.setMetric( + "spark.shuffle_read_bytes_local", metrics.shuffleReadMetrics().localBytesRead()); span.setMetric( "spark.shuffle_read_bytes_remote", metrics.shuffleReadMetrics().remoteBytesRead()); span.setMetric( diff --git a/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark212Listener.java b/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark212Listener.java index 31ff513880f..da4a44aa939 100644 --- a/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark212Listener.java +++ b/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark212Listener.java @@ -83,9 +83,8 @@ protected List getExternalAccumulators(TaskMetrics metrics) { return null; } - Function1 lambda = - (Function1, List>) - accumulators -> JavaConverters.seqAsJavaList(accumulators); + Function1 lambda = (Function1, List>) + accumulators -> JavaConverters.seqAsJavaList(accumulators); List res = methodLoader.invoke(withExternalAccums, metrics, lambda); if (res != null) { return res; diff --git a/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212Instrumentation.java b/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212Instrumentation.java index ea327e9ed2d..6f8de870c27 100644 --- a/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212Instrumentation.java +++ b/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212Instrumentation.java @@ -94,9 +94,8 @@ public static void enter(@Advice.This SparkContext sparkContext) { } // We want to add the Datadog listener as the first listener - AbstractDatadogSparkListener.listener = - new DatadogSpark212Listener( - sparkContext.getConf(), sparkContext.applicationId(), sparkContext.version()); + AbstractDatadogSparkListener.listener = new DatadogSpark212Listener( + sparkContext.getConf(), sparkContext.applicationId(), sparkContext.version()); sparkContext.listenerBus().addToSharedQueue(AbstractDatadogSparkListener.listener); } } @@ -111,9 +110,9 @@ public static void exit( && (Config.get().isDataJobsParseSparkPlanEnabled() || Config.get().isDataJobsExperimentalFeaturesEnabled())) { Spark212PlanSerializer planSerializer = new Spark212PlanSerializer(); - Map meta = - JavaConverters.mapAsScalaMap(planSerializer.extractFormattedProduct(plan)) - .toMap(Predef.$conforms()); + Map meta = JavaConverters.mapAsScalaMap( + planSerializer.extractFormattedProduct(plan)) + .toMap(Predef.$conforms()); SparkPlanInfo newPlanInfo = new Spark212PlanUtils().upsertSparkPlanInfoMetadata(planInfo, meta); diff --git a/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212PlanUtils.java b/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212PlanUtils.java index 4d9bef21cdd..ea5a3e959de 100644 --- a/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212PlanUtils.java +++ b/dd-java-agent/instrumentation/spark/spark_2.12/src/main/java/datadog/trace/instrumentation/spark/Spark212PlanUtils.java @@ -6,25 +6,23 @@ import scala.collection.immutable.Map; public class Spark212PlanUtils extends AbstractSparkPlanUtils { - private static final MethodHandle constructor = - methodLoader.constructor( - SparkPlanInfo.class, - String.class, - String.class, - scala.collection.Seq.class, - scala.collection.immutable.Map.class, - scala.collection.Seq.class); - private static final MethodHandle databricksConstructor = - methodLoader.constructor( - SparkPlanInfo.class, - String.class, - String.class, - scala.collection.Seq.class, - scala.collection.immutable.Map.class, - scala.collection.Seq.class, - Option.class, - String.class, - Option.class); + private static final MethodHandle constructor = methodLoader.constructor( + SparkPlanInfo.class, + String.class, + String.class, + scala.collection.Seq.class, + scala.collection.immutable.Map.class, + scala.collection.Seq.class); + private static final MethodHandle databricksConstructor = methodLoader.constructor( + SparkPlanInfo.class, + String.class, + String.class, + scala.collection.Seq.class, + scala.collection.immutable.Map.class, + scala.collection.Seq.class, + Option.class, + String.class, + Option.class); @Override protected MethodHandle getConstructor() { diff --git a/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark213Listener.java b/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark213Listener.java index 91c3a1bd511..9e28ed647db 100644 --- a/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark213Listener.java +++ b/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/DatadogSpark213Listener.java @@ -83,9 +83,8 @@ protected List getExternalAccumulators(TaskMetrics metrics) { return null; } - Function1 lambda = - (Function1, List>) - accumulators -> CollectionConverters.asJava(accumulators); + Function1 lambda = (Function1, List>) + accumulators -> CollectionConverters.asJava(accumulators); List res = methodLoader.invoke(withExternalAccums, metrics, lambda); if (res != null) { return res; diff --git a/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213Instrumentation.java b/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213Instrumentation.java index b4e91f0c824..cc2422d5f30 100644 --- a/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213Instrumentation.java +++ b/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213Instrumentation.java @@ -95,9 +95,8 @@ public static void enter(@Advice.This SparkContext sparkContext) { } // We want to add the Datadog listener as the first listener - AbstractDatadogSparkListener.listener = - new DatadogSpark213Listener( - sparkContext.getConf(), sparkContext.applicationId(), sparkContext.version()); + AbstractDatadogSparkListener.listener = new DatadogSpark213Listener( + sparkContext.getConf(), sparkContext.applicationId(), sparkContext.version()); sparkContext.listenerBus().addToSharedQueue(AbstractDatadogSparkListener.listener); } } diff --git a/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213PlanUtils.java b/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213PlanUtils.java index c59b4fdf600..8e299435ec4 100644 --- a/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213PlanUtils.java +++ b/dd-java-agent/instrumentation/spark/spark_2.13/src/main/java/datadog/trace/instrumentation/spark/Spark213PlanUtils.java @@ -6,25 +6,23 @@ import scala.collection.immutable.Map; public class Spark213PlanUtils extends AbstractSparkPlanUtils { - private static final MethodHandle constructor = - methodLoader.constructor( - SparkPlanInfo.class, - String.class, - String.class, - scala.collection.immutable.Seq.class, - scala.collection.immutable.Map.class, - scala.collection.immutable.Seq.class); - private static final MethodHandle databricksConstructor = - methodLoader.constructor( - SparkPlanInfo.class, - String.class, - String.class, - scala.collection.immutable.Seq.class, - scala.collection.immutable.Map.class, - scala.collection.immutable.Seq.class, - Option.class, - String.class, - Option.class); + private static final MethodHandle constructor = methodLoader.constructor( + SparkPlanInfo.class, + String.class, + String.class, + scala.collection.immutable.Seq.class, + scala.collection.immutable.Map.class, + scala.collection.immutable.Seq.class); + private static final MethodHandle databricksConstructor = methodLoader.constructor( + SparkPlanInfo.class, + String.class, + String.class, + scala.collection.immutable.Seq.class, + scala.collection.immutable.Map.class, + scala.collection.immutable.Seq.class, + Option.class, + String.class, + Option.class); @Override protected MethodHandle getConstructor() { diff --git a/dd-java-agent/instrumentation/spark/sparkjava-2.3/src/test/java/TestSparkJavaApplication.java b/dd-java-agent/instrumentation/spark/sparkjava-2.3/src/test/java/TestSparkJavaApplication.java index 93f904c7206..5b51c84e546 100644 --- a/dd-java-agent/instrumentation/spark/sparkjava-2.3/src/test/java/TestSparkJavaApplication.java +++ b/dd-java-agent/instrumentation/spark/sparkjava-2.3/src/test/java/TestSparkJavaApplication.java @@ -8,11 +8,9 @@ public static void initSpark(final int port) { Spark.get("/param/:param", (req, res) -> "Hello " + req.params("param")); - Spark.get( - "/exception/:param", - (req, res) -> { - throw new RuntimeException(req.params("param")); - }); + Spark.get("/exception/:param", (req, res) -> { + throw new RuntimeException(req.params("param")); + }); Spark.awaitInitialization(); } diff --git a/dd-java-agent/instrumentation/spring/spring-beans-3.1/src/main/java/datadog/trace/instrumentation/springbeans/BeanFactoryInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-beans-3.1/src/main/java/datadog/trace/instrumentation/springbeans/BeanFactoryInstrumentation.java index 07f708e78e1..6c3427d9438 100644 --- a/dd-java-agent/instrumentation/spring/spring-beans-3.1/src/main/java/datadog/trace/instrumentation/springbeans/BeanFactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-beans-3.1/src/main/java/datadog/trace/instrumentation/springbeans/BeanFactoryInstrumentation.java @@ -58,9 +58,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("resolveBeanClass")) - .and( - takesArgument( - 0, named("org.springframework.beans.factory.support.RootBeanDefinition"))), + .and(takesArgument( + 0, named("org.springframework.beans.factory.support.RootBeanDefinition"))), BeanFactoryInstrumentation.class.getName() + "$BeanResolvingAdvice"); } diff --git a/dd-java-agent/instrumentation/spring/spring-boot-1.3/src/main/java/datadog/trace/instrumentation/springboot/SBCodeOriginInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-boot-1.3/src/main/java/datadog/trace/instrumentation/springboot/SBCodeOriginInstrumentation.java index 1c4d1c47ea5..7fd17003cc5 100644 --- a/dd-java-agent/instrumentation/spring/spring-boot-1.3/src/main/java/datadog/trace/instrumentation/springboot/SBCodeOriginInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-boot-1.3/src/main/java/datadog/trace/instrumentation/springboot/SBCodeOriginInstrumentation.java @@ -18,11 +18,10 @@ public SBCodeOriginInstrumentation() { @Override protected Set getAnnotations() { - return new HashSet<>( - asList( - WEB_BIND_ANNOTATION + "GetMapping", - WEB_BIND_ANNOTATION + "PostMapping", - WEB_BIND_ANNOTATION + "PutMapping", - WEB_BIND_ANNOTATION + "PatchMapping")); + return new HashSet<>(asList( + WEB_BIND_ANNOTATION + "GetMapping", + WEB_BIND_ANNOTATION + "PostMapping", + WEB_BIND_ANNOTATION + "PutMapping", + WEB_BIND_ANNOTATION + "PatchMapping")); } } diff --git a/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/HeaderUtils.java b/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/HeaderUtils.java index 5ae36a64e8f..2360b5f5eeb 100644 --- a/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/HeaderUtils.java +++ b/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/HeaderUtils.java @@ -7,25 +7,23 @@ public class HeaderUtils { // for now get all the B3, Haystack, Datadog headers and ignore them // (headers are all in lowercase for non case sensitiveness) - public static final Set EXCLUDED_HEADERS = - new HashSet( - Arrays.asList( - // DD headers - "x-datadog-trace-id", - "x-datadog-parent-id", - "x-datadog-sampling-priority", - "x-datadog-origin", - // B3 headers - "x-b3-traceid", - "x-b3-spanid", - "x-b3-sampled", - // Haystack headers - "trace-id", - "span-id", - "parent-id", - "haystack-trace-id", - "haystack-span-id", - "haystack-parent-id")); + public static final Set EXCLUDED_HEADERS = new HashSet(Arrays.asList( + // DD headers + "x-datadog-trace-id", + "x-datadog-parent-id", + "x-datadog-sampling-priority", + "x-datadog-origin", + // B3 headers + "x-b3-traceid", + "x-b3-spanid", + "x-b3-sampled", + // Haystack headers + "trace-id", + "span-id", + "parent-id", + "haystack-trace-id", + "haystack-span-id", + "haystack-parent-id")); public static final String HAYSTACK_PACKAGE_PREFIX = "baggage-"; public static final String DD_PACKAGE_PREFIX = "ot-baggage-"; diff --git a/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/ZuulSendForwardFilterInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/ZuulSendForwardFilterInstrumentation.java index f167301e029..9f8ebf870d7 100644 --- a/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/ZuulSendForwardFilterInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/src/main/java/datadog/trace/instrumentation/springcloudzuul2/ZuulSendForwardFilterInstrumentation.java @@ -66,9 +66,8 @@ public static void onExit( final String method = request.getMethod(); // Get the updated route pattern. // Opted for static string here to avoid an additional spring dependency. - final Object bestMatchingPattern = - request.getAttribute( - "org.springframework.web.servlet.HandlerMapping.bestMatchingPattern"); + final Object bestMatchingPattern = request.getAttribute( + "org.springframework.web.servlet.HandlerMapping.bestMatchingPattern"); if (method != null && bestMatchingPattern != null) { HTTP_RESOURCE_DECORATOR.withRoute(parentSpan, method, bestMatchingPattern.toString()); } diff --git a/dd-java-agent/instrumentation/spring/spring-jms-3.1/src/main/java/datadog/trace/instrumentation/springjms/AbstractPollingMessageListenerContainerInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-jms-3.1/src/main/java/datadog/trace/instrumentation/springjms/AbstractPollingMessageListenerContainerInstrumentation.java index 3ad07247953..41a2873700a 100644 --- a/dd-java-agent/instrumentation/spring/spring-jms-3.1/src/main/java/datadog/trace/instrumentation/springjms/AbstractPollingMessageListenerContainerInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-jms-3.1/src/main/java/datadog/trace/instrumentation/springjms/AbstractPollingMessageListenerContainerInstrumentation.java @@ -54,9 +54,9 @@ public static void afterExecute(@Advice.Argument(2) final MessageConsumer consum // complete the last polled message span now that we know its execution phase is complete // this results in more accurate durations than if we relied on the iteration span cleaner // (uses same approach as the 'beforeReceive' advice in JMSMessageConsumerInstrumentation) - MessageConsumerState consumerState = - InstrumentationContext.get(MessageConsumer.class, MessageConsumerState.class) - .get(consumer); + MessageConsumerState consumerState = InstrumentationContext.get( + MessageConsumer.class, MessageConsumerState.class) + .get(consumer); if (null != consumerState) { boolean finishSpan = consumerState.getSessionState().isAutoAcknowledge(); if (InstrumenterConfig.get().isLegacyContextManagerEnabled()) { diff --git a/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageDecorator.java b/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageDecorator.java index 1cd547c75dc..d346cce61f8 100644 --- a/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageDecorator.java +++ b/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageDecorator.java @@ -10,9 +10,8 @@ public final class SpringMessageDecorator extends MessagingClientDecorator { public static final SpringMessageDecorator DECORATE = new SpringMessageDecorator(); - public static final CharSequence SPRING_INBOUND = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().messaging().inboundOperation("spring")); + public static final CharSequence SPRING_INBOUND = UTF8BytesString.create( + SpanNaming.instance().namingSchema().messaging().inboundOperation("spring")); public static final CharSequence COMPONENT_NAME = UTF8BytesString.create("spring-messaging"); diff --git a/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageExtractAdapter.java b/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageExtractAdapter.java index 2d6e1befd70..38ece68bc4f 100644 --- a/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageExtractAdapter.java +++ b/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageExtractAdapter.java @@ -15,18 +15,17 @@ public final class SpringMessageExtractAdapter implements AgentPropagation.ContextVisitor> { - private static final Function KEY_MAPPER = - new Function() { - @SuppressForbidden - @Override - public String apply(String key) { - // normalize headers from different providers; raw SQS, JMS, spring-messaging, etc. - if ("AWSTraceHeader".equals(key) || "Sqs_Msa_AWSTraceHeader".equals(key)) { - return "x-amzn-trace-id"; - } - return key.replace("__dash__", "-").replace('$', '-').toLowerCase(Locale.ROOT); - } - }; + private static final Function KEY_MAPPER = new Function() { + @SuppressForbidden + @Override + public String apply(String key) { + // normalize headers from different providers; raw SQS, JMS, spring-messaging, etc. + if ("AWSTraceHeader".equals(key) || "Sqs_Msa_AWSTraceHeader".equals(key)) { + return "x-amzn-trace-id"; + } + return key.replace("__dash__", "-").replace('$', '-').toLowerCase(Locale.ROOT); + } + }; private final DDCache cache = DDCaches.newFixedSizeCache(32); diff --git a/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageHandlerInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageHandlerInstrumentation.java index 69e8d73408e..9eb22d4ee92 100644 --- a/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SpringMessageHandlerInstrumentation.java @@ -43,9 +43,8 @@ public String instrumentedType() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvices( isMethod() - .and( - named("invoke") - .and(takesArgument(0, named("org.springframework.messaging.Message")))), + .and(named("invoke") + .and(takesArgument(0, named("org.springframework.messaging.Message")))), SpringMessageHandlerInstrumentation.class.getName() + "$ContextPropagationAdvice", SpringMessageHandlerInstrumentation.class.getName() + "$HandleMessageAdvice"); } diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/latestDepTest/java/ShedlockConfig.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/latestDepTest/java/ShedlockConfig.java index ea264bc6816..3e181c68dcf 100644 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/latestDepTest/java/ShedlockConfig.java +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/latestDepTest/java/ShedlockConfig.java @@ -31,10 +31,9 @@ public DataSource dataSource() { @Bean LockProvider lockProvider(@Autowired DataSource dataSource) { - return new JdbcTemplateLockProvider( - JdbcTemplateLockProvider.Configuration.builder() - .withJdbcTemplate(new JdbcTemplate(dataSource)) - .usingDbTime() - .build()); + return new JdbcTemplateLockProvider(JdbcTemplateLockProvider.Configuration.builder() + .withJdbcTemplate(new JdbcTemplate(dataSource)) + .usingDbTime() + .build()); } } diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringAsyncInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringAsyncInstrumentation.java index ad0c2dde831..3e2b6b1518b 100644 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringAsyncInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringAsyncInstrumentation.java @@ -32,9 +32,8 @@ public String[] helperClassNames() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() - .and( - named("invoke") - .and(takesArgument(0, named("org.aopalliance.intercept.MethodInvocation")))), + .and(named("invoke") + .and(takesArgument(0, named("org.aopalliance.intercept.MethodInvocation")))), packageName + ".SpringAsyncAdvice"); } } diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringSchedulingRunnableWrapper.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringSchedulingRunnableWrapper.java index 3bc452c6074..e22d483894b 100644 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringSchedulingRunnableWrapper.java +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpringSchedulingRunnableWrapper.java @@ -21,9 +21,9 @@ public class SpringSchedulingRunnableWrapper implements Runnable { static class SchedulingAware extends SpringSchedulingRunnableWrapper implements SchedulingAwareRunnable { - private static final MethodHandle GET_QUALIFIER_MH = - new MethodHandles(SchedulingAwareRunnable.class.getClassLoader()) - .method(SchedulingAwareRunnable.class, "getQualifier"); + private static final MethodHandle GET_QUALIFIER_MH = new MethodHandles( + SchedulingAwareRunnable.class.getClassLoader()) + .method(SchedulingAwareRunnable.class, "getQualifier"); SchedulingAware(Runnable runnable) { super(runnable); @@ -54,10 +54,9 @@ private SpringSchedulingRunnableWrapper(final Runnable runnable) { @Override public void run() { - final AgentSpan span = - LEGACY_TRACING - ? startSpan("spring-scheduling", SCHEDULED_CALL) - : startSpan("spring-scheduling", SCHEDULED_CALL, null); + final AgentSpan span = LEGACY_TRACING + ? startSpan("spring-scheduling", SCHEDULED_CALL) + : startSpan("spring-scheduling", SCHEDULED_CALL, null); DECORATE.afterStart(span); DECORATE.measureIfEnabled(span); diff --git a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ShedlockConfig.java b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ShedlockConfig.java index ea264bc6816..3e181c68dcf 100644 --- a/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ShedlockConfig.java +++ b/dd-java-agent/instrumentation/spring/spring-scheduling-3.1/src/test/java/ShedlockConfig.java @@ -31,10 +31,9 @@ public DataSource dataSource() { @Bean LockProvider lockProvider(@Autowired DataSource dataSource) { - return new JdbcTemplateLockProvider( - JdbcTemplateLockProvider.Configuration.builder() - .withJdbcTemplate(new JdbcTemplate(dataSource)) - .usingDbTime() - .build()); + return new JdbcTemplateLockProvider(JdbcTemplateLockProvider.Configuration.builder() + .withJdbcTemplate(new JdbcTemplate(dataSource)) + .usingDbTime() + .build()); } } diff --git a/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/SecurityContextHolderInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/SecurityContextHolderInstrumentation.java index 64d4718d5b6..d9224623c19 100644 --- a/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/SecurityContextHolderInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/SecurityContextHolderInstrumentation.java @@ -49,9 +49,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(named("setContext")) .and(takesArguments(1)) - .and( - takesArgument( - 0, named("org.springframework.security.core.context.SecurityContext"))) + .and(takesArgument( + 0, named("org.springframework.security.core.context.SecurityContext"))) .and(isPublic()), getClass().getName() + "$SetSecurityContextAdvice"); transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/UserDetailsManagerInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/UserDetailsManagerInstrumentation.java index ad1dfe06454..02f357c8208 100644 --- a/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/UserDetailsManagerInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-security/spring-security-5.0/src/main/java/datadog/trace/instrumentation/springsecurity5/UserDetailsManagerInstrumentation.java @@ -45,9 +45,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("createUser")) - .and( - takesArgument( - 0, named("org.springframework.security.core.userdetails.UserDetails"))) + .and(takesArgument( + 0, named("org.springframework.security.core.userdetails.UserDetails"))) .and(isPublic()), getClass().getName() + "$UserDetailsManagerAdvice"); } diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java index 0285c45b485..af42c3c48f4 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java @@ -20,27 +20,20 @@ public Mono handle(WebSocketSession webSocketSession) { } return webSocketSession .receive() - .map( - msg -> { - if (msg.getType() == WebSocketMessage.Type.TEXT) { - return webSocketSession.textMessage(msg.getPayloadAsText()); - } - byte[] bytes = new byte[msg.getPayload().readableByteCount()]; - msg.getPayload().read(bytes); - return webSocketSession.binaryMessage( - dataBufferFactory -> dataBufferFactory.wrap(bytes)); - }) - .flatMap( - msg -> - webSocketSession - .send(Mono.just(msg)) - .doFinally( - ignored -> { - synchronized (this) { - activeSession = null; - notifyAll(); - } - })) + .map(msg -> { + if (msg.getType() == WebSocketMessage.Type.TEXT) { + return webSocketSession.textMessage(msg.getPayloadAsText()); + } + byte[] bytes = new byte[msg.getPayload().readableByteCount()]; + msg.getPayload().read(bytes); + return webSocketSession.binaryMessage(dataBufferFactory -> dataBufferFactory.wrap(bytes)); + }) + .flatMap(msg -> webSocketSession.send(Mono.just(msg)).doFinally(ignored -> { + synchronized (this) { + activeSession = null; + notifyAll(); + } + })) .then(); } diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/client/StatusCodes.java b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/client/StatusCodes.java index 0a2f0c546c9..c0e2d5e7c8e 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/client/StatusCodes.java +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/client/StatusCodes.java @@ -37,16 +37,13 @@ private static Function getStatusCodeFunction60() { MethodHandle statusCode; MethodHandle value; try { - Class httpStatusCodeClass = - Class.forName( - "org.springframework.http.HttpStatusCode", false, StatusCodes.class.getClassLoader()); - statusCode = - MethodHandles.publicLookup() - .findVirtual( - ClientResponse.class, "statusCode", MethodType.methodType(httpStatusCodeClass)); - value = - MethodHandles.publicLookup() - .findVirtual(httpStatusCodeClass, "value", MethodType.methodType(int.class)); + Class httpStatusCodeClass = Class.forName( + "org.springframework.http.HttpStatusCode", false, StatusCodes.class.getClassLoader()); + statusCode = MethodHandles.publicLookup() + .findVirtual( + ClientResponse.class, "statusCode", MethodType.methodType(httpStatusCodeClass)); + value = MethodHandles.publicLookup() + .findVirtual(httpStatusCodeClass, "value", MethodType.methodType(int.class)); } catch (ClassNotFoundException | IllegalAccessException | NoSuchMethodException e) { return null; } @@ -66,9 +63,8 @@ private static Function getStatusCodeFunction60() { private static Function getStatusCodeFunction51() { MethodHandle rawStatusCode; try { - rawStatusCode = - MethodHandles.publicLookup() - .findVirtual(ClientResponse.class, "rawStatusCode", MethodType.methodType(int.class)); + rawStatusCode = MethodHandles.publicLookup() + .findVirtual(ClientResponse.class, "rawStatusCode", MethodType.methodType(int.class)); } catch (IllegalAccessException | NoSuchMethodException e) { return null; } @@ -88,13 +84,10 @@ private static Function getStatusCodeFunction50() { MethodHandle statusCode; MethodHandle value; try { - statusCode = - MethodHandles.publicLookup() - .findVirtual( - ClientResponse.class, "statusCode", MethodType.methodType(HttpStatus.class)); - value = - MethodHandles.publicLookup() - .findVirtual(HttpStatus.class, "value", MethodType.methodType(int.class)); + statusCode = MethodHandles.publicLookup() + .findVirtual(ClientResponse.class, "statusCode", MethodType.methodType(HttpStatus.class)); + value = MethodHandles.publicLookup() + .findVirtual(HttpStatus.class, "value", MethodType.methodType(int.class)); } catch (IllegalAccessException | NoSuchMethodException e) { return null; } diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/AdviceUtils.java b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/AdviceUtils.java index 3690e0b463c..9d0d0774df3 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/AdviceUtils.java +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/AdviceUtils.java @@ -14,18 +14,16 @@ public final class AdviceUtils { public static final String PARENT_SPAN_ATTRIBUTE = "datadog.trace.instrumentation.springwebflux.ParentSpan"; - private static final ClassValue NAMES = - GenericClassValue.of( - type -> { - String name = type.getName(); - int lambdaIdx = name.lastIndexOf("$$Lambda"); - if (lambdaIdx > -1) { - return UTF8BytesString.create( - name.substring(name.lastIndexOf('.') + 1, lambdaIdx) + ".lambda"); - } else { - return DECORATE.spanNameForMethod(type, "handle"); - } - }); + private static final ClassValue NAMES = GenericClassValue.of(type -> { + String name = type.getName(); + int lambdaIdx = name.lastIndexOf("$$Lambda"); + if (lambdaIdx > -1) { + return UTF8BytesString.create( + name.substring(name.lastIndexOf('.') + 1, lambdaIdx) + ".lambda"); + } else { + return DECORATE.spanNameForMethod(type, "handle"); + } + }); public static CharSequence constructOperationName(Object handler) { return NAMES.get(handler.getClass()); diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouteOnSuccessOrError.java b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouteOnSuccessOrError.java index 25af2c3d295..c328a6d808a 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouteOnSuccessOrError.java +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouteOnSuccessOrError.java @@ -21,15 +21,12 @@ public class RouteOnSuccessOrError implements Consumer> { private static final Pattern ROUTER_FUNCTION_REGEX = Pattern.compile("\\s*->.*$"); private static final Pattern METHOD_REGEX = Pattern.compile("^(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH) "); - private static final Function PATH_EXTRACTOR = - arg -> - METHOD_REGEX - .matcher( - SPACES_REGEX - .matcher(SPECIAL_CHARACTERS_REGEX.matcher(arg).replaceAll("")) - .replaceAll(" ") - .trim()) - .replaceAll(""); + private static final Function PATH_EXTRACTOR = arg -> METHOD_REGEX + .matcher(SPACES_REGEX + .matcher(SPECIAL_CHARACTERS_REGEX.matcher(arg).replaceAll("")) + .replaceAll(" ") + .trim()) + .replaceAll(""); private final RouterFunction routerFunction; private final ServerRequest serverRequest; diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java index f9d20554057..b6e1e93c8f8 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java @@ -39,9 +39,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(isPublic()) .and(named("route")) - .and( - takesArgument( - 0, named("org.springframework.web.reactive.function.server.ServerRequest"))) + .and(takesArgument( + 0, named("org.springframework.web.reactive.function.server.ServerRequest"))) .and(takesArguments(1)), // Cannot reference class directly here because it would lead to class load failure on Java7 packageName + ".RouterFunctionAdvice"); diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/iast/TemplateAndMatrixVariablesInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/iast/TemplateAndMatrixVariablesInstrumentation.java index 1f96fb0e994..eaff094c885 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/iast/TemplateAndMatrixVariablesInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/main/java/datadog/trace/instrumentation/springwebflux/server/iast/TemplateAndMatrixVariablesInstrumentation.java @@ -29,9 +29,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(isProtected()) .and(named("handleMatch")) - .and( - takesArgument( - 0, named("org.springframework.web.reactive.result.method.RequestMappingInfo"))) + .and(takesArgument( + 0, named("org.springframework.web.reactive.result.method.RequestMappingInfo"))) .and(takesArgument(1, named("org.springframework.web.method.HandlerMethod"))) .and(takesArgument(2, named("org.springframework.web.server.ServerWebExchange"))) .and(takesArguments(3)), diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java index 0285c45b485..af42c3c48f4 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/src/bootTest/groovy/dd/trace/instrumentation/springwebflux/server/WsHandler.java @@ -20,27 +20,20 @@ public Mono handle(WebSocketSession webSocketSession) { } return webSocketSession .receive() - .map( - msg -> { - if (msg.getType() == WebSocketMessage.Type.TEXT) { - return webSocketSession.textMessage(msg.getPayloadAsText()); - } - byte[] bytes = new byte[msg.getPayload().readableByteCount()]; - msg.getPayload().read(bytes); - return webSocketSession.binaryMessage( - dataBufferFactory -> dataBufferFactory.wrap(bytes)); - }) - .flatMap( - msg -> - webSocketSession - .send(Mono.just(msg)) - .doFinally( - ignored -> { - synchronized (this) { - activeSession = null; - notifyAll(); - } - })) + .map(msg -> { + if (msg.getType() == WebSocketMessage.Type.TEXT) { + return webSocketSession.textMessage(msg.getPayloadAsText()); + } + byte[] bytes = new byte[msg.getPayload().readableByteCount()]; + msg.getPayload().read(bytes); + return webSocketSession.binaryMessage(dataBufferFactory -> dataBufferFactory.wrap(bytes)); + }) + .flatMap(msg -> webSocketSession.send(Mono.just(msg)).doFinally(ignored -> { + synchronized (this) { + activeSession = null; + notifyAll(); + } + })) .then(); } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/AppSecDispatcherServletInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/AppSecDispatcherServletInstrumentation.java index 66db1e0d905..01e06b89964 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/AppSecDispatcherServletInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/AppSecDispatcherServletInstrumentation.java @@ -37,9 +37,8 @@ public String instrumentedType() { @Override public ElementMatcher.Junction classLoaderMatcher() { - return not( - hasClassNamed( - "org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition")); + return not(hasClassNamed( + "org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition")); } @Override diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java index 3e4bd33e594..1102e6e1683 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java @@ -121,9 +121,8 @@ public static void stopSpan( if (scope == null) { return; } - boolean finish = - !Boolean.TRUE.equals( - request.getAttribute(handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX)); + boolean finish = !Boolean.TRUE.equals( + request.getAttribute(handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX)); final AgentSpan span = spanFromContext(scope.context()); scope.close(); if (throwable != null) { diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/InvocableHandlerMethodInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/InvocableHandlerMethodInstrumentation.java index a4b26041f02..130c653d71f 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/InvocableHandlerMethodInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/InvocableHandlerMethodInstrumentation.java @@ -56,9 +56,8 @@ public static void after( final String handlerSpanKey = DD_HANDLER_SPAN_PREFIX_KEY + self.getBean().getClass().getName(); - if (Boolean.TRUE.equals( - servletWebRequest.getAttribute( - handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX, ServletWebRequest.SCOPE_REQUEST))) { + if (Boolean.TRUE.equals(servletWebRequest.getAttribute( + handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX, ServletWebRequest.SCOPE_REQUEST))) { return; } @@ -68,9 +67,8 @@ public static void after( } servletWebRequest.setAttribute( handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX, true, ServletWebRequest.SCOPE_REQUEST); - result = - ((CompletionStage) result) - .whenComplete(AsyncResultExtensions.finishSpan((AgentSpan) span)); + result = ((CompletionStage) result) + .whenComplete(AsyncResultExtensions.finishSpan((AgentSpan) span)); } } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoIterator.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoIterator.java index 8a058a470f9..923241eb67a 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoIterator.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoIterator.java @@ -63,17 +63,17 @@ private void fetchNext() { final List responseBody = parseMediaTypes(nextInfo.getProducesCondition().getExpressions()); for (final String path : nextInfo.getPatternsCondition().getPatterns()) { - final List methods = Method.parseMethods(nextInfo.getMethodsCondition().getMethods()); + final List methods = + Method.parseMethods(nextInfo.getMethodsCondition().getMethods()); for (final String method : methods) { - Endpoint endpoint = - new Endpoint() - .type(Endpoint.Type.REST) - .operation(Endpoint.Operation.HTTP_REQUEST) - .resource(method + " " + path) - .path(path) - .method(method) - .requestBodyType(requestBody) - .responseBodyType(responseBody); + Endpoint endpoint = new Endpoint() + .type(Endpoint.Type.REST) + .operation(Endpoint.Operation.HTTP_REQUEST) + .resource(method + " " + path) + .path(path) + .method(method) + .requestBodyType(requestBody) + .responseBodyType(responseBody); if (nextHandler != null) { final Map metadata = new HashMap<>(); metadata.put("handler", nextHandler.toString()); diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateAndMatrixVariablesInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateAndMatrixVariablesInstrumentation.java index e82b9b55366..99ce7c60970 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateAndMatrixVariablesInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateAndMatrixVariablesInstrumentation.java @@ -70,9 +70,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(isProtected()) .and(named("handleMatch")) - .and( - takesArgument( - 0, named("org.springframework.web.servlet.mvc.method.RequestMappingInfo"))) + .and(takesArgument( + 0, named("org.springframework.web.servlet.mvc.method.RequestMappingInfo"))) .and(takesArgument(1, String.class)) .and(takesArgument(2, named("javax.servlet.http.HttpServletRequest"))) .and(takesArguments(3)), @@ -169,9 +168,8 @@ public static void after( if (brf != null) { brf.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); } - t = - new BlockingException( - "Blocked request (for RequestMappingInfoHandlerMapping/handleMatch)"); + t = new BlockingException( + "Blocked request (for RequestMappingInfoHandlerMapping/handleMatch)"); } } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateVariablesUrlHandlerInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateVariablesUrlHandlerInstrumentation.java index cc90713ea2a..27878ae3b86 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateVariablesUrlHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/TemplateVariablesUrlHandlerInstrumentation.java @@ -129,9 +129,8 @@ public static void after( if (brf != null) { brf.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); } - t = - new BlockingException( - "Blocked request (for UriTemplateVariablesHandlerInterceptor/preHandle)"); + t = new BlockingException( + "Blocked request (for UriTemplateVariablesHandlerInterceptor/preHandle)"); } } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/WebApplicationContextInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/WebApplicationContextInstrumentation.java index 408f4cb72fb..66e18d2a9f9 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/WebApplicationContextInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/WebApplicationContextInstrumentation.java @@ -53,11 +53,9 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("postProcessBeanFactory")) - .and( - takesArgument( - 0, - named( - "org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), + .and(takesArgument( + 0, + named("org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), WebApplicationContextInstrumentation.class.getName() + "$FilterInjectingAdvice"); } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoWithPathPatternsIterator.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoWithPathPatternsIterator.java index 77db8aa17a8..ce978c21866 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoWithPathPatternsIterator.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/RequestMappingInfoWithPathPatternsIterator.java @@ -67,17 +67,17 @@ private void fetchNext() { final List responseBody = parseMediaTypes(nextInfo.getProducesCondition().getExpressions()); for (final String path : getPatterns(nextInfo)) { - final List methods = Method.parseMethods(nextInfo.getMethodsCondition().getMethods()); + final List methods = + Method.parseMethods(nextInfo.getMethodsCondition().getMethods()); for (final String method : methods) { - final Endpoint endpoint = - new Endpoint() - .type(Endpoint.Type.REST) - .operation(Endpoint.Operation.HTTP_REQUEST) - .resource(method + " " + path) - .path(path) - .method(method) - .requestBodyType(requestBody) - .responseBodyType(responseBody); + final Endpoint endpoint = new Endpoint() + .type(Endpoint.Type.REST) + .operation(Endpoint.Operation.HTTP_REQUEST) + .resource(method + " " + path) + .path(path) + .method(method) + .requestBodyType(requestBody) + .responseBodyType(responseBody); if (nextHandler != null) { final Map metadata = new HashMap<>(); metadata.put("handler", nextHandler.toString()); diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/ServletPathRequestFilterInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/ServletPathRequestFilterInstrumentation.java index ee5744396ba..813a22c0dea 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/ServletPathRequestFilterInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/src/main/java/datadog/trace/instrumentation/springweb/ServletPathRequestFilterInstrumentation.java @@ -57,11 +57,9 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("postProcessBeanFactory")) - .and( - takesArgument( - 0, - named( - "org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), + .and(takesArgument( + 0, + named("org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), ServletPathRequestFilterInstrumentation.class.getName() + "$FilterInjectingAdvice"); } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/ServletPathRequestFilterInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/ServletPathRequestFilterInstrumentation.java index 784da331cf0..be9dddafb35 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/ServletPathRequestFilterInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/ServletPathRequestFilterInstrumentation.java @@ -61,11 +61,9 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("postProcessBeanFactory")) - .and( - takesArgument( - 0, - named( - "org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), + .and(takesArgument( + 0, + named("org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), packageName + ".ServletPathFilterInjectingAdvice"); } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/SpringWebCodeOriginInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/SpringWebCodeOriginInstrumentation.java index cf5e2bb3a72..f3a40a0a253 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/SpringWebCodeOriginInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/SpringWebCodeOriginInstrumentation.java @@ -18,13 +18,12 @@ public SpringWebCodeOriginInstrumentation() { @Override protected Set getAnnotations() { - return new HashSet<>( - asList( - WEB_BIND_ANNOTATION + "DeleteMapping", - WEB_BIND_ANNOTATION + "GetMapping", - WEB_BIND_ANNOTATION + "PatchMapping", - WEB_BIND_ANNOTATION + "PostMapping", - WEB_BIND_ANNOTATION + "PutMapping", - WEB_BIND_ANNOTATION + "RequestMapping")); + return new HashSet<>(asList( + WEB_BIND_ANNOTATION + "DeleteMapping", + WEB_BIND_ANNOTATION + "GetMapping", + WEB_BIND_ANNOTATION + "PatchMapping", + WEB_BIND_ANNOTATION + "PostMapping", + WEB_BIND_ANNOTATION + "PutMapping", + WEB_BIND_ANNOTATION + "RequestMapping")); } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/TemplateAndMatrixVariablesInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/TemplateAndMatrixVariablesInstrumentation.java index 912c9d78a4a..218efa0eec5 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/TemplateAndMatrixVariablesInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/TemplateAndMatrixVariablesInstrumentation.java @@ -52,9 +52,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(isProtected()) .and(named("handleMatch")) - .and( - takesArgument( - 0, named("org.springframework.web.servlet.mvc.method.RequestMappingInfo"))) + .and(takesArgument( + 0, named("org.springframework.web.servlet.mvc.method.RequestMappingInfo"))) .and(takesArgument(1, String.class)) .and(takesArgument(2, named("jakarta.servlet.http.HttpServletRequest"))) .and(takesArguments(3)), diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/WebApplicationContextInstrumentation.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/WebApplicationContextInstrumentation.java index a7c54f26e93..5a2ab7dd0ba 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/WebApplicationContextInstrumentation.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java/datadog/trace/instrumentation/springweb6/WebApplicationContextInstrumentation.java @@ -57,11 +57,9 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() .and(named("postProcessBeanFactory")) - .and( - takesArgument( - 0, - named( - "org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), + .and(takesArgument( + 0, + named("org.springframework.beans.factory.config.ConfigurableListableBeanFactory"))), packageName + ".FilterInjectingAdvice"); } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java index 87979e55648..5cd9ecf0db6 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java @@ -76,9 +76,8 @@ public static void stopSpan( if (scope == null) { return; } - boolean finish = - !Boolean.TRUE.equals( - request.getAttribute(handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX)); + boolean finish = !Boolean.TRUE.equals( + request.getAttribute(handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX)); final AgentSpan span = spanFromContext(scope.context()); scope.close(); if (throwable != null) { diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandleMatchAdvice.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandleMatchAdvice.java index 368e91303ad..27c1f466de0 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandleMatchAdvice.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandleMatchAdvice.java @@ -100,9 +100,8 @@ public static void after( if (brf != null) { brf.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); } - t = - new BlockingException( - "Blocked request (for RequestMappingInfoHandlerMapping/handleMatch)"); + t = new BlockingException( + "Blocked request (for RequestMappingInfoHandlerMapping/handleMatch)"); } } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/InterceptorPreHandleAdvice.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/InterceptorPreHandleAdvice.java index 89ac5f23e85..0ce4248ec3b 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/InterceptorPreHandleAdvice.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/InterceptorPreHandleAdvice.java @@ -68,9 +68,8 @@ public static void after( if (brf != null) { brf.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); } - t = - new BlockingException( - "Blocked request (for UriTemplateVariablesHandlerInterceptor/preHandle)"); + t = new BlockingException( + "Blocked request (for UriTemplateVariablesHandlerInterceptor/preHandle)"); } } } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/WrapContinuableResultAdvice.java b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/WrapContinuableResultAdvice.java index 4939751da1b..1b103685235 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/WrapContinuableResultAdvice.java +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/WrapContinuableResultAdvice.java @@ -24,11 +24,11 @@ public static void after( } ServletWebRequest servletWebRequest = (ServletWebRequest) nativeWebRequest; - final String handlerSpanKey = DD_HANDLER_SPAN_PREFIX_KEY + self.getBean().getClass().getName(); + final String handlerSpanKey = + DD_HANDLER_SPAN_PREFIX_KEY + self.getBean().getClass().getName(); - if (Boolean.TRUE.equals( - servletWebRequest.getAttribute( - handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX, ServletWebRequest.SCOPE_REQUEST))) { + if (Boolean.TRUE.equals(servletWebRequest.getAttribute( + handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX, ServletWebRequest.SCOPE_REQUEST))) { return; } Object span = servletWebRequest.getAttribute(handlerSpanKey, ServletWebRequest.SCOPE_REQUEST); @@ -37,8 +37,7 @@ public static void after( } servletWebRequest.setAttribute( handlerSpanKey + DD_HANDLER_SPAN_CONTINUE_SUFFIX, true, ServletWebRequest.SCOPE_REQUEST); - result = - ((CompletionStage) result) - .whenComplete(AsyncResultExtensions.finishSpan((AgentSpan) span)); + result = ((CompletionStage) result) + .whenComplete(AsyncResultExtensions.finishSpan((AgentSpan) span)); } } diff --git a/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java b/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java index fd04267d368..e02150cce65 100644 --- a/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java @@ -124,9 +124,8 @@ public static void modifyStatus(@Advice.Argument(0) final ITestResult result) { } else if (result.isSuccess() && ddRetryAnalyzer.shouldPropagateFailure()) { // mark status as failed to propagate an earlier failure suppressed by TestNG result.setStatus(ITestResult.FAILURE); - result.setThrowable( - new AssertionError( - "Datadog: propagating test failure based on aggregated execution results")); + result.setThrowable(new AssertionError( + "Datadog: propagating test failure based on aggregated execution results")); } } } diff --git a/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/order/FailFastOrderInterceptor.java b/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/order/FailFastOrderInterceptor.java index f01337e1723..ddafb48d976 100644 --- a/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/order/FailFastOrderInterceptor.java +++ b/dd-java-agent/instrumentation/testng/testng-7.0/src/main/java/datadog/trace/instrumentation/testng7/order/FailFastOrderInterceptor.java @@ -22,7 +22,8 @@ public class FailFastOrderInterceptor implements IMethodInterceptor { public FailFastOrderInterceptor( TestEventsHandler testEventsHandler) { this.testEventsHandler = testEventsHandler; - this.executionOrderComparator = Comparator.comparing(this::executionPriority).reversed(); + this.executionOrderComparator = + Comparator.comparing(this::executionPriority).reversed(); } private int executionPriority(IMethodInstance methodInstance) { diff --git a/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java index 09be2e9ce64..5ef285df0d0 100644 --- a/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java +++ b/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java @@ -25,9 +25,8 @@ public static synchronized void setContextStore(ContextStore testMethods) { } public void invokeBeforeClass(ITestClass testClass, boolean parallelized) { - methodsAwaitingExecution.computeIfAbsent( - testClass.getRealClass(), - k -> { - // firing event with the lock held to ensure that the other threads wait until test suite - // state is initialized - onBeforeClass(testClass, parallelized); - return registeredMethods.remove(k); - }); + methodsAwaitingExecution.computeIfAbsent(testClass.getRealClass(), k -> { + // firing event with the lock held to ensure that the other threads wait until test suite + // state is initialized + onBeforeClass(testClass, parallelized); + return registeredMethods.remove(k); + }); } public void invokeAfterClass(ITestClass testClass, IMethodInstance methodInstance) { Collection remainingMethods = - methodsAwaitingExecution.computeIfPresent( - testClass.getRealClass(), - (k, v) -> { - ITestNGMethod method = methodInstance.getMethod(); - ConstructorOrMethod constructorOrMethod = method.getConstructorOrMethod(); - v.remove(constructorOrMethod); - return !v.isEmpty() ? v : null; - }); + methodsAwaitingExecution.computeIfPresent(testClass.getRealClass(), (k, v) -> { + ITestNGMethod method = methodInstance.getMethod(); + ConstructorOrMethod constructorOrMethod = method.getConstructorOrMethod(); + v.remove(constructorOrMethod); + return !v.isEmpty() ? v : null; + }); if (remainingMethods == null) { onAfterClass(testClass); diff --git a/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestNGUtils.java b/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestNGUtils.java index c67da143832..87f0f72d14d 100644 --- a/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestNGUtils.java +++ b/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/TestNGUtils.java @@ -279,10 +279,8 @@ public static boolean isTestOrderingSupported(String version) { } public static List capabilities(String version) { - List baseCapabilities = - new ArrayList<>( - Arrays.asList( - LibraryCapability.TIA, LibraryCapability.IMPACTED, LibraryCapability.DISABLED)); + List baseCapabilities = new ArrayList<>(Arrays.asList( + LibraryCapability.TIA, LibraryCapability.IMPACTED, LibraryCapability.DISABLED)); boolean isEFDSupported = isEFDSupported(version); boolean isExceptionSuppressionSupported = isExceptionSuppressionSupported(version); diff --git a/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java b/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java index c066a75f1fc..d9659e7ad51 100644 --- a/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java +++ b/dd-java-agent/instrumentation/testng/testng-common/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java @@ -27,9 +27,8 @@ public void createExecutionPolicy(ITestResult result) { TestIdentifier testIdentifier = TestNGUtils.toTestIdentifier(result); TestSourceData testSourceData = TestNGUtils.toTestSourceData(result); Collection testTags = TestNGUtils.getGroups(result); - executionPolicy = - TestEventsHandlerHolder.TEST_EVENTS_HANDLER.executionPolicy( - testIdentifier, testSourceData, testTags); + executionPolicy = TestEventsHandlerHolder.TEST_EVENTS_HANDLER.executionPolicy( + testIdentifier, testSourceData, testTags); } } } diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/JobInstrumentation.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/JobInstrumentation.java index a9b03588791..42814c3cbd9 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/JobInstrumentation.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/JobInstrumentation.java @@ -41,9 +41,8 @@ public static void after( AgentSpan span = startSpan("tibco_bw", TIBCO_PROCESS_OPERATION); DECORATE.afterStart(span); DECORATE.onProcessStart(span, workflowName); - Map map = - InstrumentationContext.get(ProcessContext.class, Map.class) - .getOrCreate(processContext, HashMap::new); + Map map = InstrumentationContext.get(ProcessContext.class, Map.class) + .getOrCreate(processContext, HashMap::new); map.put(wId, span); } } diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/TaskInstrumentation.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/TaskInstrumentation.java index d99a6c9b5a9..87b1ef4a67d 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/TaskInstrumentation.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-5.14/src/main/java/datadog/trace/instrumentation/tibcobw5/TaskInstrumentation.java @@ -67,9 +67,8 @@ public static boolean before( AgentSpan span = map.get(ddActivityInfo.id); if (span == null) { AgentSpan parent = map.getOrDefault(ddActivityInfo.parent, activeSpan()); - span = - startSpan( - "tibco_bw", TIBCO_ACTIVITY_OPERATION, parent != null ? parent.spanContext() : null); + span = startSpan( + "tibco_bw", TIBCO_ACTIVITY_OPERATION, parent != null ? parent.spanContext() : null); DECORATE.afterStart(span); DECORATE.onActivityStart(span, ddActivityInfo.name); map.put(ddActivityInfo.id, span); diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/BehaviorInstrumentation.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/BehaviorInstrumentation.java index c777f20d872..db5d385ab1f 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/BehaviorInstrumentation.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/BehaviorInstrumentation.java @@ -44,19 +44,15 @@ public ElementMatcher hierarchyMatcher() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isMethod() - .and( - named("enter") - .and( - isDeclaredBy( - hasInterface(named("com.tibco.pvm.api.behavior.PmProcessBehavior"))))), + .and(named("enter") + .and(isDeclaredBy( + hasInterface(named("com.tibco.pvm.api.behavior.PmProcessBehavior"))))), getClass().getName() + "$ProcessStartAdvice"); transformer.applyAdvice( isMethod() - .and( - named("exit") - .and( - isDeclaredBy( - hasInterface(named("com.tibco.pvm.api.behavior.PmProcessBehavior"))))), + .and(named("exit") + .and(isDeclaredBy( + hasInterface(named("com.tibco.pvm.api.behavior.PmProcessBehavior"))))), getClass().getName() + "$ProcessEndAdvice"); transformer.applyAdvice( isMethod() @@ -89,11 +85,10 @@ public static AgentScope activityBegin( contextStore.put(pmTask, parentSpan); return null; } - AgentSpan span = - startSpan( - "tibco_bw", - TibcoDecorator.TIBCO_ACTIVITY_OPERATION, - parentSpan != null ? parentSpan.spanContext() : null); + AgentSpan span = startSpan( + "tibco_bw", + TibcoDecorator.TIBCO_ACTIVITY_OPERATION, + parentSpan != null ? parentSpan.spanContext() : null); TibcoDecorator.DECORATE.afterStart(span); TibcoDecorator.DECORATE.onActivityStart(span, pmTask.getName(pmContext)); return activateSpan(span); @@ -144,11 +139,10 @@ public static void processStarts( parent = pmProcessInstance.getParentProcess(pmContext); parentSpan = parent != null ? contextStore.get(parent) : null; } - AgentSpan span = - startSpan( - "tibco_bw", - TibcoDecorator.TIBCO_PROCESS_OPERATION, - parent != null ? parentSpan.spanContext() : null); + AgentSpan span = startSpan( + "tibco_bw", + TibcoDecorator.TIBCO_PROCESS_OPERATION, + parent != null ? parentSpan.spanContext() : null); TibcoDecorator.DECORATE.afterStart(span); TibcoDecorator.DECORATE.onProcessStart(span, pmProcessInstance.getName(pmContext)); contextStore.put(pmProcessInstance, span); diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java index 63c0f62b6a1..011569429c7 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java @@ -39,8 +39,8 @@ public void methodAdvice(MethodTransformer transformer) { public static class OnMessageAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void exit(@Advice.This JMSMessageCallBackHandler handler) { - String pinnedName = - InstrumentationContext.get(JMSMessageCallBackHandler.class, String.class).get(handler); + String pinnedName = InstrumentationContext.get(JMSMessageCallBackHandler.class, String.class) + .get(handler); if (pinnedName != null && activeSpan() != null) { final AgentSpan span = activeSpan(); AgentSpan root = span.getLocalRootSpan(); diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java index d6a070d0126..a3fe9bc4d5c 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java @@ -55,12 +55,10 @@ public static void onExit( // the user explicitly if (!Config.get().isServiceNameSetByUser()) { try { - appName = - (String) - process - .getModule(pmContext) - .getPrototype(pmContext) - .getAttributeValue(pmContext, "$bx_applicationName"); + appName = (String) process + .getModule(pmContext) + .getPrototype(pmContext) + .getAttributeValue(pmContext, "$bx_applicationName"); } catch (Throwable t) { // cannot find the name } diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java index 79253da4002..a5a5114123b 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java @@ -28,11 +28,10 @@ public class TibcoDecorator extends BaseDecorator { private static CharSequence bwVersion() { try { - Class cls = - Class.forName( - "com.tibco.bw.thor.management.common.SetupUtils", - false, - ClassLoader.getSystemClassLoader()); + Class cls = Class.forName( + "com.tibco.bw.thor.management.common.SetupUtils", + false, + ClassLoader.getSystemClassLoader()); Map map = (Map) cls.getMethod("loadProductConfiguration").invoke(null); if (map != null) { diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java b/dd-java-agent/instrumentation/tomcat/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java index 14fb92e8fae..667249d8e6e 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java @@ -59,20 +59,20 @@ public String[] helperClassNames() { }; } - private static final Reference GET_OUTPUT_STREAM_REFERENCE = - new Reference.Builder("org.apache.catalina.connector.Response") - .withMethod( - new String[0], - EXPECTS_PUBLIC | EXPECTS_NON_STATIC, - "getOutputStream", - "Ljavax/servlet/ServletOutputStream;") - .or() - .withMethod( - new String[0], - EXPECTS_PUBLIC | EXPECTS_NON_STATIC, - "getOutputStream", - "Ljakarta/servlet/ServletOutputStream;") - .build(); + private static final Reference GET_OUTPUT_STREAM_REFERENCE = new Reference.Builder( + "org.apache.catalina.connector.Response") + .withMethod( + new String[0], + EXPECTS_PUBLIC | EXPECTS_NON_STATIC, + "getOutputStream", + "Ljavax/servlet/ServletOutputStream;") + .or() + .withMethod( + new String[0], + EXPECTS_PUBLIC | EXPECTS_NON_STATIC, + "getOutputStream", + "Ljakarta/servlet/ServletOutputStream;") + .build(); @Override public Reference[] additionalMuzzleReferences() { @@ -196,7 +196,8 @@ public static void afterParse( if (span != null) { req.setAttribute( CorrelationIdentifier.getTraceIdKey(), AgentTracer.get().getTraceId(span)); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), AgentTracer.get().getSpanId(span)); + req.setAttribute( + CorrelationIdentifier.getSpanIdKey(), AgentTracer.get().getSpanId(span)); Object ctxObj = req.getAttribute(DD_PARENT_CONTEXT_ATTRIBUTE); Context parentContext = ctxObj instanceof Context ? (Context) ctxObj : rootContext(); DECORATE.onRequest(span, req, req, parentContext); diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/CommitActionInstrumentation.java b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/CommitActionInstrumentation.java index b5e74a8751b..61bbefe7586 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/CommitActionInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/CommitActionInstrumentation.java @@ -103,12 +103,11 @@ static class ProcessCommitActionAdvice { return false; } - Flow flow = - TomcatDecorator.DECORATE.callIGCallbackResponseAndHeaders( - agentSpan, - coyoteResponse, - coyoteResponse.getStatus(), - ExtractAdapter.CoyoteResponse.GETTER); + Flow flow = TomcatDecorator.DECORATE.callIGCallbackResponseAndHeaders( + agentSpan, + coyoteResponse, + coyoteResponse.getStatus(), + ExtractAdapter.CoyoteResponse.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/ParsedBodyParametersInstrumentation.java b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/ParsedBodyParametersInstrumentation.java index be98fe79c12..17dabd33209 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/ParsedBodyParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-5.5/src/main/java/datadog/trace/instrumentation/tomcat55/ParsedBodyParametersInstrumentation.java @@ -51,14 +51,14 @@ public String instrumentedType() { } // paramHashStringArray was only final for a few days. it doesn't seem to have made into a release - private static final Reference PARAM_HASH_STRING_ARRAY_REFERENCE = - new Reference.Builder("org.apache.tomcat.util.http.Parameters") - .withField( - new String[0], - Reference.EXPECTS_NON_FINAL, - "paramHashStringArray", - "Ljava/util/Hashtable;") - .build(); + private static final Reference PARAM_HASH_STRING_ARRAY_REFERENCE = new Reference.Builder( + "org.apache.tomcat.util.http.Parameters") + .withField( + new String[0], + Reference.EXPECTS_NON_FINAL, + "paramHashStringArray", + "Ljava/util/Hashtable;") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-6.0/src/main/java/datadog/trace/instrumentation/tomcat6/ParsedBodyParametersInstrumentation.java b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-6.0/src/main/java/datadog/trace/instrumentation/tomcat6/ParsedBodyParametersInstrumentation.java index 6a6aebeec7b..6195304544f 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-6.0/src/main/java/datadog/trace/instrumentation/tomcat6/ParsedBodyParametersInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-6.0/src/main/java/datadog/trace/instrumentation/tomcat6/ParsedBodyParametersInstrumentation.java @@ -41,12 +41,12 @@ public String instrumentedType() { // paramHashValues was also of type Hashtable, but only for 4 days between // commits c1c2e29d55ea41d76ab4bf688dbaafb9b100eadf and 211c381310db7ded0c7e1a1ef11dd4f62e7c71bb - private static final Reference PARAM_HASH_VALUES_MAP_REFERENCE = - new Reference.Builder("org.apache.tomcat.util.http.Parameters") - .withField(new String[0], 0, "paramHashValues", "Ljava/util/Map;") - .or() - .withField(new String[0], 0, "paramHashValues", "Ljava/util/HashMap;") - .build(); + private static final Reference PARAM_HASH_VALUES_MAP_REFERENCE = new Reference.Builder( + "org.apache.tomcat.util.http.Parameters") + .withField(new String[0], 0, "paramHashValues", "Ljava/util/Map;") + .or() + .withField(new String[0], 0, "paramHashValues", "Ljava/util/HashMap;") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/CommitActionInstrumentation.java b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/CommitActionInstrumentation.java index 330c40a68d2..575053c9089 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/CommitActionInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/CommitActionInstrumentation.java @@ -110,12 +110,11 @@ static class ProcessCommitActionAdvice { return false; } - Flow flow = - TomcatDecorator.DECORATE.callIGCallbackResponseAndHeaders( - agentSpan, - coyoteResponse, - coyoteResponse.getStatus(), - ExtractAdapter.CoyoteResponse.GETTER); + Flow flow = TomcatDecorator.DECORATE.callIGCallbackResponseAndHeaders( + agentSpan, + coyoteResponse, + coyoteResponse.getStatus(), + ExtractAdapter.CoyoteResponse.GETTER); Flow.Action action = flow.getAction(); if (action instanceof Flow.Action.RequestBlockingAction) { Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelper.java b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelper.java index 78a06148a71..3ce023d5580 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelper.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelper.java @@ -111,9 +111,8 @@ public static boolean processPartsAndBlock( } if (contents.size() < MAX_FILE_CONTENT_COUNT) { try (InputStream is = part.getInputStream()) { - contents.add( - MultipartContentDecoder.readInputStream( - is, MAX_FILE_CONTENT_BYTES, part.getContentType())); + contents.add(MultipartContentDecoder.readInputStream( + is, MAX_FILE_CONTENT_BYTES, part.getContentType())); } catch (Exception ignored) { // stream read failed — report empty content rather than skipping the part entirely contents.add(""); diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/ParsePartsInstrumentation.java b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/ParsePartsInstrumentation.java index 1799a9cbaa9..f383fda63b2 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/ParsePartsInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/main/java/datadog/trace/instrumentation/tomcat7/ParsePartsInstrumentation.java @@ -87,11 +87,10 @@ static void before( RequestContext requestContext = agentSpan.getRequestContext(); if (requestContext != null && requestContext.getData(RequestContextSlot.APPSEC) != null) { reqCtx = requestContext; - boolean inspectContent = - AgentTracer.get() - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.requestFilesContent()) - != null; + boolean inspectContent = AgentTracer.get() + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.requestFilesContent()) + != null; collector = new ParameterCollector.ParameterCollectorImpl(inspectContent); return; } diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/test/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelperTest.java b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/test/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelperTest.java index e4c4a953c17..39d9a17e7dd 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/test/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelperTest.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-appsec/tomcat-appsec-7.0/src/test/java/datadog/trace/instrumentation/tomcat7/GlassFishBlockingHelperTest.java @@ -50,9 +50,8 @@ void commitBlocking_blockingContentTypeNone_setsStatusWithoutBody() throws IOExc HttpServletResponse resp = mock(HttpServletResponse.class); when(resp.isCommitted()).thenReturn(false); - assertTrue( - GlassFishBlockingHelper.commitBlocking( - null, resp, new Flow.Action.RequestBlockingAction(403, BlockingContentType.NONE))); + assertTrue(GlassFishBlockingHelper.commitBlocking( + null, resp, new Flow.Action.RequestBlockingAction(403, BlockingContentType.NONE))); verify(resp).setStatus(403); verify(resp).flushBuffer(); @@ -183,9 +182,8 @@ void processPartsAndBlock_formField_skipped() throws Exception { RequestContext reqCtx = mockReqCtx(null, mock(TraceSegment.class)); BiFunction, Flow> filenamesCb = mockPassThroughCb(); - assertFalse( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList(formField), reqCtx, null, filenamesCb, null)); + assertFalse(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList(formField), reqCtx, null, filenamesCb, null)); verify(formField).getSubmittedFileName(); verify(formField, never()).getInputStream(); } @@ -198,9 +196,8 @@ void processPartsAndBlock_emptyFilename_notAddedToFilenames_butContentRead() thr BiFunction, Flow> filenamesCb = mockPassThroughCb(); BiFunction, Flow> contentCb = mockPassThroughCb(); - assertFalse( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList(filePart), reqCtx, null, filenamesCb, contentCb)); + assertFalse(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList(filePart), reqCtx, null, filenamesCb, contentCb)); verify(filePart).getInputStream(); verify(filenamesCb, never()).apply(any(), any()); @@ -213,9 +210,8 @@ void processPartsAndBlock_normalFilename_reportedViaFilenamesCb() throws Excepti RequestContext reqCtx = mockReqCtx(null, mock(TraceSegment.class)); BiFunction, Flow> filenamesCb = mockPassThroughCb(); - assertFalse( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList(filePart), reqCtx, null, filenamesCb, null)); + assertFalse(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList(filePart), reqCtx, null, filenamesCb, null)); verify(filenamesCb).apply(eq(reqCtx), eq(Collections.singletonList("file.txt"))); } @@ -226,9 +222,8 @@ void processPartsAndBlock_contentRead_reportedViaContentCb() throws Exception { RequestContext reqCtx = mockReqCtx(null, mock(TraceSegment.class)); BiFunction, Flow> contentCb = mockPassThroughCb(); - assertFalse( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList(filePart), reqCtx, null, null, contentCb)); + assertFalse(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList(filePart), reqCtx, null, null, contentCb)); verify(contentCb).apply(eq(reqCtx), any()); } @@ -243,9 +238,8 @@ void processPartsAndBlock_maxFilesLimit_enforced() throws Exception { RequestContext reqCtx = mockReqCtx(null, mock(TraceSegment.class)); BiFunction, Flow> contentCb = mockPassThroughCb(); - assertFalse( - GlassFishBlockingHelper.processPartsAndBlock( - Arrays.asList(tooMany), reqCtx, null, null, contentCb)); + assertFalse(GlassFishBlockingHelper.processPartsAndBlock( + Arrays.asList(tooMany), reqCtx, null, null, contentCb)); verify(contentCb).apply(eq(reqCtx), any(List.class)); verify(tooMany[limit], never()).getInputStream(); @@ -260,9 +254,8 @@ void processPartsAndBlock_getInputStreamThrows_emptyStringFallback() throws Exce RequestContext reqCtx = mockReqCtx(null, mock(TraceSegment.class)); BiFunction, Flow> contentCb = mockPassThroughCb(); - assertFalse( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList(filePart), reqCtx, null, null, contentCb)); + assertFalse(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList(filePart), reqCtx, null, null, contentCb)); verify(contentCb).apply(eq(reqCtx), eq(Collections.singletonList(""))); } @@ -276,9 +269,8 @@ void processPartsAndBlock_filenamesCbBlocks_contentCbNotFired() throws Exception BiFunction, Flow> filenamesCb = mockBlockingCb(403); BiFunction, Flow> contentCb = mockPassThroughCb(); - assertTrue( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList(filePart), reqCtx, null, filenamesCb, contentCb)); + assertTrue(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList(filePart), reqCtx, null, filenamesCb, contentCb)); verify(contentCb, never()).apply(any(), any()); } @@ -292,9 +284,8 @@ void processPartsAndBlock_contentCbBlocks_returnsTrue() throws Exception { BiFunction, Flow> filenamesCb = mockPassThroughCb(); BiFunction, Flow> contentCb = mockBlockingCb(403); - assertTrue( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList(filePart), reqCtx, null, filenamesCb, contentCb)); + assertTrue(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList(filePart), reqCtx, null, filenamesCb, contentCb)); } @Test @@ -302,9 +293,8 @@ void processPartsAndBlock_nonPartObject_skipped() { RequestContext reqCtx = mockReqCtx(null, mock(TraceSegment.class)); BiFunction, Flow> filenamesCb = mockPassThroughCb(); - assertFalse( - GlassFishBlockingHelper.processPartsAndBlock( - Collections.singletonList("not-a-part"), reqCtx, null, filenamesCb, null)); + assertFalse(GlassFishBlockingHelper.processPartsAndBlock( + Collections.singletonList("not-a-part"), reqCtx, null, filenamesCb, null)); verify(filenamesCb, never()).apply(any(), any()); } diff --git a/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java b/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java index 4af01fc11ad..b209593efbc 100644 --- a/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java +++ b/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java @@ -48,13 +48,12 @@ public String hierarchyMarkerType() { /** Match any child class of the base Twilio service classes. */ @Override public ElementMatcher hierarchyMatcher() { - return extendsClass( - namedOneOf( - "com.twilio.base.Creator", - "com.twilio.base.Deleter", - "com.twilio.base.Fetcher", - "com.twilio.base.Reader", - "com.twilio.base.Updater")); + return extendsClass(namedOneOf( + "com.twilio.base.Creator", + "com.twilio.base.Deleter", + "com.twilio.base.Fetcher", + "com.twilio.base.Reader", + "com.twilio.base.Updater")); } /** Return the helper classes which will be available for use in instrumentation. */ diff --git a/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioClientDecorator.java b/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioClientDecorator.java index 4be5ea0c542..e1552d83d96 100644 --- a/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioClientDecorator.java +++ b/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioClientDecorator.java @@ -30,16 +30,15 @@ public class TwilioClientDecorator extends ClientDecorator { ? COMPONENT_NAME.toString() : null; - private static final QualifiedClassNameCache NAMES = - new QualifiedClassNameCache( - new Function, CharSequence>() { - @Override - // Drop common package prefix (com.twilio.rest) - public String apply(Class input) { - return input.getCanonicalName().substring("com.twilio.rest.".length()); - } - }, - Functions.PrefixJoin.of(".")); + private static final QualifiedClassNameCache NAMES = new QualifiedClassNameCache( + new Function, CharSequence>() { + @Override + // Drop common package prefix (com.twilio.rest) + public String apply(Class input) { + return input.getCanonicalName().substring("com.twilio.rest.".length()); + } + }, + Functions.PrefixJoin.of(".")); public static final TwilioClientDecorator DECORATE = new TwilioClientDecorator(); diff --git a/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java b/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java index d7697800f90..da2bb918287 100644 --- a/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java +++ b/dd-java-agent/instrumentation/twilio-0.0.1/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java @@ -37,13 +37,12 @@ public String hierarchyMarkerType() { /** Match any child class of the base Twilio service classes. */ @Override public ElementMatcher hierarchyMatcher() { - return extendsClass( - namedOneOf( - "com.twilio.base.Creator", - "com.twilio.base.Deleter", - "com.twilio.base.Fetcher", - "com.twilio.base.Reader", - "com.twilio.base.Updater")); + return extendsClass(namedOneOf( + "com.twilio.base.Creator", + "com.twilio.base.Deleter", + "com.twilio.base.Fetcher", + "com.twilio.base.Reader", + "com.twilio.base.Updater")); } /** Return the helper classes which will be available for use in instrumentation. */ diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/FormDataParserInstrumentation.java b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/FormDataParserInstrumentation.java index 8f34ab5e9f9..1ff6c143497 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/FormDataParserInstrumentation.java +++ b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/FormDataParserInstrumentation.java @@ -43,11 +43,10 @@ public String[] helperClassNames() { return new String[] {packageName + ".FormDataMap"}; } - private static final Reference EXCHANGE_REFERENCE = - new Reference.Builder( - "io.undertow.server.handlers.form.FormEncodedDataDefinition$FormEncodedDataParser") - .withField(new String[0], 0, "exchange", "Lio/undertow/server/HttpServerExchange;") - .build(); + private static final Reference EXCHANGE_REFERENCE = new Reference.Builder( + "io.undertow.server.handlers.form.FormEncodedDataDefinition$FormEncodedDataParser") + .withField(new String[0], 0, "exchange", "Lio/undertow/server/HttpServerExchange;") + .build(); @Override public Reference[] additionalMuzzleReferences() { diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpServerExchangeSenderInstrumentation.java b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpServerExchangeSenderInstrumentation.java index 075849e79db..48f56ad8c9b 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpServerExchangeSenderInstrumentation.java +++ b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpServerExchangeSenderInstrumentation.java @@ -73,9 +73,8 @@ static class GetResponseChannelAdvice { xchg.putAttachment(IgnoreSendAttribute.IGNORE_SEND_KEY, IgnoreSendAttribute.INSTANCE); AgentSpan span = spanFromContext(continuation.context()); - Flow flow = - UndertowDecorator.DECORATE.callIGCallbackResponseAndHeaders( - span, xchg, xchg.getStatusCode(), UndertowExtractAdapter.Response.GETTER); + Flow flow = UndertowDecorator.DECORATE.callIGCallbackResponseAndHeaders( + span, xchg, xchg.getStatusCode(), UndertowExtractAdapter.Response.GETTER); Flow.Action action = flow.getAction(); if (!(action instanceof Flow.Action.RequestBlockingAction)) { return false; diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/MultiPartUploadHandlerInstrumentation.java b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/MultiPartUploadHandlerInstrumentation.java index 3f0313464d3..71a61646f5c 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/MultiPartUploadHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/MultiPartUploadHandlerInstrumentation.java @@ -40,11 +40,10 @@ public String instrumentedType() { return "io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler"; } - private static final Reference EXCHANGE_REFERENCE = - new Reference.Builder( - "io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler") - .withField(new String[0], 0, "exchange", "Lio/undertow/server/HttpServerExchange;") - .build(); + private static final Reference EXCHANGE_REFERENCE = new Reference.Builder( + "io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler") + .withField(new String[0], 0, "exchange", "Lio/undertow/server/HttpServerExchange;") + .build(); @Override public Reference[] additionalMuzzleReferences() { @@ -107,9 +106,8 @@ static void after( boolean success = blockResponseFunction.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); if (success && t == null) { - t = - new BlockingException( - "Blocked request (for MultiPartUploadHandler/parseBlocking)"); + t = new BlockingException( + "Blocked request (for MultiPartUploadHandler/parseBlocking)"); } } } diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataContentHelperTest.java b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataContentHelperTest.java index 5f5ef6b1499..8ec9993903e 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataContentHelperTest.java +++ b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataContentHelperTest.java @@ -21,7 +21,8 @@ class FormDataContentHelperTest { - @TempDir Path tempDir; + @TempDir + Path tempDir; @Test void diskFile_contentRead() throws IOException { @@ -133,27 +134,25 @@ private static void addInMemoryFileValue( // Use a Proxy so this compiles against Undertow 2.0 and also works against 2.2.x. // getPath() throws to simulate an in-memory upload. - FormData.FormValue inMemory = - (FormData.FormValue) - Proxy.newProxyInstance( - FormData.FormValue.class.getClassLoader(), - new Class[] {FormData.FormValue.class}, - (proxy, method, args) -> { - switch (method.getName()) { - case "getFileName": - return filename; - case "getHeaders": - return new HeaderMap(); - case "getPath": - throw new IllegalStateException("in-memory upload has no path"); - case "isFile": - case "isFileItem": - case "isBigField": - return false; - default: - return null; - } - }); + FormData.FormValue inMemory = (FormData.FormValue) Proxy.newProxyInstance( + FormData.FormValue.class.getClassLoader(), + new Class[] {FormData.FormValue.class}, + (proxy, method, args) -> { + switch (method.getName()) { + case "getFileName": + return filename; + case "getHeaders": + return new HeaderMap(); + case "getPath": + throw new IllegalStateException("in-memory upload has no path"); + case "isFile": + case "isFileItem": + case "isBigField": + return false; + default: + return null; + } + }); Deque deque = new ArrayDeque<>(); deque.add(inMemory); diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataMapTest.java b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataMapTest.java index c8c4366a963..5fb155228a6 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataMapTest.java +++ b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/test/java/datadog/trace/instrumentation/undertow/FormDataMapTest.java @@ -19,7 +19,8 @@ class FormDataMapTest { - @TempDir Path tempDir; + @TempDir + Path tempDir; @Test void textFieldIsIncluded() { @@ -103,25 +104,23 @@ private static void addInMemoryFileValue(FormData fd, String name, String filena // Use a Proxy so this compiles against undertow 2.0 and also works against 2.2.x, // which added getCharset(), getFileItem(), isFileItem(), and isBigField() to the interface. - FormData.FormValue inMemory = - (FormData.FormValue) - Proxy.newProxyInstance( - FormData.FormValue.class.getClassLoader(), - new Class[] {FormData.FormValue.class}, - (proxy, method, args) -> { - switch (method.getName()) { - case "getValue": - return ""; - case "isFile": - case "isFileItem": - case "isBigField": - return false; - case "getFileName": - return filename; - default: - return null; - } - }); + FormData.FormValue inMemory = (FormData.FormValue) Proxy.newProxyInstance( + FormData.FormValue.class.getClassLoader(), + new Class[] {FormData.FormValue.class}, + (proxy, method, args) -> { + switch (method.getName()) { + case "getValue": + return ""; + case "isFile": + case "isFileItem": + case "isBigField": + return false; + case "getFileName": + return filename; + default: + return null; + } + }); Deque deque = new ArrayDeque<>(); deque.add(inMemory); diff --git a/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowBlockResponseFunction.java b/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowBlockResponseFunction.java index 1e74d63bc93..f6130553af8 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowBlockResponseFunction.java +++ b/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowBlockResponseFunction.java @@ -21,9 +21,8 @@ public boolean tryCommitBlockingResponse( BlockingContentType templateType, Map extraHeaders, String securityResponseId) { - Flow.Action.RequestBlockingAction rab = - new Flow.Action.RequestBlockingAction( - statusCode, templateType, extraHeaders, securityResponseId); + Flow.Action.RequestBlockingAction rab = new Flow.Action.RequestBlockingAction( + statusCode, templateType, extraHeaders, securityResponseId); exchange.putAttachment(UndertowBlockingHandler.TRACE_SEGMENT, segment); exchange.putAttachment(UndertowBlockingHandler.REQUEST_BLOCKING_DATA, rab); if (exchange.isInIoThread()) { diff --git a/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowDecorator.java b/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowDecorator.java index e4876b8c670..d3ec2d82323 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowDecorator.java +++ b/dd-java-agent/instrumentation/undertow/undertow-common/src/main/java/datadog/trace/instrumentation/undertow/UndertowDecorator.java @@ -16,9 +16,8 @@ public class UndertowDecorator extends HttpServerDecorator< HttpServerExchange, HttpServerExchange, HttpServerExchange, HttpServerExchange> { - public static final CharSequence SERVLET_REQUEST = - UTF8BytesString.create( - SpanNaming.instance().namingSchema().server().operationForComponent("java-web-servlet")); + public static final CharSequence SERVLET_REQUEST = UTF8BytesString.create( + SpanNaming.instance().namingSchema().server().operationForComponent("java-web-servlet")); public static final CharSequence UNDERTOW_HTTP_SERVER = UTF8BytesString.create("undertow-http-server"); @@ -32,9 +31,8 @@ public class UndertowDecorator "DD_UNDERTOW_CONTINUATION", () -> AttachmentKey.create(ContextContinuation.class)); @SuppressWarnings("unchecked") - public static final AttachmentKey PARENT_CONTEXT_KEY = - attachmentStore.getOrCreate( - "DD_UNDERTOW_PARENT_CONTEXT", () -> AttachmentKey.create(Context.class)); + public static final AttachmentKey PARENT_CONTEXT_KEY = attachmentStore.getOrCreate( + "DD_UNDERTOW_PARENT_CONTEXT", () -> AttachmentKey.create(Context.class)); public static final UndertowDecorator DECORATE = new UndertowDecorator(); public static final CharSequence UNDERTOW_REQUEST = diff --git a/dd-java-agent/instrumentation/velocity-1.5/src/main/java/datadog/trace/instrumentation/velocity/ASTReferenceInstrumentation.java b/dd-java-agent/instrumentation/velocity-1.5/src/main/java/datadog/trace/instrumentation/velocity/ASTReferenceInstrumentation.java index 2e0b6fa98b5..299d701d3d3 100644 --- a/dd-java-agent/instrumentation/velocity-1.5/src/main/java/datadog/trace/instrumentation/velocity/ASTReferenceInstrumentation.java +++ b/dd-java-agent/instrumentation/velocity-1.5/src/main/java/datadog/trace/instrumentation/velocity/ASTReferenceInstrumentation.java @@ -32,9 +32,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("render") .and(isMethod()) - .and( - takesArgument(0, named("org.apache.velocity.context.InternalContextAdapter")) - .and(takesArgument(1, named("java.io.Writer")))), + .and(takesArgument(0, named("org.apache.velocity.context.InternalContextAdapter")) + .and(takesArgument(1, named("java.io.Writer")))), ASTReferenceInstrumentation.class.getName() + "$ASTReferenceAdvice"); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionFactoryConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionFactoryConstructorAdvice.java index 65072a2d6bb..13df6ad07c6 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionFactoryConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionFactoryConstructorAdvice.java @@ -14,14 +14,13 @@ public static void afterConstructor( @Advice.This final MySQLConnectionFactory zis, @Advice.Argument(2) final MySQLConnectOptions options) { DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("mysql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("mysql") + .build(); InstrumentationContext.get(MySQLConnectionFactory.class, DBInfo.class).put(zis, info); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionImplConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionImplConstructorAdvice.java index 6cfcb659623..3320554531d 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionImplConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLConnectionImplConstructorAdvice.java @@ -15,7 +15,8 @@ public static void afterConstructor( InstrumentationContext.get(SqlClient.class, DBInfo.class) .put( zis, - InstrumentationContext.get(MySQLConnectionFactory.class, DBInfo.class).get(factory)); + InstrumentationContext.get(MySQLConnectionFactory.class, DBInfo.class) + .get(factory)); } // Limit ourselves to 3.9.x by checking for the close() method that was removed in 4.x diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLPoolImplConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLPoolImplConstructorAdvice.java index 1be9b3e3b70..12e7878d7cc 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLPoolImplConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/MySQLPoolImplConstructorAdvice.java @@ -13,14 +13,13 @@ public class MySQLPoolImplConstructorAdvice { public static void afterConstructor( @Advice.This final SqlClient zis, @Advice.Argument(2) final MySQLConnectOptions options) { DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("mysql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("mysql") + .build(); InstrumentationContext.get(SqlClient.class, DBInfo.class).put(zis, info); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/test/java/TestDatabases.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/test/java/TestDatabases.java index 47793bd21cc..a19c1f8d24c 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/test/java/TestDatabases.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-3.9/src/test/java/TestDatabases.java @@ -19,22 +19,20 @@ public static TestDatabases initialise(String dbName) { private TestDatabases(String dbName) { Map infos = new HashMap<>(); - mysql = - new MySQLContainer("mysql:8.0") - .withDatabaseName(dbName) - .withUsername("sa") - .withPassword("sa"); + mysql = new MySQLContainer("mysql:8.0") + .withDatabaseName(dbName) + .withUsername("sa") + .withPassword("sa"); // https://github.com/testcontainers/testcontainers-java/issues/914 mysql.addParameter("TC_MY_CNF", null); mysql.start(); - TestDBInfo info = - new TestDBInfo( - mysql.getUsername(), - mysql.getPassword(), - mysql.getHost(), - mysql.getMappedPort(MySQLContainer.MYSQL_PORT), - "mysql", - dbName); + TestDBInfo info = new TestDBInfo( + mysql.getUsername(), + mysql.getPassword(), + mysql.getHost(), + mysql.getMappedPort(MySQLContainer.MYSQL_PORT), + "mysql", + dbName); PortUtils.waitForPortToOpen(info.host, info.port, 5, TimeUnit.SECONDS); infos.put("mysql", info); dbInfos = Collections.unmodifiableMap(infos); diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionFactoryConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionFactoryConstructorAdvice.java index 92832a1df92..d10444e466f 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionFactoryConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionFactoryConstructorAdvice.java @@ -13,14 +13,13 @@ public static void afterConstructor( @Advice.This final MySQLConnectionFactory zis, @Advice.Argument(1) final MySQLConnectOptions options) { DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("mysql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("mysql") + .build(); InstrumentationContext.get(MySQLConnectionFactory.class, DBInfo.class).put(zis, info); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionImplConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionImplConstructorAdvice.java index 8651dca62cd..d536bb52fd7 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionImplConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLConnectionImplConstructorAdvice.java @@ -14,7 +14,8 @@ public static void afterConstructor( InstrumentationContext.get(SqlClient.class, DBInfo.class) .put( zis, - InstrumentationContext.get(MySQLConnectionFactory.class, DBInfo.class).get(factory)); + InstrumentationContext.get(MySQLConnectionFactory.class, DBInfo.class) + .get(factory)); } // Limit ourselves to 4.x by checking for the ping() method that was added in 4.x diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLPoolImplAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLPoolImplAdvice.java index 9702604f48c..77f3d69f595 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLPoolImplAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/MySQLPoolImplAdvice.java @@ -13,14 +13,13 @@ public class MySQLPoolImplAdvice { public static void afterCreate( @Advice.Return final SqlClient zis, @Advice.Argument(2) MySQLConnectOptions options) { DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("mysql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("mysql") + .build(); InstrumentationContext.get(SqlClient.class, DBInfo.class).put(zis, info); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/test/java/TestDatabases.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/test/java/TestDatabases.java index d3b86359399..235a550b99a 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/test/java/TestDatabases.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.0/src/test/java/TestDatabases.java @@ -14,22 +14,20 @@ public class TestDatabases implements Closeable { private TestDatabases(String dbName) { Map infos = new HashMap<>(); - mysql = - new MySQLContainer("mysql:8.0") - .withDatabaseName(dbName) - .withUsername("sa") - .withPassword("sa"); + mysql = new MySQLContainer("mysql:8.0") + .withDatabaseName(dbName) + .withUsername("sa") + .withPassword("sa"); // https://github.com/testcontainers/testcontainers-java/issues/914 mysql.addParameter("TC_MY_CNF", null); mysql.start(); - TestDBInfo info = - new TestDBInfo( - mysql.getUsername(), - mysql.getPassword(), - mysql.getHost(), - mysql.getMappedPort(MySQLContainer.MYSQL_PORT), - "mysql", - dbName); + TestDBInfo info = new TestDBInfo( + mysql.getUsername(), + mysql.getPassword(), + mysql.getHost(), + mysql.getMappedPort(MySQLContainer.MYSQL_PORT), + "mysql", + dbName); PortUtils.waitForPortToOpen(info.host, info.port, 5, TimeUnit.SECONDS); infos.put("mysql", info); dbInfos = Collections.unmodifiableMap(infos); diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLConnectionFactoryConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLConnectionFactoryConstructorAdvice.java index 4cf000caae2..edd0da96a3a 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLConnectionFactoryConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLConnectionFactoryConstructorAdvice.java @@ -19,14 +19,13 @@ public static void afterConstructor( if (databases instanceof SingletonSupplier) { SqlConnectOptions options = (SqlConnectOptions) ((SingletonSupplier) databases).unwrap(); DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("mysql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("mysql") + .build(); InstrumentationContext.get(MySQLConnectionFactory.class, DBInfo.class).put(factory, info); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLDriverAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLDriverAdvice.java index e2f839d75e9..cfa76332bbe 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLDriverAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-mysql-client/vertx-mysql-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4_4_2/MySQLDriverAdvice.java @@ -21,14 +21,13 @@ public static void afterNewPoolImpl( if (databases instanceof SingletonSupplier) { SqlConnectOptions options = (SqlConnectOptions) ((SingletonSupplier) databases).unwrap(); DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("mysql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("mysql") + .build(); InstrumentationContext.get(SqlClient.class, DBInfo.class).put(zis, info); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionFactoryConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionFactoryConstructorAdvice.java index 017b394a8d9..e87c54b9bf6 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionFactoryConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionFactoryConstructorAdvice.java @@ -12,14 +12,13 @@ public static void afterConstructor( @Advice.This final PgConnectionFactory zis, @Advice.Argument(1) final PgConnectOptions options) { DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("postgresql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("postgresql") + .build(); InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class).put(zis, info); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionImplConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionImplConstructorAdvice.java index eda970aaf08..e3bb1b669a3 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionImplConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgConnectionImplConstructorAdvice.java @@ -11,6 +11,8 @@ public class PgConnectionImplConstructorAdvice { public static void afterConstructor( @Advice.This final SqlClient zis, @Advice.Argument(0) final PgConnectionFactory factory) { InstrumentationContext.get(SqlClient.class, DBInfo.class) - .put(zis, InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class).get(factory)); + .put( + zis, + InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class).get(factory)); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgPoolImplAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgPoolImplAdvice.java index ac24692250d..38db31bffe1 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgPoolImplAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4/PgPoolImplAdvice.java @@ -14,14 +14,13 @@ public class PgPoolImplAdvice { public static void afterCreate( @Advice.Return final SqlClient zis, @Advice.Argument(2) PgConnectOptions options) { DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("postgresql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("postgresql") + .build(); InstrumentationContext.get(SqlClient.class, DBInfo.class).put(zis, info); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/test/java/TestDatabases.java b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/test/java/TestDatabases.java index 1e31905cf79..6cc8f3b4b3c 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/test/java/TestDatabases.java +++ b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.0/src/test/java/TestDatabases.java @@ -14,20 +14,18 @@ public class TestDatabases implements Closeable { private TestDatabases(String dbName) { Map infos = new HashMap<>(); - pgsql = - new PostgreSQLContainer("postgres:16-alpine") - .withDatabaseName(dbName) - .withUsername("postgres") - .withPassword("postgres"); + pgsql = new PostgreSQLContainer("postgres:16-alpine") + .withDatabaseName(dbName) + .withUsername("postgres") + .withPassword("postgres"); pgsql.start(); - TestDBInfo info = - new TestDBInfo( - pgsql.getUsername(), - pgsql.getPassword(), - pgsql.getHost(), - pgsql.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT), - "postgresql", - dbName); + TestDBInfo info = new TestDBInfo( + pgsql.getUsername(), + pgsql.getPassword(), + pgsql.getHost(), + pgsql.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT), + "postgresql", + dbName); PortUtils.waitForPortToOpen(info.host, info.port, 5, TimeUnit.SECONDS); infos.put("postgresql", info); dbInfos = Collections.unmodifiableMap(infos); diff --git a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgConnectionFactoryConstructorAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgConnectionFactoryConstructorAdvice.java index 9e0f9d03f88..d1a975ec122 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgConnectionFactoryConstructorAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgConnectionFactoryConstructorAdvice.java @@ -17,14 +17,13 @@ public static void afterConstructor( if (databases instanceof SingletonSupplier) { SqlConnectOptions options = (SqlConnectOptions) ((SingletonSupplier) databases).unwrap(); DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("postgresql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("postgresql") + .build(); InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class).put(factory, info); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgDriverAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgDriverAdvice.java index f55cf047f28..c12745bbf21 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgDriverAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-pg-client/vertx-pg-client-4.4.2/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_4_2/PgDriverAdvice.java @@ -19,14 +19,13 @@ public static void afterNewPoolImpl( if (databases instanceof SingletonSupplier) { SqlConnectOptions options = (SqlConnectOptions) ((SingletonSupplier) databases).unwrap(); DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); - DBInfo info = - builder - .host(options.getHost()) - .port(options.getPort()) - .db(options.getDatabase()) - .user(options.getUser()) - .type("postgresql") - .build(); + DBInfo info = builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("postgresql") + .build(); InstrumentationContext.get(SqlClient.class, DBInfo.class).put(zis, info); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIImplSendAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIImplSendAdvice.java index 3599f31233d..83fe2e970db 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIImplSendAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIImplSendAdvice.java @@ -29,13 +29,14 @@ public static void afterSend( // Note that we should not _leak_ the active scope to the handler if it gets executed directly try (ContextScope scope = activateSpan(noopSpan())) { // Get the handler from the context, set by RedisAPICallAdvice - ResponseHandlerWrapper handler = - InstrumentationContext.get(RedisAPI.class, ResponseHandlerWrapper.class).get(self); + ResponseHandlerWrapper handler = InstrumentationContext.get( + RedisAPI.class, ResponseHandlerWrapper.class) + .get(self); if (handler != null) { if (handler.clientSpan != null && connection != null) { - final SocketAddress socketAddress = - InstrumentationContext.get(RedisConnection.class, SocketAddress.class) - .get(connection); + final SocketAddress socketAddress = InstrumentationContext.get( + RedisConnection.class, SocketAddress.class) + .get(connection); if (socketAddress != null) { DECORATE.onConnection(handler.clientSpan, socketAddress); DECORATE.setPeerPort(handler.clientSpan, socketAddress.port()); diff --git a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIInstrumentation.java index f1833dabfc5..935afbf64f6 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisAPIInstrumentation.java @@ -36,8 +36,7 @@ public Map contextStore() { @Override public String[] knownMatchingTypes() { - return new String[] { - "io.vertx.redis.client.RedisAPI", "io.vertx.redis.client.impl.RedisAPIImpl" + return new String[] {"io.vertx.redis.client.RedisAPI", "io.vertx.redis.client.impl.RedisAPIImpl" }; } diff --git a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java index 4777bd3c4dc..3ff0b3a4669 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java @@ -62,9 +62,8 @@ public static AgentScope beforeSend( parentContinuation = null == parentSpan ? captureSpan(noopSpan()) : captureSpan(parentSpan); - final AgentSpan clientSpan = - DECORATE.startAndDecorateSpan( - request.command(), InstrumentationContext.get(Command.class, UTF8BytesString.class)); + final AgentSpan clientSpan = DECORATE.startAndDecorateSpan( + request.command(), InstrumentationContext.get(Command.class, UTF8BytesString.class)); return activateSpan(clientSpan); } @@ -77,9 +76,9 @@ public static void afterSend( @Advice.This final Object thiz) { CallDepthThreadLocalMap.decrementCallDepth(RedisAPI.class); if (thiz instanceof RedisConnection) { - final SocketAddress socketAddress = - InstrumentationContext.get(RedisConnection.class, SocketAddress.class) - .get((RedisConnection) thiz); + final SocketAddress socketAddress = InstrumentationContext.get( + RedisConnection.class, SocketAddress.class) + .get((RedisConnection) thiz); final AgentSpan span = clientScope != null ? clientScope.span() : activeSpan(); // Verify the activeSpan() fallback is actually a REDIS_COMMAND span if (socketAddress != null && span != null && REDIS_COMMAND.equals(span.getOperationName())) { diff --git a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisInstrumentation.java index fef6e1da6c0..8961e8fb45f 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisInstrumentation.java @@ -67,10 +67,9 @@ public void methodAdvice(MethodTransformer transformer) { packageName + ".RedisSendAdvice"); transformer.applyAdvice( - isDeclaredBy( - namedOneOf( - "io.vertx.redis.client.impl.RedisConnectionImpl", - "io.vertx.redis.client.impl.RedisStandaloneConnection")) + isDeclaredBy(namedOneOf( + "io.vertx.redis.client.impl.RedisConnectionImpl", + "io.vertx.redis.client.impl.RedisStandaloneConnection")) .and(isConstructor()) .and(takesArgument(3, named("io.vertx.core.net.NetSocket"))), packageName + ".RedisConnectionConstructAdvice"); diff --git a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java index 51bd22ddc38..a947e05fd57 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java @@ -66,9 +66,8 @@ public static AgentScope beforeSend( ContextContinuation parentContinuation = null == parentSpan ? captureSpan(noopSpan()) : captureSpan(parentSpan); - final AgentSpan clientSpan = - DECORATE.startAndDecorateSpan( - request.command(), InstrumentationContext.get(Command.class, UTF8BytesString.class)); + final AgentSpan clientSpan = DECORATE.startAndDecorateSpan( + request.command(), InstrumentationContext.get(Command.class, UTF8BytesString.class)); handler = new ResponseHandlerWrapper(handler, clientSpan, parentContinuation); return activateSpan(clientSpan); @@ -79,9 +78,9 @@ public static void afterSend( @Advice.Enter final AgentScope clientScope, @Advice.This final Object thiz) { CallDepthThreadLocalMap.decrementCallDepth(RedisAPI.class); if (thiz instanceof RedisConnection) { - final SocketAddress socketAddress = - InstrumentationContext.get(RedisConnection.class, SocketAddress.class) - .get((RedisConnection) thiz); + final SocketAddress socketAddress = InstrumentationContext.get( + RedisConnection.class, SocketAddress.class) + .get((RedisConnection) thiz); final AgentSpan span = clientScope != null ? clientScope.span() : activeSpan(); // Verify the activeSpan() fallback is actually a REDIS_COMMAND span if (socketAddress != null && span != null && REDIS_COMMAND.equals(span.getOperationName())) { diff --git a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RequestImplInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RequestImplInstrumentation.java index 8ef3502d257..1739944368e 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RequestImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-redis-client/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RequestImplInstrumentation.java @@ -94,13 +94,10 @@ public void visitEnd() { // return super.clone(); // Object is the super class // } // - final MethodVisitor mv = - cv.visitMethod( - Opcodes.ACC_PUBLIC, - "clone", - "()Ljava/lang/Object;", - null, - new String[] {"java/lang/CloneNotSupportedException"}); + final MethodVisitor mv = cv.visitMethod( + Opcodes.ACC_PUBLIC, "clone", "()Ljava/lang/Object;", null, new String[] { + "java/lang/CloneNotSupportedException" + }); mv.visitCode(); mv.visitIntInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn( diff --git a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/CursorReadAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/CursorReadAdvice.java index 6e997ab4c58..4c1f509a365 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/CursorReadAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/CursorReadAdvice.java @@ -30,9 +30,8 @@ public static AgentScope beforeRead( final AgentSpan parentSpan = activeSpan(); final ContextContinuation parentContinuation = null == parentSpan ? null : captureSpan(parentSpan); - final AgentSpan clientSpan = - DECORATE.startAndDecorateSpanForStatement( - ps, InstrumentationContext.get(PreparedStatement.class, Pair.class), true); + final AgentSpan clientSpan = DECORATE.startAndDecorateSpanForStatement( + ps, InstrumentationContext.get(PreparedStatement.class, Pair.class), true); if (null == clientSpan) { return null; } diff --git a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/PreparedStatementQueryAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/PreparedStatementQueryAdvice.java index 67954991f5d..b1f673b498f 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/PreparedStatementQueryAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/PreparedStatementQueryAdvice.java @@ -11,6 +11,8 @@ public class PreparedStatementQueryAdvice { public static void afterQuery( @Advice.This final PreparedStatement zis, @Advice.Return final Query query) { InstrumentationContext.get(Query.class, Pair.class) - .put(query, InstrumentationContext.get(PreparedStatement.class, Pair.class).get(zis)); + .put( + query, + InstrumentationContext.get(PreparedStatement.class, Pair.class).get(zis)); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/QueryAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/QueryAdvice.java index 225e016e820..670fec9cdd0 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/QueryAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/QueryAdvice.java @@ -45,18 +45,16 @@ public static > AgentScope beforeExecute( final AgentSpan parentSpan = activeSpan(); final ContextContinuation parentContinuation = null == parentSpan ? null : captureSpan(parentSpan); - final AgentSpan clientSpan = - DECORATE.startAndDecorateSpanForStatement( - zis, InstrumentationContext.get(Query.class, Pair.class), prepared); + final AgentSpan clientSpan = DECORATE.startAndDecorateSpanForStatement( + zis, InstrumentationContext.get(Query.class, Pair.class), prepared); if (null == clientSpan) { return null; } if (prepared) { handler = new QueryResultHandlerWrapper<>(handler, clientSpan, parentContinuation); } else { - maybeHandler = - new QueryResultHandlerWrapper<>( - (Handler>) maybeHandler, clientSpan, parentContinuation); + maybeHandler = new QueryResultHandlerWrapper<>( + (Handler>) maybeHandler, clientSpan, parentContinuation); } return activateSpan(clientSpan); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlClientBaseAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlClientBaseAdvice.java index 39dcbd3068c..6f4a3ffa4fe 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlClientBaseAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlClientBaseAdvice.java @@ -16,10 +16,9 @@ public static void afterQuery( @Advice.Argument(0) final String sql, @Advice.Return final Query query) { - Pair info = - Pair.of( - InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), - DBQueryInfo.ofStatement(sql)); + Pair info = Pair.of( + InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), + DBQueryInfo.ofStatement(sql)); InstrumentationContext.get(Query.class, Pair.class).put(query, info); } } @@ -30,10 +29,9 @@ public static void afterPreparedQuery( @Advice.This final SqlClient zis, @Advice.Argument(0) final String sql, @Advice.Return final Query query) { - Pair info = - Pair.of( - InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), - DBQueryInfo.ofPreparedStatement(sql)); + Pair info = Pair.of( + InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), + DBQueryInfo.ofPreparedStatement(sql)); InstrumentationContext.get(Query.class, Pair.class).put(query, info); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlConnectionBasePrepareAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlConnectionBasePrepareAdvice.java index 5489c3c8288..f2def01a33e 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlConnectionBasePrepareAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/SqlConnectionBasePrepareAdvice.java @@ -17,13 +17,11 @@ public static void beforePrepare( @Advice.Argument(0) final String sql, @Advice.Argument(value = 1, readOnly = false) Handler> handler) { - Pair info = - Pair.of( - InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), - DBQueryInfo.ofStatement(sql)); + Pair info = Pair.of( + InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), + DBQueryInfo.ofStatement(sql)); - handler = - new PrepareHandlerWrapper( - handler, InstrumentationContext.get(PreparedStatement.class, Pair.class), info); + handler = new PrepareHandlerWrapper( + handler, InstrumentationContext.get(PreparedStatement.class, Pair.class), info); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/FileUploadHelper.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/FileUploadHelper.java index 913003e8c28..584a3acbf7a 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/FileUploadHelper.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/FileUploadHelper.java @@ -37,10 +37,9 @@ public static String readUploadContent(FileUpload upload, int maxBytes) { return ""; } String charSet = upload.charSet(); - String contentType = - charSet != null && !charSet.isEmpty() - ? upload.contentType() + "; charset=" + charSet - : upload.contentType(); + String contentType = charSet != null && !charSet.isEmpty() + ? upload.contentType() + "; charset=" + charSet + : upload.contentType(); try (FileInputStream fis = new FileInputStream(path)) { return MultipartContentDecoder.readInputStream(fis, maxBytes, contentType); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/HttpServerResponseInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/HttpServerResponseInstrumentation.java index cdfcb9e583b..2966816d63c 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/HttpServerResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/HttpServerResponseInstrumentation.java @@ -34,15 +34,13 @@ public HttpServerResponseInstrumentation() { public void methodAdvice(final MethodTransformer transformer) { transformer.applyAdvice( named("putHeader") - .and( - takesArguments(CharSequence.class, CharSequence.class) - .or(takesArguments(String.class, String.class))), + .and(takesArguments(CharSequence.class, CharSequence.class) + .or(takesArguments(String.class, String.class))), HttpServerResponseInstrumentation.class.getName() + "$PutHeaderAdvice1"); transformer.applyAdvice( named("putHeader") - .and( - takesArguments(CharSequence.class, Iterable.class) - .or(takesArguments(String.class, Iterable.class))), + .and(takesArguments(CharSequence.class, Iterable.class) + .or(takesArguments(String.class, Iterable.class))), HttpServerResponseInstrumentation.class.getName() + "$PutHeaderAdvice2"); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java index 7af44b78e9d..aa6e41f5948 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java @@ -30,9 +30,8 @@ public RouteHandlerWrapper(final Handler handler) { // a route is not found, without this code, a span would be created for the router when it // shouldn't String name = handler.getClass().getName(); - spanStarter = - !(name.startsWith(RouterImpl.class.getName()) - || name.startsWith(RouteImpl.class.getName())); + spanStarter = !(name.startsWith(RouterImpl.class.getName()) + || name.startsWith(RouteImpl.class.getName())); } @Override diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteImplInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteImplInstrumentation.java index 4de2a5d6995..b229531cdff 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteImplInstrumentation.java @@ -69,11 +69,10 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("matches") .and(takesArguments(3)) - .and( - takesArgument( - 0, - named("io.vertx.ext.web.impl.RoutingContextImplBase") - .or(named("io.vertx.ext.web.RoutingContext")))) + .and(takesArgument( + 0, + named("io.vertx.ext.web.impl.RoutingContextImplBase") + .or(named("io.vertx.ext.web.RoutingContext")))) .and(takesArgument(1, String.class)) .and(takesArgument(2, boolean.class)) .and(returns(boolean.class)), diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextFilenamesAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextFilenamesAdvice.java index 0fa821e3754..eda728b9d31 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextFilenamesAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextFilenamesAdvice.java @@ -70,9 +70,8 @@ static void after( } if (filenamesCb != null && filenames != null) { - throwable = - FileUploadHelper.commitBlockingResponse( - filenamesCb, reqCtx, filenames, "Blocked request (multipart file upload)"); + throwable = FileUploadHelper.commitBlockingResponse( + filenamesCb, reqCtx, filenames, "Blocked request (multipart file upload)"); } if (throwable != null) { @@ -80,9 +79,8 @@ static void after( } if (contentCb != null && filesContent != null) { - throwable = - FileUploadHelper.commitBlockingResponse( - contentCb, reqCtx, filesContent, "Blocked request (file content)"); + throwable = FileUploadHelper.commitBlockingResponse( + contentCb, reqCtx, filesContent, "Blocked request (file content)"); } } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextImplInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextImplInstrumentation.java index af8ee74bf18..7d4ca7f0fe6 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RoutingContextImplInstrumentation.java @@ -15,13 +15,13 @@ public class RoutingContextImplInstrumentation extends InstrumenterModule.AppSec implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - private static final Reference FILE_UPLOAD_REF = - new Reference.Builder("io.vertx.ext.web.FileUpload") - .withMethod(new String[0], 0, "fileName", "Ljava/lang/String;") - .withMethod(new String[0], 0, "uploadedFileName", "Ljava/lang/String;") - .withMethod(new String[0], 0, "contentType", "Ljava/lang/String;") - .withMethod(new String[0], 0, "charSet", "Ljava/lang/String;") - .build(); + private static final Reference FILE_UPLOAD_REF = new Reference.Builder( + "io.vertx.ext.web.FileUpload") + .withMethod(new String[0], 0, "fileName", "Ljava/lang/String;") + .withMethod(new String[0], 0, "uploadedFileName", "Ljava/lang/String;") + .withMethod(new String[0], 0, "contentType", "Ljava/lang/String;") + .withMethod(new String[0], 0, "charSet", "Ljava/lang/String;") + .build(); public RoutingContextImplInstrumentation() { super("vertx", "vertx-3.4"); diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSinksVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSinksVerticle.java index 6acf7fa058f..6fa8222ba6c 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSinksVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSinksVerticle.java @@ -13,28 +13,19 @@ public class IastSinksVerticle extends AbstractVerticle { public void start(final Future startFuture) { final int port = config().getInteger(CONFIG_HTTP_SERVER_PORT); Router router = Router.router(vertx); - router - .route("/iast/sinks/reroute1") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(path); - }); - router - .route("/iast/sinks/reroute2") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(HttpMethod.GET, path); - }); - router - .route("/iast/sinks/putheader1") - .handler( - rc -> { - final String headerName = rc.request().getParam("name"); - final String headerValue = rc.request().getParam("value"); - rc.response().putHeader(headerName, headerValue).end(); - }); + router.route("/iast/sinks/reroute1").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(path); + }); + router.route("/iast/sinks/reroute2").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(HttpMethod.GET, path); + }); + router.route("/iast/sinks/putheader1").handler(rc -> { + final String headerName = rc.request().getParam("name"); + final String headerValue = rc.request().getParam("value"); + rc.response().putHeader(headerName, headerValue).end(); + }); vertx .createHttpServer() diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSourceVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSourceVerticle.java index e73ca00d610..315abd98e29 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSourceVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/IastSourceVerticle.java @@ -19,50 +19,32 @@ public void start(final Future startPromise) { Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); router.route().handler(CookieHandler.create()); - router - .route("/iast/propagation/cookies") - .handler( - rc -> { - rc.cookies(); - rc.response().end(); - }); - router - .route("/iast/propagation/getcookie") - .handler( - rc -> { - rc.getCookie("cookie"); - rc.response().end(); - }); - router - .route("/iast/propagation/getcookiename") - .handler( - rc -> { - Cookie cookie = new CookieImpl("cookieName", "cookieValue"); - cookie.getName(); - rc.response().end(); - }); - router - .route("/iast/propagation/getcookievalue") - .handler( - rc -> { - Cookie cookie = new CookieImpl("cookieName", "cookieValue"); - cookie.getValue(); - rc.response().end(); - }); - router - .route("/iast/propagation/headers") - .handler( - rc -> { - rc.request().headers(); - rc.response().end(); - }); - router - .route("/iast/propagation/params") - .handler( - rc -> { - rc.request().params(); - rc.response().end(); - }); + router.route("/iast/propagation/cookies").handler(rc -> { + rc.cookies(); + rc.response().end(); + }); + router.route("/iast/propagation/getcookie").handler(rc -> { + rc.getCookie("cookie"); + rc.response().end(); + }); + router.route("/iast/propagation/getcookiename").handler(rc -> { + Cookie cookie = new CookieImpl("cookieName", "cookieValue"); + cookie.getName(); + rc.response().end(); + }); + router.route("/iast/propagation/getcookievalue").handler(rc -> { + Cookie cookie = new CookieImpl("cookieName", "cookieValue"); + cookie.getValue(); + rc.response().end(); + }); + router.route("/iast/propagation/headers").handler(rc -> { + rc.request().headers(); + rc.response().end(); + }); + router.route("/iast/propagation/params").handler(rc -> { + rc.request().params(); + rc.response().end(); + }); router .route("/iast/propagation/formAttributes") .handler(rc -> rc.response().end(rc.request().formAttributes().get("formAttribute"))); @@ -73,15 +55,13 @@ public void start(final Future startPromise) { vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) .requestHandler(router::accept) - .listen( - port, - http -> { - if (http.succeeded()) { - startPromise.complete(); - System.out.println("HTTP server started"); - } else { - startPromise.fail(http.cause()); - } - }); + .listen(port, http -> { + if (http.succeeded()) { + startPromise.complete(); + System.out.println("HTTP server started"); + } else { + startPromise.fail(http.cause()); + } + }); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerExceptionHandlerTest.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerExceptionHandlerTest.java index 3892646adcf..87fe53295f7 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerExceptionHandlerTest.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerExceptionHandlerTest.java @@ -46,33 +46,24 @@ static void startServer() throws Exception { vertx = Vertx.vertx(); Router router = Router.router(vertx); - router - .route("/fail") - .handler( - ctx -> { - ResponseExceptionFiringHelper.fireException( - ctx.response(), new IOException("simulated response I/O failure")); - try { - ctx.response().setStatusCode(500).end("error"); - } catch (IllegalStateException ignore) { - // handleException may have left the response in a state where end() is rejected; - // the span is already finished by our registered exception handler. - } - }); + router.route("/fail").handler(ctx -> { + ResponseExceptionFiringHelper.fireException( + ctx.response(), new IOException("simulated response I/O failure")); + try { + ctx.response().setStatusCode(500).end("error"); + } catch (IllegalStateException ignore) { + // handleException may have left the response in a state where end() is rejected; + // the span is already finished by our registered exception handler. + } + }); CountDownLatch ready = new CountDownLatch(1); - server = - vertx - .createHttpServer() - .requestHandler(router::accept) - .listen( - port, - result -> { - if (result.failed()) { - throw new RuntimeException("Failed to start Vert.x server", result.cause()); - } - ready.countDown(); - }); + server = vertx.createHttpServer().requestHandler(router::accept).listen(port, result -> { + if (result.failed()) { + throw new RuntimeException("Failed to start Vert.x server", result.cause()); + } + ready.countDown(); + }); if (!ready.await(10, TimeUnit.SECONDS)) { throw new IllegalStateException("Vert.x server did not start in time"); } @@ -111,16 +102,15 @@ void exceptionHandlerFinishesRouteHandlerSpan() throws Exception { // The netty.request span is marked as errored because the route handler ends with // HTTP 500; the route-handler span is finished by our exception handler before // setStatusCode(500), so it sees status=200 (default) and is not errored. - assertTraces( - trace( - SORT_BY_START_TIME, - span() - .operationName(Pattern.compile(Pattern.quote("netty.request"))) - .type(DDSpanTypes.HTTP_SERVER) - .error(), - span() - .childOfPrevious() - .operationName(Pattern.compile(Pattern.quote("vertx.route-handler"))) - .type(DDSpanTypes.HTTP_SERVER))); + assertTraces(trace( + SORT_BY_START_TIME, + span() + .operationName(Pattern.compile(Pattern.quote("netty.request"))) + .type(DDSpanTypes.HTTP_SERVER) + .error(), + span() + .childOfPrevious() + .operationName(Pattern.compile(Pattern.quote("vertx.route-handler"))) + .type(DDSpanTypes.HTTP_SERVER))); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerSendFileTest.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerSendFileTest.java index 06102063a1b..42b172aa56d 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerSendFileTest.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/RouteHandlerSendFileTest.java @@ -59,18 +59,12 @@ static void startServer() throws Exception { .handler(ctx -> ctx.response().sendFile(payload.toAbsolutePath().toString())); CountDownLatch ready = new CountDownLatch(1); - server = - vertx - .createHttpServer() - .requestHandler(router::accept) - .listen( - port, - result -> { - if (result.failed()) { - throw new RuntimeException("Failed to start Vert.x server", result.cause()); - } - ready.countDown(); - }); + server = vertx.createHttpServer().requestHandler(router::accept).listen(port, result -> { + if (result.failed()) { + throw new RuntimeException("Failed to start Vert.x server", result.cause()); + } + ready.countDown(); + }); if (!ready.await(10, TimeUnit.SECONDS)) { throw new IllegalStateException("Vert.x server did not start in time"); } @@ -108,15 +102,14 @@ void sendFileFinishesRouteHandlerSpan() throws Exception { // Pre-fix: the route-handler span never finishes on the sendFile path, so the trace // is never published and assertTraces times out waiting for the trace to flush. - assertTraces( - trace( - SORT_BY_START_TIME, - span() - .operationName(Pattern.compile(Pattern.quote("netty.request"))) - .type(DDSpanTypes.HTTP_SERVER), - span() - .childOfPrevious() - .operationName(Pattern.compile(Pattern.quote("vertx.route-handler"))) - .type(DDSpanTypes.HTTP_SERVER))); + assertTraces(trace( + SORT_BY_START_TIME, + span() + .operationName(Pattern.compile(Pattern.quote("netty.request"))) + .type(DDSpanTypes.HTTP_SERVER), + span() + .childOfPrevious() + .operationName(Pattern.compile(Pattern.quote("vertx.route-handler"))) + .type(DDSpanTypes.HTTP_SERVER))); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/VertxTestServer.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/VertxTestServer.java index 0110d1268da..ea29133320f 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/VertxTestServer.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.4/src/test/java/server/VertxTestServer.java @@ -48,150 +48,102 @@ public void start(final Future startFuture) { router .route(SUCCESS.getPath()) - .handler( - ctx -> - controller( - ctx, - SUCCESS, - () -> - ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); + .handler(ctx -> controller( + ctx, + SUCCESS, + () -> ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); router .route(FORWARDED.getPath()) - .handler( - ctx -> - controller( - ctx, - FORWARDED, - () -> - ctx.response() - .setStatusCode(FORWARDED.getStatus()) - .end(ctx.request().getHeader("x-forwarded-for")))); + .handler(ctx -> controller( + ctx, + FORWARDED, + () -> ctx.response() + .setStatusCode(FORWARDED.getStatus()) + .end(ctx.request().getHeader("x-forwarded-for")))); router .route(CREATED.getPath()) - .handler( - ctx -> - controller( - ctx, - CREATED, - () -> - ctx.request() - .bodyHandler( - body -> - ctx.response() - .setStatusCode(CREATED.getStatus()) - .end(CREATED.getBody() + ": " + body.toString())))); + .handler(ctx -> controller( + ctx, + CREATED, + () -> ctx.request() + .bodyHandler(body -> ctx.response() + .setStatusCode(CREATED.getStatus()) + .end(CREATED.getBody() + ": " + body.toString())))); router.route(BODY_URLENCODED.getPath()).handler(BodyHandler.create()); router .route(BODY_URLENCODED.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_URLENCODED, - () -> { - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_URLENCODED, () -> { + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); + })); router.route(BODY_MULTIPART.getPath()).handler(BodyHandler.create()); router .route(BODY_MULTIPART.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_MULTIPART, - () -> { - ctx.fileUploads(); - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_MULTIPART, () -> { + ctx.fileUploads(); + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); + })); router.route(BODY_JSON.getPath()).handler(BodyHandler.create()); router .route(BODY_JSON.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_JSON, - () -> { - JsonObject json = ctx.getBodyAsJson(); - ctx.response().setStatusCode(BODY_JSON.getStatus()).end(json.toString()); - })); + .handler(ctx -> controller(ctx, BODY_JSON, () -> { + JsonObject json = ctx.getBodyAsJson(); + ctx.response().setStatusCode(BODY_JSON.getStatus()).end(json.toString()); + })); router .route(QUERY_ENCODED_BOTH.getRawPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_BOTH, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) - .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_BOTH, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) + .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); router .route(QUERY_ENCODED_QUERY.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_QUERY, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) - .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_QUERY, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) + .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); router .route(QUERY_PARAM.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_PARAM, - () -> - ctx.response() - .setStatusCode(QUERY_PARAM.getStatus()) - .end(ctx.request().query()))); + .handler(ctx -> controller( + ctx, + QUERY_PARAM, + () -> ctx.response() + .setStatusCode(QUERY_PARAM.getStatus()) + .end(ctx.request().query()))); router .route(USER_BLOCK.getPath()) - .handler( - ctx -> - controller( - ctx, - USER_BLOCK, - () -> { - Blocking.forUser("user-to-block").blockIfMatch(); - ctx.response().end("Should not be reached"); - })); + .handler(ctx -> controller(ctx, USER_BLOCK, () -> { + Blocking.forUser("user-to-block").blockIfMatch(); + ctx.response().end("Should not be reached"); + })); router .route("/path/:id/param") - .handler( - ctx -> - controller( - ctx, - PATH_PARAM, - () -> - ctx.response() - .setStatusCode(PATH_PARAM.getStatus()) - .end(ctx.request().getParam("id")))); + .handler(ctx -> controller( + ctx, + PATH_PARAM, + () -> ctx.response() + .setStatusCode(PATH_PARAM.getStatus()) + .end(ctx.request().getParam("id")))); router .route(REDIRECT.getPath()) - .handler( - ctx -> - controller( - ctx, - REDIRECT, - () -> - ctx.response() - .setStatusCode(REDIRECT.getStatus()) - .putHeader("location", REDIRECT.getBody()) - .end())); + .handler(ctx -> controller( + ctx, + REDIRECT, + () -> ctx.response() + .setStatusCode(REDIRECT.getStatus()) + .putHeader("location", REDIRECT.getBody()) + .end())); router .route(ERROR.getPath()) - .handler( - ctx -> - controller( - ctx, - ERROR, - () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); + .handler(ctx -> controller( + ctx, + ERROR, + () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); router .route(EXCEPTION.getPath()) .handler(ctx -> controller(ctx, EXCEPTION, VertxTestServer::exception)); @@ -202,8 +154,9 @@ public void start(final Future startFuture) { .handler(SessionHandler.create(LocalSessionStore.create(vertx))); router .route(SESSION_ID.getPath()) - .handler( - ctx -> ctx.response().setStatusCode(SESSION_ID.getStatus()).end(ctx.session().id())); + .handler(ctx -> ctx.response() + .setStatusCode(SESSION_ID.getStatus()) + .end(ctx.session().id())); router = customizeAfterRoutes(router); diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.9/src/test/java/server/IastVertx39TestVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.9/src/test/java/server/IastVertx39TestVerticle.java index 5893f99f871..f898ca402c2 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.9/src/test/java/server/IastVertx39TestVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-3.9/src/test/java/server/IastVertx39TestVerticle.java @@ -42,191 +42,135 @@ public void start(final Future startFuture) { customizeBeforeRoutes(router); router .route("/vulnerability/setHeaderString") - .handler( - ctx -> - controller( - ctx, - SUCCESS, - () -> { - final String headerName = ctx.request().getParam("name"); - final String headerValue = ctx.request().getParam("value"); - ctx.response() - .setStatusCode(SUCCESS.getStatus()) - .putHeader(headerName, headerValue) - .end(SUCCESS.getBody()); - })); + .handler(ctx -> controller(ctx, SUCCESS, () -> { + final String headerName = ctx.request().getParam("name"); + final String headerValue = ctx.request().getParam("value"); + ctx.response() + .setStatusCode(SUCCESS.getStatus()) + .putHeader(headerName, headerValue) + .end(SUCCESS.getBody()); + })); router .route("/iast/vulnerabilities/insecureCookie") - .handler( - ctx -> - controller( - ctx, - SUCCESS, - () -> { - final String headerName = ctx.request().getParam("name"); - final String headerValue = ctx.request().getParam("value"); - Cookie cookie = Cookie.cookie(headerName, headerValue); - if ("true".equals(ctx.request().getParam("secure"))) { - cookie.setSecure(true); - } - ctx.response() - .setStatusCode(SUCCESS.getStatus()) - .addCookie(cookie) - .end("Cookie Set"); - })); + .handler(ctx -> controller(ctx, SUCCESS, () -> { + final String headerName = ctx.request().getParam("name"); + final String headerValue = ctx.request().getParam("value"); + Cookie cookie = Cookie.cookie(headerName, headerValue); + if ("true".equals(ctx.request().getParam("secure"))) { + cookie.setSecure(true); + } + ctx.response().setStatusCode(SUCCESS.getStatus()).addCookie(cookie).end("Cookie Set"); + })); router .route(SUCCESS.getPath()) - .handler( - ctx -> - controller( - ctx, - SUCCESS, - () -> - ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); + .handler(ctx -> controller( + ctx, + SUCCESS, + () -> ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); router .route(FORWARDED.getPath()) - .handler( - ctx -> - controller( - ctx, - FORWARDED, - () -> - ctx.response() - .setStatusCode(FORWARDED.getStatus()) - .end(ctx.request().getHeader("x-forwarded-for")))); + .handler(ctx -> controller( + ctx, + FORWARDED, + () -> ctx.response() + .setStatusCode(FORWARDED.getStatus()) + .end(ctx.request().getHeader("x-forwarded-for")))); router .route(CREATED.getPath()) - .handler( - ctx -> - controller( - ctx, - CREATED, - () -> - ctx.request() - .bodyHandler( - body -> - ctx.response() - .setStatusCode(CREATED.getStatus()) - .end(CREATED.getBody() + ": " + body.toString())))); + .handler(ctx -> controller( + ctx, + CREATED, + () -> ctx.request() + .bodyHandler(body -> ctx.response() + .setStatusCode(CREATED.getStatus()) + .end(CREATED.getBody() + ": " + body.toString())))); router.route(BODY_URLENCODED.getPath()).handler(BodyHandler.create()); router .route(BODY_URLENCODED.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_URLENCODED, - () -> { - String res = "["; - MultiMap entries = ctx.request().formAttributes(); - for (String name : entries.names()) { - if (name.equals("ignore")) { - continue; - } - if (res.length() > 1) { - res += ", "; - } - res += name; - res += ":["; - int i = 0; - for (String s : entries.getAll(name)) { - if (i++ > 0) { - res += ", "; - } - res += s; - } - res += ']'; - } - res += ']'; - ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_URLENCODED, () -> { + String res = "["; + MultiMap entries = ctx.request().formAttributes(); + for (String name : entries.names()) { + if (name.equals("ignore")) { + continue; + } + if (res.length() > 1) { + res += ", "; + } + res += name; + res += ":["; + int i = 0; + for (String s : entries.getAll(name)) { + if (i++ > 0) { + res += ", "; + } + res += s; + } + res += ']'; + } + res += ']'; + ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); + })); router.route(BODY_JSON.getPath()).handler(BodyHandler.create()); router .route(BODY_JSON.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_JSON, - () -> { - JsonObject json = ctx.getBodyAsJson(); - ctx.response().setStatusCode(BODY_JSON.getStatus()).end(json.toString()); - })); + .handler(ctx -> controller(ctx, BODY_JSON, () -> { + JsonObject json = ctx.getBodyAsJson(); + ctx.response().setStatusCode(BODY_JSON.getStatus()).end(json.toString()); + })); router .route(QUERY_ENCODED_BOTH.getRawPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_BOTH, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) - .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_BOTH, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) + .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); router .route(QUERY_ENCODED_QUERY.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_QUERY, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) - .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_QUERY, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) + .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); router .route(QUERY_PARAM.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_PARAM, - () -> - ctx.response() - .setStatusCode(QUERY_PARAM.getStatus()) - .end(ctx.request().query()))); + .handler(ctx -> controller( + ctx, + QUERY_PARAM, + () -> ctx.response() + .setStatusCode(QUERY_PARAM.getStatus()) + .end(ctx.request().query()))); router .route(USER_BLOCK.getPath()) - .handler( - ctx -> - controller( - ctx, - USER_BLOCK, - () -> { - Blocking.forUser("user-to-block").blockIfMatch(); - ctx.response().end("Should not be reached"); - })); + .handler(ctx -> controller(ctx, USER_BLOCK, () -> { + Blocking.forUser("user-to-block").blockIfMatch(); + ctx.response().end("Should not be reached"); + })); router .route("/path/:id/param") - .handler( - ctx -> - controller( - ctx, - PATH_PARAM, - () -> - ctx.response() - .setStatusCode(PATH_PARAM.getStatus()) - .end(ctx.request().getParam("id")))); + .handler(ctx -> controller( + ctx, + PATH_PARAM, + () -> ctx.response() + .setStatusCode(PATH_PARAM.getStatus()) + .end(ctx.request().getParam("id")))); router .route(REDIRECT.getPath()) - .handler( - ctx -> - controller( - ctx, - REDIRECT, - () -> - ctx.response() - .setStatusCode(REDIRECT.getStatus()) - .putHeader("location", REDIRECT.getBody()) - .end())); + .handler(ctx -> controller( + ctx, + REDIRECT, + () -> ctx.response() + .setStatusCode(REDIRECT.getStatus()) + .putHeader("location", REDIRECT.getBody()) + .end())); router .route(ERROR.getPath()) - .handler( - ctx -> - controller( - ctx, - ERROR, - () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); + .handler(ctx -> controller( + ctx, + ERROR, + () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); router .route(EXCEPTION.getPath()) .handler(ctx -> controller(ctx, EXCEPTION, IastVertx39TestVerticle::exception)); diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSinksVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSinksVerticle.java index a518d274e99..7e77c908587 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSinksVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSinksVerticle.java @@ -14,28 +14,19 @@ public class IastSinksVerticle extends AbstractVerticle { public void start(final Promise startPromise) throws Exception { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - router - .route("/iast/sinks/reroute1") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(path); - }); - router - .route("/iast/sinks/reroute2") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(HttpMethod.GET, path); - }); - router - .route("/iast/sinks/redirectheader") - .handler( - rc -> { - final String name = rc.request().getParam("name"); - final String value = rc.request().getParam("value"); - rc.response().putHeader(name, value).end(); - }); + router.route("/iast/sinks/reroute1").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(path); + }); + router.route("/iast/sinks/reroute2").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(HttpMethod.GET, path); + }); + router.route("/iast/sinks/redirectheader").handler(rc -> { + final String name = rc.request().getParam("name"); + final String value = rc.request().getParam("value"); + rc.response().putHeader(name, value).end(); + }); final EventBus eventBus = vertx.eventBus(); final HttpServerOptions serverOptions = new HttpServerOptions(); @@ -44,18 +35,13 @@ public void start(final Promise startPromise) throws Exception { .createHttpServer(serverOptions) .requestHandler(router) .listen(0) - .onSuccess( - server -> - eventBus - .request("PORT_DATA", server.actualPort()) - .andThen( - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - })) + .onSuccess(server -> eventBus.request("PORT_DATA", server.actualPort()).andThen(ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + })) .onFailure(startPromise::fail); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSourcesVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSourcesVerticle.java index 35cef8bc955..5eb37d67bf7 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSourcesVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/IastSourcesVerticle.java @@ -25,129 +25,87 @@ public class IastSourcesVerticle extends AbstractVerticle { public void start(final Promise startPromise) throws Exception { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - router - .route("/iast/sources/header") - .handler( - rc -> { - final String value = rc.request().getHeader("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/headers") - .handler( - rc -> { - final MultiMap value = rc.request().headers(); - rc.response().end("Received " + value.get("name")); - }); - router - .route("/iast/sources/cookie") - .handler( - rc -> { - final Cookie cookie = rc.request().getCookie("name"); - rc.response().end("Received " + cookie.getName() + " " + cookie.getValue()); - }); - router - .route("/iast/sources/path/:name") - .handler( - rc -> { - final String value = rc.pathParam("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/parameter") - .handler( - rc -> { - final String value = rc.request().getParam("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/parameters") - .handler( - rc -> { - final MultiMap value = rc.request().params(); - rc.response().end("Received " + value.get("name")); - }); - router - .route("/iast/sources/form") - .handler( - rc -> { - final String value = rc.request().getFormAttribute("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/body/string") - .handler( - rc -> { - final String encoding = rc.request().getParam("encoding"); - if (encoding != null) { - rc.response().end("Received " + rc.body().asString(encoding)); - } else { - rc.response().end("Received " + rc.body().asString()); - } - }); - router - .route("/iast/sources/body/json") - .handler( - rc -> { - rc.response().end("Received " + rc.body().asJsonObject()); - }); - router - .route("/body/jsonArray") - .handler( - rc -> { - rc.response().end("Received " + rc.body().asJsonArray()); - }); + router.route("/iast/sources/header").handler(rc -> { + final String value = rc.request().getHeader("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/headers").handler(rc -> { + final MultiMap value = rc.request().headers(); + rc.response().end("Received " + value.get("name")); + }); + router.route("/iast/sources/cookie").handler(rc -> { + final Cookie cookie = rc.request().getCookie("name"); + rc.response().end("Received " + cookie.getName() + " " + cookie.getValue()); + }); + router.route("/iast/sources/path/:name").handler(rc -> { + final String value = rc.pathParam("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/parameter").handler(rc -> { + final String value = rc.request().getParam("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/parameters").handler(rc -> { + final MultiMap value = rc.request().params(); + rc.response().end("Received " + value.get("name")); + }); + router.route("/iast/sources/form").handler(rc -> { + final String value = rc.request().getFormAttribute("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/body/string").handler(rc -> { + final String encoding = rc.request().getParam("encoding"); + if (encoding != null) { + rc.response().end("Received " + rc.body().asString(encoding)); + } else { + rc.response().end("Received " + rc.body().asString()); + } + }); + router.route("/iast/sources/body/json").handler(rc -> { + rc.response().end("Received " + rc.body().asJsonObject()); + }); + router.route("/body/jsonArray").handler(rc -> { + rc.response().end("Received " + rc.body().asJsonArray()); + }); - router - .route("/iast/sources/eventBus") - .handler( - rc -> { - final JsonObject target = rc.body().asJsonObject(); - rc.vertx() - .eventBus() - .request(EVENT_BUS_ENDPOINT, target) - .andThen( - reply -> { - if (reply.succeeded()) { - rc.response().end(reply.result().body().toString()); - } else { - rc.fail(reply.cause()); - } - }); - }); - router - .route("/iast/vulnerabilities/insecureCookie") - .handler( - rc -> { - final String cookieName = rc.request().getParam("name"); - final String cookieValue = rc.request().getParam("value"); - final String secure = rc.request().getParam("secure"); - Cookie cookie = Cookie.cookie(cookieName, cookieValue); - if ("true".equals(secure)) { - cookie.setSecure(true); - } - rc.response().addCookie(cookie).end("Cookie Set"); - }); + router.route("/iast/sources/eventBus").handler(rc -> { + final JsonObject target = rc.body().asJsonObject(); + rc.vertx().eventBus().request(EVENT_BUS_ENDPOINT, target).andThen(reply -> { + if (reply.succeeded()) { + rc.response().end(reply.result().body().toString()); + } else { + rc.fail(reply.cause()); + } + }); + }); + router.route("/iast/vulnerabilities/insecureCookie").handler(rc -> { + final String cookieName = rc.request().getParam("name"); + final String cookieValue = rc.request().getParam("value"); + final String secure = rc.request().getParam("secure"); + Cookie cookie = Cookie.cookie(cookieName, cookieValue); + if ("true".equals(secure)) { + cookie.setSecure(true); + } + rc.response().addCookie(cookie).end("Cookie Set"); + }); final EventBus eventBus = vertx.eventBus(); - eventBus.consumer( - EVENT_BUS_ENDPOINT, - message -> { - final JsonObject payload = (JsonObject) message.body(); - final String name = payload.getString("name"); - try { - final IastContext ctx = IastContext.Provider.get(); - if (ctx == null) { - throw new IllegalStateException("No IAST context present"); - } - final TaintedObjects to = ctx.getTaintedObjects(); - final boolean tainted = to.get(name) != null; - message.reply(tainted ? "OK" : "NO_OK"); - } catch (Throwable e) { - LOGGER.error("Failed to handle event bus message", e); - message.reply("NO_OK"); - } - }); + eventBus.consumer(EVENT_BUS_ENDPOINT, message -> { + final JsonObject payload = (JsonObject) message.body(); + final String name = payload.getString("name"); + try { + final IastContext ctx = IastContext.Provider.get(); + if (ctx == null) { + throw new IllegalStateException("No IAST context present"); + } + final TaintedObjects to = ctx.getTaintedObjects(); + final boolean tainted = to.get(name) != null; + message.reply(tainted ? "OK" : "NO_OK"); + } catch (Throwable e) { + LOGGER.error("Failed to handle event bus message", e); + message.reply("NO_OK"); + } + }); final HttpServerOptions serverOptions = new HttpServerOptions(); if (config().getBoolean("https")) { @@ -162,18 +120,13 @@ public void start(final Promise startPromise) throws Exception { .createHttpServer(serverOptions) .requestHandler(router) .listen(0) - .onSuccess( - server -> - eventBus - .request("PORT_DATA", server.actualPort()) - .andThen( - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - })) + .onSuccess(server -> eventBus.request("PORT_DATA", server.actualPort()).andThen(ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + })) .onFailure(startPromise::fail); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/VertxTestServer.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/VertxTestServer.java index 8b20617cc7c..3996df1784c 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/VertxTestServer.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/latestDepTest/java/server/VertxTestServer.java @@ -48,152 +48,104 @@ public void start(final Promise startPromise) { router .route(SUCCESS.getPath()) - .handler( - ctx -> - controller( - ctx, - SUCCESS, - () -> - ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); + .handler(ctx -> controller( + ctx, + SUCCESS, + () -> ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); router .route(FORWARDED.getPath()) - .handler( - ctx -> - controller( - ctx, - FORWARDED, - () -> - ctx.response() - .setStatusCode(FORWARDED.getStatus()) - .end(ctx.request().getHeader("x-forwarded-for")))); + .handler(ctx -> controller( + ctx, + FORWARDED, + () -> ctx.response() + .setStatusCode(FORWARDED.getStatus()) + .end(ctx.request().getHeader("x-forwarded-for")))); router .route(CREATED.getPath()) - .handler( - ctx -> - controller( - ctx, - CREATED, - () -> - ctx.request() - .bodyHandler( - body -> - ctx.response() - .setStatusCode(CREATED.getStatus()) - .end(CREATED.getBody() + ": " + body.toString())))); + .handler(ctx -> controller( + ctx, + CREATED, + () -> ctx.request() + .bodyHandler(body -> ctx.response() + .setStatusCode(CREATED.getStatus()) + .end(CREATED.getBody() + ": " + body.toString())))); router.route(BODY_URLENCODED.getPath()).handler(BodyHandler.create()); router .route(BODY_URLENCODED.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_URLENCODED, - () -> { - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_URLENCODED, () -> { + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); + })); router.route(BODY_MULTIPART.getPath()).handler(BodyHandler.create()); router .route(BODY_MULTIPART.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_MULTIPART, - () -> { - ctx.fileUploads(); - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_MULTIPART, () -> { + ctx.fileUploads(); + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); + })); router.route(BODY_JSON.getPath()).handler(BodyHandler.create()); router .route(BODY_JSON.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_JSON, - () -> { - JsonObject json = ctx.body().asJsonObject(); - ctx.response().setStatusCode(BODY_JSON.getStatus()).end(json.toString()); - })); + .handler(ctx -> controller(ctx, BODY_JSON, () -> { + JsonObject json = ctx.body().asJsonObject(); + ctx.response().setStatusCode(BODY_JSON.getStatus()).end(json.toString()); + })); router .route(QUERY_ENCODED_BOTH.getRawPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_BOTH, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) - .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_BOTH, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) + .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); router .route(QUERY_ENCODED_QUERY.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_QUERY, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) - .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_QUERY, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) + .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); router .route(QUERY_PARAM.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_PARAM, - () -> - ctx.response() - .setStatusCode(QUERY_PARAM.getStatus()) - .end(ctx.request().query()))); + .handler(ctx -> controller( + ctx, + QUERY_PARAM, + () -> ctx.response() + .setStatusCode(QUERY_PARAM.getStatus()) + .end(ctx.request().query()))); router .route(USER_BLOCK.getPath()) - .handler( - ctx -> - controller( - ctx, - USER_BLOCK, - () -> { - Blocking.forUser("user-to-block").blockIfMatch(); - ctx.response().end("Should not be reached"); - })); + .handler(ctx -> controller(ctx, USER_BLOCK, () -> { + Blocking.forUser("user-to-block").blockIfMatch(); + ctx.response().end("Should not be reached"); + })); router .route("/path/:id/param") - .handler( - ctx -> - controller( - ctx, - PATH_PARAM, - () -> - ctx.response() - .setStatusCode(PATH_PARAM.getStatus()) - .end(ctx.request().getParam("id")))); + .handler(ctx -> controller( + ctx, + PATH_PARAM, + () -> ctx.response() + .setStatusCode(PATH_PARAM.getStatus()) + .end(ctx.request().getParam("id")))); router .route(REDIRECT.getPath()) - .handler( - ctx -> - controller( - ctx, - REDIRECT, - () -> - ctx.response() - .setStatusCode(REDIRECT.getStatus()) - .putHeader("location", REDIRECT.getBody()) - .end())); + .handler(ctx -> controller( + ctx, + REDIRECT, + () -> ctx.response() + .setStatusCode(REDIRECT.getStatus()) + .putHeader("location", REDIRECT.getBody()) + .end())); router .route(ERROR.getPath()) - .handler( - ctx -> - controller( - ctx, - ERROR, - () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); + .handler(ctx -> controller( + ctx, + ERROR, + () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); router .route(EXCEPTION.getPath()) .handler(ctx -> controller(ctx, EXCEPTION, VertxTestServer::exception)); @@ -203,8 +155,9 @@ public void start(final Promise startPromise) { .handler(SessionHandler.create(LocalSessionStore.create(vertx))); router .route(SESSION_ID.getPath()) - .handler( - ctx -> ctx.response().setStatusCode(SESSION_ID.getStatus()).end(ctx.session().id())); + .handler(ctx -> ctx.response() + .setStatusCode(SESSION_ID.getStatus()) + .end(ctx.session().id())); router = customizeAfterRoutes(router); @@ -212,22 +165,17 @@ public void start(final Promise startPromise) { .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) .requestHandler(router) .listen(port) - .andThen( - event -> { - // send this though event bus and succeed deploy after successful response - int actualPort = event.result().actualPort(); - vertx - .eventBus() - .request(PORT_DATA_ADDRESS, actualPort) - .andThen( - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - }); - }); + .andThen(event -> { + // send this though event bus and succeed deploy after successful response + int actualPort = event.result().actualPort(); + vertx.eventBus().request(PORT_DATA_ADDRESS, actualPort).andThen(ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + }); + }); } private static String convertFormAttributes(RoutingContext ctx) { diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/client/HttpClientRequestBaseInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/client/HttpClientRequestBaseInstrumentation.java index 5c617ce0275..71648c9d2e0 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/client/HttpClientRequestBaseInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/client/HttpClientRequestBaseInstrumentation.java @@ -59,8 +59,11 @@ public static void onExit( @Advice.FieldValue("stream") final HttpClientStream stream, @Advice.Return boolean result) { if (result) { - Context storedContext = - stream.connection().channel().attr(AttributeKeys.CONTEXT_ATTRIBUTE_KEY).get(); + Context storedContext = stream + .connection() + .channel() + .attr(AttributeKeys.CONTEXT_ATTRIBUTE_KEY) + .get(); AgentSpan nettySpan = spanFromContext(storedContext); if (nettySpan != null) { try (final AgentScope scope = activateSpan(nettySpan)) { diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/core/HttpServerResponseInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/core/HttpServerResponseInstrumentation.java index 6f974350d96..fd3f023e8e4 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/core/HttpServerResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/core/HttpServerResponseInstrumentation.java @@ -31,15 +31,13 @@ public HttpServerResponseInstrumentation() { public void methodAdvice(final MethodTransformer transformer) { transformer.applyAdvice( named("putHeader") - .and( - takesArguments(CharSequence.class, CharSequence.class) - .or(takesArguments(String.class, String.class))), + .and(takesArguments(CharSequence.class, CharSequence.class) + .or(takesArguments(String.class, String.class))), HttpServerResponseInstrumentation.class.getName() + "$PutHeaderAdvice1"); transformer.applyAdvice( named("putHeader") - .and( - takesArguments(CharSequence.class, Iterable.class) - .or(takesArguments(String.class, Iterable.class))), + .and(takesArguments(CharSequence.class, Iterable.class) + .or(takesArguments(String.class, Iterable.class))), HttpServerResponseInstrumentation.class.getName() + "$PutHeaderAdvice2"); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/FileUploadHelper.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/FileUploadHelper.java index c0eef8cab2e..f08c62cceec 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/FileUploadHelper.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/FileUploadHelper.java @@ -37,10 +37,9 @@ public static String readUploadContent(FileUpload upload, int maxBytes) { return ""; } String charSet = upload.charSet(); - String contentType = - charSet != null && !charSet.isEmpty() - ? upload.contentType() + "; charset=" + charSet - : upload.contentType(); + String contentType = charSet != null && !charSet.isEmpty() + ? upload.contentType() + "; charset=" + charSet + : upload.contentType(); try (FileInputStream fis = new FileInputStream(path)) { return MultipartContentDecoder.readInputStream(fis, maxBytes, contentType); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java index 28e79e35a27..63836d2858a 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java @@ -105,10 +105,9 @@ private void setRoute(RoutingContext routingContext) { } if (mountPoint != null && path != null) { - final String noBackslashhMountPoint = - mountPoint.endsWith("/") - ? mountPoint.substring(0, mountPoint.lastIndexOf("/")) - : mountPoint; + final String noBackslashhMountPoint = mountPoint.endsWith("/") + ? mountPoint.substring(0, mountPoint.lastIndexOf("/")) + : mountPoint; path = noBackslashhMountPoint + path; } if (method != null && path != null && shouldUpdateRoute(routingContext, parentSpan, path)) { diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteImplInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteImplInstrumentation.java index a2041f43264..f1d4a962228 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteImplInstrumentation.java @@ -67,11 +67,10 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( named("matches") .and(takesArguments(3)) - .and( - takesArgument( - 0, - named("io.vertx.ext.web.impl.RoutingContextImplBase") - .or(named("io.vertx.ext.web.RoutingContext")))) + .and(takesArgument( + 0, + named("io.vertx.ext.web.impl.RoutingContextImplBase") + .or(named("io.vertx.ext.web.RoutingContext")))) .and(takesArgument(1, String.class)) .and(takesArgument(2, boolean.class)) .and(returns(boolean.class)), diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextFilenamesAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextFilenamesAdvice.java index 284b8448a4f..7e48846a5f5 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextFilenamesAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextFilenamesAdvice.java @@ -70,9 +70,8 @@ static void after( } if (filenamesCb != null && filenames != null) { - throwable = - FileUploadHelper.commitBlockingResponse( - filenamesCb, reqCtx, filenames, "Blocked request (multipart file upload)"); + throwable = FileUploadHelper.commitBlockingResponse( + filenamesCb, reqCtx, filenames, "Blocked request (multipart file upload)"); } if (throwable != null) { @@ -80,9 +79,8 @@ static void after( } if (contentCb != null && filesContent != null) { - throwable = - FileUploadHelper.commitBlockingResponse( - contentCb, reqCtx, filesContent, "Blocked request (file content)"); + throwable = FileUploadHelper.commitBlockingResponse( + contentCb, reqCtx, filesContent, "Blocked request (file content)"); } } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextImplInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextImplInstrumentation.java index 97623985225..14a7276b320 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RoutingContextImplInstrumentation.java @@ -18,13 +18,13 @@ public class RoutingContextImplInstrumentation extends InstrumenterModule.AppSec implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - private static final Reference FILE_UPLOAD_REF = - new Reference.Builder("io.vertx.ext.web.FileUpload") - .withMethod(new String[0], 0, "fileName", "Ljava/lang/String;") - .withMethod(new String[0], 0, "uploadedFileName", "Ljava/lang/String;") - .withMethod(new String[0], 0, "contentType", "Ljava/lang/String;") - .withMethod(new String[0], 0, "charSet", "Ljava/lang/String;") - .build(); + private static final Reference FILE_UPLOAD_REF = new Reference.Builder( + "io.vertx.ext.web.FileUpload") + .withMethod(new String[0], 0, "fileName", "Ljava/lang/String;") + .withMethod(new String[0], 0, "uploadedFileName", "Ljava/lang/String;") + .withMethod(new String[0], 0, "contentType", "Ljava/lang/String;") + .withMethod(new String[0], 0, "charSet", "Ljava/lang/String;") + .build(); public RoutingContextImplInstrumentation() { super("vertx", "vertx-4.0"); diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSinksVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSinksVerticle.java index 1b274eb1d1a..37a7d5d727c 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSinksVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSinksVerticle.java @@ -14,28 +14,19 @@ public class IastSinksVerticle extends AbstractVerticle { public void start(final Promise startPromise) throws Exception { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - router - .route("/iast/sinks/reroute1") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(path); - }); - router - .route("/iast/sinks/reroute2") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(HttpMethod.GET, path); - }); - router - .route("/iast/sinks/redirectheader") - .handler( - rc -> { - final String name = rc.request().getParam("name"); - final String value = rc.request().getParam("value"); - rc.response().putHeader(name, value).end(); - }); + router.route("/iast/sinks/reroute1").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(path); + }); + router.route("/iast/sinks/reroute2").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(HttpMethod.GET, path); + }); + router.route("/iast/sinks/redirectheader").handler(rc -> { + final String name = rc.request().getParam("name"); + final String value = rc.request().getParam("value"); + rc.response().putHeader(name, value).end(); + }); final EventBus eventBus = vertx.eventBus(); final HttpServerOptions serverOptions = new HttpServerOptions(); @@ -44,18 +35,13 @@ public void start(final Promise startPromise) throws Exception { .createHttpServer(serverOptions) .requestHandler(router) .listen(0) - .onSuccess( - server -> - eventBus.request( - "PORT_DATA", - server.actualPort(), - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - })) + .onSuccess(server -> eventBus.request("PORT_DATA", server.actualPort(), ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + })) .onFailure(startPromise::fail); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSourcesVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSourcesVerticle.java index 9964b8909a4..f896fcc3c14 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSourcesVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/IastSourcesVerticle.java @@ -25,130 +25,87 @@ public class IastSourcesVerticle extends AbstractVerticle { public void start(final Promise startPromise) throws Exception { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - router - .route("/iast/sources/header") - .handler( - rc -> { - final String value = rc.request().getHeader("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/headers") - .handler( - rc -> { - final MultiMap value = rc.request().headers(); - rc.response().end("Received " + value.get("name")); - }); - router - .route("/iast/sources/cookie") - .handler( - rc -> { - final Cookie cookie = rc.getCookie("name"); - rc.response().end("Received " + cookie.getName() + " " + cookie.getValue()); - }); - router - .route("/iast/sources/path/:name") - .handler( - rc -> { - final String value = rc.pathParam("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/parameter") - .handler( - rc -> { - final String value = rc.request().getParam("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/parameters") - .handler( - rc -> { - final MultiMap value = rc.request().params(); - rc.response().end("Received " + value.get("name")); - }); - router - .route("/iast/sources/form") - .handler( - rc -> { - final String value = rc.request().getFormAttribute("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/body/string") - .handler( - rc -> { - final String encoding = rc.request().getParam("encoding"); - if (encoding != null) { - rc.response().end("Received " + rc.getBodyAsString(encoding)); - } else { - rc.response().end("Received " + rc.getBodyAsString()); - } - }); - router - .route("/iast/sources/body/json") - .handler( - rc -> { - rc.response().end("Received " + rc.getBodyAsJson()); - }); - router - .route("/body/jsonArray") - .handler( - rc -> { - rc.response().end("Received " + rc.getBodyAsJsonArray()); - }); + router.route("/iast/sources/header").handler(rc -> { + final String value = rc.request().getHeader("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/headers").handler(rc -> { + final MultiMap value = rc.request().headers(); + rc.response().end("Received " + value.get("name")); + }); + router.route("/iast/sources/cookie").handler(rc -> { + final Cookie cookie = rc.getCookie("name"); + rc.response().end("Received " + cookie.getName() + " " + cookie.getValue()); + }); + router.route("/iast/sources/path/:name").handler(rc -> { + final String value = rc.pathParam("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/parameter").handler(rc -> { + final String value = rc.request().getParam("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/parameters").handler(rc -> { + final MultiMap value = rc.request().params(); + rc.response().end("Received " + value.get("name")); + }); + router.route("/iast/sources/form").handler(rc -> { + final String value = rc.request().getFormAttribute("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/body/string").handler(rc -> { + final String encoding = rc.request().getParam("encoding"); + if (encoding != null) { + rc.response().end("Received " + rc.getBodyAsString(encoding)); + } else { + rc.response().end("Received " + rc.getBodyAsString()); + } + }); + router.route("/iast/sources/body/json").handler(rc -> { + rc.response().end("Received " + rc.getBodyAsJson()); + }); + router.route("/body/jsonArray").handler(rc -> { + rc.response().end("Received " + rc.getBodyAsJsonArray()); + }); - router - .route("/iast/sources/eventBus") - .handler( - rc -> { - final JsonObject target = rc.getBodyAsJson(); - rc.vertx() - .eventBus() - .request( - EVENT_BUS_ENDPOINT, - target, - reply -> { - if (reply.succeeded()) { - rc.response().end(reply.result().body().toString()); - } else { - rc.fail(reply.cause()); - } - }); - }); - router - .route("/iast/vulnerabilities/insecureCookie") - .handler( - rc -> { - final String cookieName = rc.request().getParam("name"); - final String cookieValue = rc.request().getParam("value"); - final String secure = rc.request().getParam("secure"); - Cookie cookie = Cookie.cookie(cookieName, cookieValue); - if ("true".equals(secure)) { - cookie.setSecure(true); - } - rc.response().addCookie(cookie).end("Cookie Set"); - }); + router.route("/iast/sources/eventBus").handler(rc -> { + final JsonObject target = rc.getBodyAsJson(); + rc.vertx().eventBus().request(EVENT_BUS_ENDPOINT, target, reply -> { + if (reply.succeeded()) { + rc.response().end(reply.result().body().toString()); + } else { + rc.fail(reply.cause()); + } + }); + }); + router.route("/iast/vulnerabilities/insecureCookie").handler(rc -> { + final String cookieName = rc.request().getParam("name"); + final String cookieValue = rc.request().getParam("value"); + final String secure = rc.request().getParam("secure"); + Cookie cookie = Cookie.cookie(cookieName, cookieValue); + if ("true".equals(secure)) { + cookie.setSecure(true); + } + rc.response().addCookie(cookie).end("Cookie Set"); + }); final EventBus eventBus = vertx.eventBus(); - eventBus.consumer( - EVENT_BUS_ENDPOINT, - message -> { - final JsonObject payload = (JsonObject) message.body(); - final String name = payload.getString("name"); - try { - final IastContext ctx = IastContext.Provider.get(); - if (ctx == null) { - throw new IllegalStateException("No IAST context present"); - } - final TaintedObjects to = ctx.getTaintedObjects(); - final boolean tainted = to.get(name) != null; - message.reply(tainted ? "OK" : "NO_OK"); - } catch (Throwable e) { - LOGGER.error("Failed to handle event bus message", e); - message.reply("NO_OK"); - } - }); + eventBus.consumer(EVENT_BUS_ENDPOINT, message -> { + final JsonObject payload = (JsonObject) message.body(); + final String name = payload.getString("name"); + try { + final IastContext ctx = IastContext.Provider.get(); + if (ctx == null) { + throw new IllegalStateException("No IAST context present"); + } + final TaintedObjects to = ctx.getTaintedObjects(); + final boolean tainted = to.get(name) != null; + message.reply(tainted ? "OK" : "NO_OK"); + } catch (Throwable e) { + LOGGER.error("Failed to handle event bus message", e); + message.reply("NO_OK"); + } + }); final HttpServerOptions serverOptions = new HttpServerOptions(); if (config().getBoolean("https")) { @@ -163,18 +120,13 @@ public void start(final Promise startPromise) throws Exception { .createHttpServer(serverOptions) .requestHandler(router) .listen(0) - .onSuccess( - server -> - eventBus.request( - "PORT_DATA", - server.actualPort(), - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - })) + .onSuccess(server -> eventBus.request("PORT_DATA", server.actualPort(), ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + })) .onFailure(startPromise::fail); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/RouteHandlerExceptionHandlerTest.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/RouteHandlerExceptionHandlerTest.java index fb91f77a4b7..17c54957aa4 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/RouteHandlerExceptionHandlerTest.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/RouteHandlerExceptionHandlerTest.java @@ -48,33 +48,24 @@ static void startServer() throws Exception { vertx = Vertx.vertx(); Router router = Router.router(vertx); - router - .route("/fail") - .handler( - ctx -> { - ResponseExceptionFiringHelper.fireException( - ctx.response(), new IOException("simulated response I/O failure")); - try { - ctx.response().setStatusCode(500).end("error"); - } catch (IllegalStateException ignore) { - // handleException may have left the response in a state where end() is rejected; - // the span is already finished by our addEndHandler callback. - } - }); + router.route("/fail").handler(ctx -> { + ResponseExceptionFiringHelper.fireException( + ctx.response(), new IOException("simulated response I/O failure")); + try { + ctx.response().setStatusCode(500).end("error"); + } catch (IllegalStateException ignore) { + // handleException may have left the response in a state where end() is rejected; + // the span is already finished by our addEndHandler callback. + } + }); CountDownLatch ready = new CountDownLatch(1); - server = - vertx - .createHttpServer() - .requestHandler(router) - .listen( - port, - result -> { - if (result.failed()) { - throw new RuntimeException("Failed to start Vert.x server", result.cause()); - } - ready.countDown(); - }); + server = vertx.createHttpServer().requestHandler(router).listen(port, result -> { + if (result.failed()) { + throw new RuntimeException("Failed to start Vert.x server", result.cause()); + } + ready.countDown(); + }); if (!ready.await(10, TimeUnit.SECONDS)) { throw new IllegalStateException("Vert.x server did not start in time"); } @@ -115,16 +106,15 @@ void exceptionHandlerFinishesRouteHandlerSpan() throws Exception { // The netty.request span is marked as errored because the route handler ends with // HTTP 500; the route-handler span is finished by our addEndHandler callback before // setStatusCode(500), so it sees status=200 (default) and is not errored. - assertTraces( - trace( - SORT_BY_START_TIME, - span() - .operationName(Pattern.compile(Pattern.quote("netty.request"))) - .type(DDSpanTypes.HTTP_SERVER) - .error(), - span() - .childOfPrevious() - .operationName(Pattern.compile(Pattern.quote("vertx.route-handler"))) - .type(DDSpanTypes.HTTP_SERVER))); + assertTraces(trace( + SORT_BY_START_TIME, + span() + .operationName(Pattern.compile(Pattern.quote("netty.request"))) + .type(DDSpanTypes.HTTP_SERVER) + .error(), + span() + .childOfPrevious() + .operationName(Pattern.compile(Pattern.quote("vertx.route-handler"))) + .type(DDSpanTypes.HTTP_SERVER))); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/VertxTestServer.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/VertxTestServer.java index 53c8236ef78..b14bb9b3032 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/VertxTestServer.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/test/java/server/VertxTestServer.java @@ -48,153 +48,105 @@ public void start(final Promise startPromise) { router .route(SUCCESS.getPath()) - .handler( - ctx -> - controller( - ctx, - SUCCESS, - () -> - ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); + .handler(ctx -> controller( + ctx, + SUCCESS, + () -> ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); router .route(FORWARDED.getPath()) - .handler( - ctx -> - controller( - ctx, - FORWARDED, - () -> - ctx.response() - .setStatusCode(FORWARDED.getStatus()) - .end(ctx.request().getHeader("x-forwarded-for")))); + .handler(ctx -> controller( + ctx, + FORWARDED, + () -> ctx.response() + .setStatusCode(FORWARDED.getStatus()) + .end(ctx.request().getHeader("x-forwarded-for")))); router .route(CREATED.getPath()) - .handler( - ctx -> - controller( - ctx, - CREATED, - () -> - ctx.request() - .bodyHandler( - body -> - ctx.response() - .setStatusCode(CREATED.getStatus()) - .end(CREATED.getBody() + ": " + body.toString())))); + .handler(ctx -> controller( + ctx, + CREATED, + () -> ctx.request() + .bodyHandler(body -> ctx.response() + .setStatusCode(CREATED.getStatus()) + .end(CREATED.getBody() + ": " + body.toString())))); router.route(BODY_URLENCODED.getPath()).handler(BodyHandler.create()); router .route(BODY_URLENCODED.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_URLENCODED, - () -> { - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_URLENCODED, () -> { + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); + })); router.route(BODY_MULTIPART.getPath()).handler(BodyHandler.create()); router .route(BODY_MULTIPART.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_MULTIPART, - () -> { - ctx.fileUploads(); - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_MULTIPART, () -> { + ctx.fileUploads(); + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); + })); router.route(BODY_JSON.getPath()).handler(BodyHandler.create()); router .route(BODY_JSON.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_JSON, - () -> { - JsonObject json = ctx.getBodyAsJson(); - ctx.response().setStatusCode(BODY_JSON.getStatus()); - ctx.json(json); - })); + .handler(ctx -> controller(ctx, BODY_JSON, () -> { + JsonObject json = ctx.getBodyAsJson(); + ctx.response().setStatusCode(BODY_JSON.getStatus()); + ctx.json(json); + })); router .route(QUERY_ENCODED_BOTH.getRawPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_BOTH, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) - .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_BOTH, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) + .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); router .route(QUERY_ENCODED_QUERY.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_QUERY, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) - .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_QUERY, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) + .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); router .route(QUERY_PARAM.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_PARAM, - () -> - ctx.response() - .setStatusCode(QUERY_PARAM.getStatus()) - .end(ctx.request().query()))); + .handler(ctx -> controller( + ctx, + QUERY_PARAM, + () -> ctx.response() + .setStatusCode(QUERY_PARAM.getStatus()) + .end(ctx.request().query()))); router .route(USER_BLOCK.getPath()) - .handler( - ctx -> - controller( - ctx, - USER_BLOCK, - () -> { - Blocking.forUser("user-to-block").blockIfMatch(); - ctx.response().end("Should not be reached"); - })); + .handler(ctx -> controller(ctx, USER_BLOCK, () -> { + Blocking.forUser("user-to-block").blockIfMatch(); + ctx.response().end("Should not be reached"); + })); router .route("/path/:id/param") - .handler( - ctx -> - controller( - ctx, - PATH_PARAM, - () -> - ctx.response() - .setStatusCode(PATH_PARAM.getStatus()) - .end(ctx.request().getParam("id")))); + .handler(ctx -> controller( + ctx, + PATH_PARAM, + () -> ctx.response() + .setStatusCode(PATH_PARAM.getStatus()) + .end(ctx.request().getParam("id")))); router .route(REDIRECT.getPath()) - .handler( - ctx -> - controller( - ctx, - REDIRECT, - () -> - ctx.response() - .setStatusCode(REDIRECT.getStatus()) - .putHeader("location", REDIRECT.getBody()) - .end())); + .handler(ctx -> controller( + ctx, + REDIRECT, + () -> ctx.response() + .setStatusCode(REDIRECT.getStatus()) + .putHeader("location", REDIRECT.getBody()) + .end())); router .route(ERROR.getPath()) - .handler( - ctx -> - controller( - ctx, - ERROR, - () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); + .handler(ctx -> controller( + ctx, + ERROR, + () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); router .route(EXCEPTION.getPath()) .handler(ctx -> controller(ctx, EXCEPTION, VertxTestServer::exception)); @@ -204,32 +156,26 @@ public void start(final Promise startPromise) { .handler(SessionHandler.create(LocalSessionStore.create(vertx))); router .route(SESSION_ID.getPath()) - .handler( - ctx -> ctx.response().setStatusCode(SESSION_ID.getStatus()).end(ctx.session().id())); + .handler(ctx -> ctx.response() + .setStatusCode(SESSION_ID.getStatus()) + .end(ctx.session().id())); router = customizeAfterRoutes(router); vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) .requestHandler(router) - .listen( - port, - event -> { - // send this though event bus and succed deploy after successfull response - int actualPort = event.result().actualPort(); - vertx - .eventBus() - .request( - PORT_DATA_ADDRESS, - actualPort, - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - }); - }); + .listen(port, event -> { + // send this though event bus and succed deploy after successfull response + int actualPort = event.result().actualPort(); + vertx.eventBus().request(PORT_DATA_ADDRESS, actualPort, ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + }); + }); } private static String convertFormAttributes(RoutingContext ctx) { diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/FileUploadHelper.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/FileUploadHelper.java index 045d825444a..db27049a59b 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/FileUploadHelper.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/FileUploadHelper.java @@ -37,10 +37,9 @@ public static String readUploadContent(FileUpload upload, int maxBytes) { return ""; } String charSet = upload.charSet(); - String contentType = - charSet != null && !charSet.isEmpty() - ? upload.contentType() + "; charset=" + charSet - : upload.contentType(); + String contentType = charSet != null && !charSet.isEmpty() + ? upload.contentType() + "; charset=" + charSet + : upload.contentType(); try (FileInputStream fis = new FileInputStream(path)) { return MultipartContentDecoder.readInputStream(fis, maxBytes, contentType); } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextFilenamesAdvice.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextFilenamesAdvice.java index 189fd6cd0f7..267bae26430 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextFilenamesAdvice.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextFilenamesAdvice.java @@ -69,9 +69,8 @@ static void after( } if (filenamesCb != null && filenames != null) { - throwable = - FileUploadHelper.commitBlockingResponse( - filenamesCb, reqCtx, filenames, "Blocked request (multipart file upload)"); + throwable = FileUploadHelper.commitBlockingResponse( + filenamesCb, reqCtx, filenames, "Blocked request (multipart file upload)"); } if (throwable != null) { @@ -79,9 +78,8 @@ static void after( } if (contentCb != null && filesContent != null) { - throwable = - FileUploadHelper.commitBlockingResponse( - contentCb, reqCtx, filesContent, "Blocked request (file content)"); + throwable = FileUploadHelper.commitBlockingResponse( + contentCb, reqCtx, filesContent, "Blocked request (file content)"); } } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextImplInstrumentation.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextImplInstrumentation.java index 627d7798f9e..dbdd9dc79f0 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/RoutingContextImplInstrumentation.java @@ -12,13 +12,13 @@ public class RoutingContextImplInstrumentation extends InstrumenterModule.AppSec implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - private static final Reference FILE_UPLOAD_REF = - new Reference.Builder("io.vertx.ext.web.FileUpload") - .withMethod(new String[0], 0, "fileName", "Ljava/lang/String;") - .withMethod(new String[0], 0, "uploadedFileName", "Ljava/lang/String;") - .withMethod(new String[0], 0, "contentType", "Ljava/lang/String;") - .withMethod(new String[0], 0, "charSet", "Ljava/lang/String;") - .build(); + private static final Reference FILE_UPLOAD_REF = new Reference.Builder( + "io.vertx.ext.web.FileUpload") + .withMethod(new String[0], 0, "fileName", "Ljava/lang/String;") + .withMethod(new String[0], 0, "uploadedFileName", "Ljava/lang/String;") + .withMethod(new String[0], 0, "contentType", "Ljava/lang/String;") + .withMethod(new String[0], 0, "charSet", "Ljava/lang/String;") + .build(); public RoutingContextImplInstrumentation() { super("vertx", "vertx-5.0"); diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/HttpServerResponseEndHandlerInstrumentationTest.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/HttpServerResponseEndHandlerInstrumentationTest.java index 25201f3e872..6defc212647 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/HttpServerResponseEndHandlerInstrumentationTest.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/HttpServerResponseEndHandlerInstrumentationTest.java @@ -56,14 +56,13 @@ static void startServer() throws Exception { .createHttpServer(new HttpServerOptions().setHttp2ClearTextEnabled(true)) .requestHandler(router) .listen(port) - .andThen( - result -> { - if (result.failed()) { - throw new RuntimeException("Failed to start Vert.x server", result.cause()); - } - server = result.result(); - ready.countDown(); - }); + .andThen(result -> { + if (result.failed()) { + throw new RuntimeException("Failed to start Vert.x server", result.cause()); + } + server = result.result(); + ready.countDown(); + }); if (!ready.await(10, TimeUnit.SECONDS)) { throw new IllegalStateException("Vert.x server did not start in time"); } @@ -87,9 +86,8 @@ static void stopServer() throws Exception { void wrapsApplicationEndHandlerOnVertx51Http1Response() throws Exception { assumeTrue(hasVertx51Http1Response(), "Http1ServerResponse exists only in Vert.x 5.1+"); - HttpURLConnection conn = - (HttpURLConnection) - new URL("http://localhost:" + port + "/end-handler-wrapper").openConnection(); + HttpURLConnection conn = (HttpURLConnection) + new URL("http://localhost:" + port + "/end-handler-wrapper").openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); @@ -107,19 +105,16 @@ void wrapsApplicationEndHandlerOnVertx51Http1Response() throws Exception { void wrapsApplicationEndHandlerOnVertx51Http2Response() throws Exception { assumeTrue(hasVertx51Http2Response(), "HttpServerResponseImpl exists only in Vert.x 5.1+"); - HttpClient client = - vertx.createHttpClient( - new HttpClientOptions() - .setProtocolVersion(HttpVersion.HTTP_2) - .setHttp2ClearTextUpgrade(false)); + HttpClient client = vertx.createHttpClient(new HttpClientOptions() + .setProtocolVersion(HttpVersion.HTTP_2) + .setHttp2ClearTextUpgrade(false)); try { - HttpClientResponse response = - client - .request(HttpMethod.GET, port, "localhost", "/end-handler-wrapper") - .compose(request -> request.send()) - .toCompletionStage() - .toCompletableFuture() - .get(10, TimeUnit.SECONDS); + HttpClientResponse response = client + .request(HttpMethod.GET, port, "localhost", "/end-handler-wrapper") + .compose(request -> request.send()) + .toCompletionStage() + .toCompletableFuture() + .get(10, TimeUnit.SECONDS); Buffer body = response.body().toCompletionStage().toCompletableFuture().get(10, TimeUnit.SECONDS); diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSinksVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSinksVerticle.java index a518d274e99..7e77c908587 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSinksVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSinksVerticle.java @@ -14,28 +14,19 @@ public class IastSinksVerticle extends AbstractVerticle { public void start(final Promise startPromise) throws Exception { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - router - .route("/iast/sinks/reroute1") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(path); - }); - router - .route("/iast/sinks/reroute2") - .handler( - rc -> { - final String path = rc.request().getParam("path"); - rc.reroute(HttpMethod.GET, path); - }); - router - .route("/iast/sinks/redirectheader") - .handler( - rc -> { - final String name = rc.request().getParam("name"); - final String value = rc.request().getParam("value"); - rc.response().putHeader(name, value).end(); - }); + router.route("/iast/sinks/reroute1").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(path); + }); + router.route("/iast/sinks/reroute2").handler(rc -> { + final String path = rc.request().getParam("path"); + rc.reroute(HttpMethod.GET, path); + }); + router.route("/iast/sinks/redirectheader").handler(rc -> { + final String name = rc.request().getParam("name"); + final String value = rc.request().getParam("value"); + rc.response().putHeader(name, value).end(); + }); final EventBus eventBus = vertx.eventBus(); final HttpServerOptions serverOptions = new HttpServerOptions(); @@ -44,18 +35,13 @@ public void start(final Promise startPromise) throws Exception { .createHttpServer(serverOptions) .requestHandler(router) .listen(0) - .onSuccess( - server -> - eventBus - .request("PORT_DATA", server.actualPort()) - .andThen( - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - })) + .onSuccess(server -> eventBus.request("PORT_DATA", server.actualPort()).andThen(ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + })) .onFailure(startPromise::fail); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSourcesVerticle.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSourcesVerticle.java index 35cef8bc955..5eb37d67bf7 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSourcesVerticle.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/IastSourcesVerticle.java @@ -25,129 +25,87 @@ public class IastSourcesVerticle extends AbstractVerticle { public void start(final Promise startPromise) throws Exception { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - router - .route("/iast/sources/header") - .handler( - rc -> { - final String value = rc.request().getHeader("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/headers") - .handler( - rc -> { - final MultiMap value = rc.request().headers(); - rc.response().end("Received " + value.get("name")); - }); - router - .route("/iast/sources/cookie") - .handler( - rc -> { - final Cookie cookie = rc.request().getCookie("name"); - rc.response().end("Received " + cookie.getName() + " " + cookie.getValue()); - }); - router - .route("/iast/sources/path/:name") - .handler( - rc -> { - final String value = rc.pathParam("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/parameter") - .handler( - rc -> { - final String value = rc.request().getParam("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/parameters") - .handler( - rc -> { - final MultiMap value = rc.request().params(); - rc.response().end("Received " + value.get("name")); - }); - router - .route("/iast/sources/form") - .handler( - rc -> { - final String value = rc.request().getFormAttribute("name"); - rc.response().end("Received " + value); - }); - router - .route("/iast/sources/body/string") - .handler( - rc -> { - final String encoding = rc.request().getParam("encoding"); - if (encoding != null) { - rc.response().end("Received " + rc.body().asString(encoding)); - } else { - rc.response().end("Received " + rc.body().asString()); - } - }); - router - .route("/iast/sources/body/json") - .handler( - rc -> { - rc.response().end("Received " + rc.body().asJsonObject()); - }); - router - .route("/body/jsonArray") - .handler( - rc -> { - rc.response().end("Received " + rc.body().asJsonArray()); - }); + router.route("/iast/sources/header").handler(rc -> { + final String value = rc.request().getHeader("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/headers").handler(rc -> { + final MultiMap value = rc.request().headers(); + rc.response().end("Received " + value.get("name")); + }); + router.route("/iast/sources/cookie").handler(rc -> { + final Cookie cookie = rc.request().getCookie("name"); + rc.response().end("Received " + cookie.getName() + " " + cookie.getValue()); + }); + router.route("/iast/sources/path/:name").handler(rc -> { + final String value = rc.pathParam("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/parameter").handler(rc -> { + final String value = rc.request().getParam("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/parameters").handler(rc -> { + final MultiMap value = rc.request().params(); + rc.response().end("Received " + value.get("name")); + }); + router.route("/iast/sources/form").handler(rc -> { + final String value = rc.request().getFormAttribute("name"); + rc.response().end("Received " + value); + }); + router.route("/iast/sources/body/string").handler(rc -> { + final String encoding = rc.request().getParam("encoding"); + if (encoding != null) { + rc.response().end("Received " + rc.body().asString(encoding)); + } else { + rc.response().end("Received " + rc.body().asString()); + } + }); + router.route("/iast/sources/body/json").handler(rc -> { + rc.response().end("Received " + rc.body().asJsonObject()); + }); + router.route("/body/jsonArray").handler(rc -> { + rc.response().end("Received " + rc.body().asJsonArray()); + }); - router - .route("/iast/sources/eventBus") - .handler( - rc -> { - final JsonObject target = rc.body().asJsonObject(); - rc.vertx() - .eventBus() - .request(EVENT_BUS_ENDPOINT, target) - .andThen( - reply -> { - if (reply.succeeded()) { - rc.response().end(reply.result().body().toString()); - } else { - rc.fail(reply.cause()); - } - }); - }); - router - .route("/iast/vulnerabilities/insecureCookie") - .handler( - rc -> { - final String cookieName = rc.request().getParam("name"); - final String cookieValue = rc.request().getParam("value"); - final String secure = rc.request().getParam("secure"); - Cookie cookie = Cookie.cookie(cookieName, cookieValue); - if ("true".equals(secure)) { - cookie.setSecure(true); - } - rc.response().addCookie(cookie).end("Cookie Set"); - }); + router.route("/iast/sources/eventBus").handler(rc -> { + final JsonObject target = rc.body().asJsonObject(); + rc.vertx().eventBus().request(EVENT_BUS_ENDPOINT, target).andThen(reply -> { + if (reply.succeeded()) { + rc.response().end(reply.result().body().toString()); + } else { + rc.fail(reply.cause()); + } + }); + }); + router.route("/iast/vulnerabilities/insecureCookie").handler(rc -> { + final String cookieName = rc.request().getParam("name"); + final String cookieValue = rc.request().getParam("value"); + final String secure = rc.request().getParam("secure"); + Cookie cookie = Cookie.cookie(cookieName, cookieValue); + if ("true".equals(secure)) { + cookie.setSecure(true); + } + rc.response().addCookie(cookie).end("Cookie Set"); + }); final EventBus eventBus = vertx.eventBus(); - eventBus.consumer( - EVENT_BUS_ENDPOINT, - message -> { - final JsonObject payload = (JsonObject) message.body(); - final String name = payload.getString("name"); - try { - final IastContext ctx = IastContext.Provider.get(); - if (ctx == null) { - throw new IllegalStateException("No IAST context present"); - } - final TaintedObjects to = ctx.getTaintedObjects(); - final boolean tainted = to.get(name) != null; - message.reply(tainted ? "OK" : "NO_OK"); - } catch (Throwable e) { - LOGGER.error("Failed to handle event bus message", e); - message.reply("NO_OK"); - } - }); + eventBus.consumer(EVENT_BUS_ENDPOINT, message -> { + final JsonObject payload = (JsonObject) message.body(); + final String name = payload.getString("name"); + try { + final IastContext ctx = IastContext.Provider.get(); + if (ctx == null) { + throw new IllegalStateException("No IAST context present"); + } + final TaintedObjects to = ctx.getTaintedObjects(); + final boolean tainted = to.get(name) != null; + message.reply(tainted ? "OK" : "NO_OK"); + } catch (Throwable e) { + LOGGER.error("Failed to handle event bus message", e); + message.reply("NO_OK"); + } + }); final HttpServerOptions serverOptions = new HttpServerOptions(); if (config().getBoolean("https")) { @@ -162,18 +120,13 @@ public void start(final Promise startPromise) throws Exception { .createHttpServer(serverOptions) .requestHandler(router) .listen(0) - .onSuccess( - server -> - eventBus - .request("PORT_DATA", server.actualPort()) - .andThen( - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - })) + .onSuccess(server -> eventBus.request("PORT_DATA", server.actualPort()).andThen(ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + })) .onFailure(startPromise::fail); } } diff --git a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/VertxTestServer.java b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/VertxTestServer.java index 24902867163..1e60a25e84d 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/VertxTestServer.java +++ b/dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/test/java/server/VertxTestServer.java @@ -48,153 +48,105 @@ public void start(final Promise startPromise) { router .route(SUCCESS.getPath()) - .handler( - ctx -> - controller( - ctx, - SUCCESS, - () -> - ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); + .handler(ctx -> controller( + ctx, + SUCCESS, + () -> ctx.response().setStatusCode(SUCCESS.getStatus()).end(SUCCESS.getBody()))); router .route(FORWARDED.getPath()) - .handler( - ctx -> - controller( - ctx, - FORWARDED, - () -> - ctx.response() - .setStatusCode(FORWARDED.getStatus()) - .end(ctx.request().getHeader("x-forwarded-for")))); + .handler(ctx -> controller( + ctx, + FORWARDED, + () -> ctx.response() + .setStatusCode(FORWARDED.getStatus()) + .end(ctx.request().getHeader("x-forwarded-for")))); router .route(CREATED.getPath()) - .handler( - ctx -> - controller( - ctx, - CREATED, - () -> - ctx.request() - .bodyHandler( - body -> - ctx.response() - .setStatusCode(CREATED.getStatus()) - .end(CREATED.getBody() + ": " + body.toString())))); + .handler(ctx -> controller( + ctx, + CREATED, + () -> ctx.request() + .bodyHandler(body -> ctx.response() + .setStatusCode(CREATED.getStatus()) + .end(CREATED.getBody() + ": " + body.toString())))); router.route(BODY_URLENCODED.getPath()).handler(BodyHandler.create()); router .route(BODY_URLENCODED.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_URLENCODED, - () -> { - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_URLENCODED, () -> { + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_URLENCODED.getStatus()).end(res); + })); router.route(BODY_MULTIPART.getPath()).handler(BodyHandler.create()); router .route(BODY_MULTIPART.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_MULTIPART, - () -> { - ctx.fileUploads(); - String res = convertFormAttributes(ctx); - ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); - })); + .handler(ctx -> controller(ctx, BODY_MULTIPART, () -> { + ctx.fileUploads(); + String res = convertFormAttributes(ctx); + ctx.response().setStatusCode(BODY_MULTIPART.getStatus()).end(res); + })); router.route(BODY_JSON.getPath()).handler(BodyHandler.create()); router .route(BODY_JSON.getPath()) - .handler( - ctx -> - controller( - ctx, - BODY_JSON, - () -> { - JsonObject json = ctx.body().asJsonObject(); - ctx.response().setStatusCode(BODY_JSON.getStatus()); - ctx.json(json); - })); + .handler(ctx -> controller(ctx, BODY_JSON, () -> { + JsonObject json = ctx.body().asJsonObject(); + ctx.response().setStatusCode(BODY_JSON.getStatus()); + ctx.json(json); + })); router .route(QUERY_ENCODED_BOTH.getRawPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_BOTH, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) - .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_BOTH, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_BOTH.getStatus()) + .end(QUERY_ENCODED_BOTH.bodyForQuery(ctx.request().query())))); router .route(QUERY_ENCODED_QUERY.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_ENCODED_QUERY, - () -> - ctx.response() - .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) - .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); + .handler(ctx -> controller( + ctx, + QUERY_ENCODED_QUERY, + () -> ctx.response() + .setStatusCode(QUERY_ENCODED_QUERY.getStatus()) + .end(QUERY_ENCODED_QUERY.bodyForQuery(ctx.request().query())))); router .route(QUERY_PARAM.getPath()) - .handler( - ctx -> - controller( - ctx, - QUERY_PARAM, - () -> - ctx.response() - .setStatusCode(QUERY_PARAM.getStatus()) - .end(ctx.request().query()))); + .handler(ctx -> controller( + ctx, + QUERY_PARAM, + () -> ctx.response() + .setStatusCode(QUERY_PARAM.getStatus()) + .end(ctx.request().query()))); router .route(USER_BLOCK.getPath()) - .handler( - ctx -> - controller( - ctx, - USER_BLOCK, - () -> { - Blocking.forUser("user-to-block").blockIfMatch(); - ctx.response().end("Should not be reached"); - })); + .handler(ctx -> controller(ctx, USER_BLOCK, () -> { + Blocking.forUser("user-to-block").blockIfMatch(); + ctx.response().end("Should not be reached"); + })); router .route("/path/:id/param") - .handler( - ctx -> - controller( - ctx, - PATH_PARAM, - () -> - ctx.response() - .setStatusCode(PATH_PARAM.getStatus()) - .end(ctx.request().getParam("id")))); + .handler(ctx -> controller( + ctx, + PATH_PARAM, + () -> ctx.response() + .setStatusCode(PATH_PARAM.getStatus()) + .end(ctx.request().getParam("id")))); router .route(REDIRECT.getPath()) - .handler( - ctx -> - controller( - ctx, - REDIRECT, - () -> - ctx.response() - .setStatusCode(REDIRECT.getStatus()) - .putHeader("location", REDIRECT.getBody()) - .end())); + .handler(ctx -> controller( + ctx, + REDIRECT, + () -> ctx.response() + .setStatusCode(REDIRECT.getStatus()) + .putHeader("location", REDIRECT.getBody()) + .end())); router .route(ERROR.getPath()) - .handler( - ctx -> - controller( - ctx, - ERROR, - () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); + .handler(ctx -> controller( + ctx, + ERROR, + () -> ctx.response().setStatusCode(ERROR.getStatus()).end(ERROR.getBody()))); router .route(EXCEPTION.getPath()) .handler(ctx -> controller(ctx, EXCEPTION, VertxTestServer::exception)); @@ -204,8 +156,9 @@ public void start(final Promise startPromise) { .handler(SessionHandler.create(LocalSessionStore.create(vertx))); router .route(SESSION_ID.getPath()) - .handler( - ctx -> ctx.response().setStatusCode(SESSION_ID.getStatus()).end(ctx.session().id())); + .handler(ctx -> ctx.response() + .setStatusCode(SESSION_ID.getStatus()) + .end(ctx.session().id())); router = customizeAfterRoutes(router); @@ -213,22 +166,17 @@ public void start(final Promise startPromise) { .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) .requestHandler(router) .listen(port) - .andThen( - event -> { - // send this though event bus and succeed deploy after successful response - int actualPort = event.result().actualPort(); - vertx - .eventBus() - .request(PORT_DATA_ADDRESS, actualPort) - .andThen( - ar -> { - if (ar.succeeded()) { - startPromise.complete(); - } else { - startPromise.fail(ar.cause()); - } - }); - }); + .andThen(event -> { + // send this though event bus and succeed deploy after successful response + int actualPort = event.result().actualPort(); + vertx.eventBus().request(PORT_DATA_ADDRESS, actualPort).andThen(ar -> { + if (ar.succeeded()) { + startPromise.complete(); + } else { + startPromise.fail(ar.cause()); + } + }); + }); } private static String convertFormAttributes(RoutingContext ctx) { diff --git a/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/DatadogWeaverReporter.java b/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/DatadogWeaverReporter.java index aaf35631118..557f54633b5 100644 --- a/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/DatadogWeaverReporter.java +++ b/dd-java-agent/instrumentation/weaver-0.9/src/main/java/datadog/trace/instrumentation/weaver/DatadogWeaverReporter.java @@ -35,9 +35,8 @@ public class DatadogWeaverReporter { "Reporter class not exposed to application code; locking on its Class is safe") public static synchronized void start() { if (TEST_EVENTS_HANDLER == null) { - TEST_EVENTS_HANDLER = - InstrumentationBridge.createTestEventsHandler( - "weaver", null, null, WeaverUtils.CAPABILITIES); + TEST_EVENTS_HANDLER = InstrumentationBridge.createTestEventsHandler( + "weaver", null, null, WeaverUtils.CAPABILITIES); } } @@ -129,9 +128,8 @@ public static void onTestFinished(TestFinished event, TaskDef taskDef) { if (testOutcome.result() != null) { // Failed outcomes if (WeaverUtils.isResultFailure(testOutcome.result())) { - Object source = - WeaverUtils.METHOD_HANDLES.invoke( - WeaverUtils.GET_FAILURE_SOURCE_HANDLE, testOutcome.result()); + Object source = WeaverUtils.METHOD_HANDLES.invoke( + WeaverUtils.GET_FAILURE_SOURCE_HANDLE, testOutcome.result()); Throwable throwable = WeaverUtils.toThrowable(source); TEST_EVENTS_HANDLER.onTestFailure(testDescriptor, throwable); } else if (testOutcome.result() instanceof Result.Failures) { @@ -149,16 +147,14 @@ public static void onTestFinished(TestFinished event, TaskDef taskDef) { // Skipped outcomes } else if (testOutcome.result() instanceof Result.Ignored) { Result.Ignored result = (Result.Ignored) testOutcome.result(); - String reason = - WeaverUtils.unwrap( - WeaverUtils.METHOD_HANDLES.invoke( - WeaverUtils.GET_IGNORED_REASON_HANDLE, testOutcome.result()), - String.class); + String reason = WeaverUtils.unwrap( + WeaverUtils.METHOD_HANDLES.invoke( + WeaverUtils.GET_IGNORED_REASON_HANDLE, testOutcome.result()), + String.class); TEST_EVENTS_HANDLER.onTestSkip(testDescriptor, reason); } else if (WeaverUtils.isResultCancelled(testOutcome.result())) { - Option reason = - WeaverUtils.METHOD_HANDLES.invoke( - WeaverUtils.GET_CANCELLED_REASON_HANDLE, testOutcome.result()); + Option reason = WeaverUtils.METHOD_HANDLES.invoke( + WeaverUtils.GET_CANCELLED_REASON_HANDLE, testOutcome.result()); TEST_EVENTS_HANDLER.onTestSkip(testDescriptor, reason.getOrElse(null)); } } diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/AsyncRemoteEndpointInstrumentation.java b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/AsyncRemoteEndpointInstrumentation.java index 575d7a8cded..edf3d1d7550 100644 --- a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/AsyncRemoteEndpointInstrumentation.java +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/AsyncRemoteEndpointInstrumentation.java @@ -48,31 +48,25 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isPublic() .and(named("sendText")) - .and( - takesArguments(1) - .or( - takesArguments(2) - .and(takesArgument(1, named(namespace + ".websocket.SendHandler"))))) + .and(takesArguments(1) + .or(takesArguments(2) + .and(takesArgument(1, named(namespace + ".websocket.SendHandler"))))) .and(takesArgument(0, named("java.lang.String"))), getClass().getName() + "$SendTextAdvice"); transformer.applyAdvice( isPublic() .and(named("sendBinary")) - .and( - takesArguments(1) - .or( - takesArguments(2) - .and(takesArgument(1, named(namespace + ".websocket.SendHandler"))))) + .and(takesArguments(1) + .or(takesArguments(2) + .and(takesArgument(1, named(namespace + ".websocket.SendHandler"))))) .and(takesArgument(0, named("java.nio.ByteBuffer"))), getClass().getName() + "$SendBinaryAdvice"); transformer.applyAdvice( isPublic() .and(named("sendObject")) - .and( - takesArguments(1) - .or( - takesArguments(2) - .and(takesArgument(1, named(namespace + ".websocket.SendHandler"))))), + .and(takesArguments(1) + .or(takesArguments(2) + .and(takesArgument(1, named(namespace + ".websocket.SendHandler"))))), getClass().getName() + "$SendObjectAdvice"); } @@ -88,18 +82,17 @@ public static AgentScope before( typing = Assigner.Typing.DYNAMIC) SendHandler sendHandler, @Advice.Local("handlerContext") HandlerContext.Sender handlerContext) { - handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + handlerContext = InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext == null || CallDepthThreadLocalMap.incrementCallDepth(RemoteEndpoint.class) > 0) { return null; } - final AgentSpan wsSpan = - DECORATE.startOutboundFrameSpan( - handlerContext, - CHAR_SEQUENCE_SIZE_CALCULATOR.getFormat(), - CHAR_SEQUENCE_SIZE_CALCULATOR.getLengthFunction().applyAsInt(text)); + final AgentSpan wsSpan = DECORATE.startOutboundFrameSpan( + handlerContext, + CHAR_SEQUENCE_SIZE_CALCULATOR.getFormat(), + CHAR_SEQUENCE_SIZE_CALCULATOR.getLengthFunction().applyAsInt(text)); if (sendHandler != null) { sendHandler = new TracingSendHandler(sendHandler, handlerContext); } @@ -145,18 +138,17 @@ public static AgentScope before( typing = Assigner.Typing.DYNAMIC) SendHandler sendHandler, @Advice.Local("handlerContext") HandlerContext.Sender handlerContext) { - handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + handlerContext = InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext == null || CallDepthThreadLocalMap.incrementCallDepth(RemoteEndpoint.class) > 0) { return null; } - final AgentSpan wsSpan = - DECORATE.startOutboundFrameSpan( - handlerContext, - BYTE_BUFFER_SIZE_CALCULATOR.getFormat(), - BYTE_BUFFER_SIZE_CALCULATOR.getLengthFunction().applyAsInt(buffer)); + final AgentSpan wsSpan = DECORATE.startOutboundFrameSpan( + handlerContext, + BYTE_BUFFER_SIZE_CALCULATOR.getFormat(), + BYTE_BUFFER_SIZE_CALCULATOR.getLengthFunction().applyAsInt(buffer)); if (sendHandler != null) { sendHandler = new TracingSendHandler(sendHandler, handlerContext); } @@ -201,16 +193,15 @@ public static AgentScope before( typing = Assigner.Typing.DYNAMIC) SendHandler sendHandler, @Advice.Local("handlerContext") HandlerContext.Sender handlerContext) { - handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + handlerContext = InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext == null || CallDepthThreadLocalMap.incrementCallDepth(RemoteEndpoint.class) > 0) { return null; } - final AgentSpan wsSpan = - DECORATE.startOutboundFrameSpan( - handlerContext, BYTE_BUFFER_SIZE_CALCULATOR.getFormat(), 0); + final AgentSpan wsSpan = DECORATE.startOutboundFrameSpan( + handlerContext, BYTE_BUFFER_SIZE_CALCULATOR.getFormat(), 0); if (sendHandler != null) { sendHandler = new TracingSendHandler(sendHandler, handlerContext); } diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/BasicRemoteEndpointInstrumentation.java b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/BasicRemoteEndpointInstrumentation.java index 04c3fc1c8d6..15c7c30116e 100644 --- a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/BasicRemoteEndpointInstrumentation.java +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/BasicRemoteEndpointInstrumentation.java @@ -77,18 +77,17 @@ public static AgentScope before( @Advice.This final RemoteEndpoint.Basic self, @Advice.Argument(0) String text, @Advice.Local("handlerContext") HandlerContext.Sender handlerContext) { - handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + handlerContext = InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext == null || CallDepthThreadLocalMap.incrementCallDepth(RemoteEndpoint.class) > 0) { return null; } - final AgentSpan wsSpan = - DECORATE.startOutboundFrameSpan( - handlerContext, - CHAR_SEQUENCE_SIZE_CALCULATOR.getFormat(), - CHAR_SEQUENCE_SIZE_CALCULATOR.getLengthFunction().applyAsInt(text)); + final AgentSpan wsSpan = DECORATE.startOutboundFrameSpan( + handlerContext, + CHAR_SEQUENCE_SIZE_CALCULATOR.getFormat(), + CHAR_SEQUENCE_SIZE_CALCULATOR.getLengthFunction().applyAsInt(text)); return activateSpan(wsSpan); } @@ -118,18 +117,17 @@ public static AgentScope before( @Advice.This final RemoteEndpoint.Basic self, @Advice.Argument(0) ByteBuffer buffer, @Advice.Local("handlerContext") HandlerContext.Sender handlerContext) { - handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + handlerContext = InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext == null || CallDepthThreadLocalMap.incrementCallDepth(RemoteEndpoint.class) > 0) { return null; } - final AgentSpan wsSpan = - DECORATE.startOutboundFrameSpan( - handlerContext, - BYTE_BUFFER_SIZE_CALCULATOR.getFormat(), - BYTE_BUFFER_SIZE_CALCULATOR.getLengthFunction().applyAsInt(buffer)); + final AgentSpan wsSpan = DECORATE.startOutboundFrameSpan( + handlerContext, + BYTE_BUFFER_SIZE_CALCULATOR.getFormat(), + BYTE_BUFFER_SIZE_CALCULATOR.getLengthFunction().applyAsInt(buffer)); return activateSpan(wsSpan); } @@ -157,8 +155,8 @@ public static class SendObjectAdvice { public static AgentScope before( @Advice.This final RemoteEndpoint.Basic self, @Advice.Local("handlerContext") HandlerContext.Sender handlerContext) { - handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + handlerContext = InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext == null || CallDepthThreadLocalMap.incrementCallDepth(RemoteEndpoint.class) > 0) { return null; @@ -195,8 +193,9 @@ public static void after( if (writer instanceof TracingWriter) { return; } - final HandlerContext.Sender handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + final HandlerContext.Sender handlerContext = InstrumentationContext.get( + RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext != null) { writer = new TracingWriter(writer, handlerContext); } @@ -211,8 +210,9 @@ public static void after( if (outputStream instanceof TracingOutputStream) { return; } - final HandlerContext.Sender handlerContext = - InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class).get(self); + final HandlerContext.Sender handlerContext = InstrumentationContext.get( + RemoteEndpoint.class, HandlerContext.Sender.class) + .get(self); if (handlerContext != null) { outputStream = new TracingOutputStream(outputStream, handlerContext); } diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/EndpointInstrumentation.java b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/EndpointInstrumentation.java index ef50904e530..871328db23d 100644 --- a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/EndpointInstrumentation.java +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/EndpointInstrumentation.java @@ -43,18 +43,16 @@ public ElementMatcher hierarchyMatcher() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isPublic() - .and( - named("onOpen") - .and(takesArguments(2)) - .and(takesArgument(0, named(namespace + ".websocket.Session")))), + .and(named("onOpen") + .and(takesArguments(2)) + .and(takesArgument(0, named(namespace + ".websocket.Session")))), getClass().getName() + "$CaptureHandshakeSpanAdvice"); transformer.applyAdvice( isPublic() - .and( - named("onClose") - .and(takesArguments(2)) - .and(takesArgument(0, named(namespace + ".websocket.Session"))) - .and(takesArgument(1, named(namespace + ".websocket.CloseReason")))), + .and(named("onClose") + .and(takesArguments(2)) + .and(takesArgument(0, named(namespace + ".websocket.Session"))) + .and(takesArgument(1, named(namespace + ".websocket.CloseReason")))), getClass().getName() + "$SessionCloseAdvice"); } @@ -88,9 +86,10 @@ public static AgentScope onEnter( handlerContext = new HandlerContext.Receiver(sessionState.getHandshakeSpan(), session.getId()); - return activateSpan( - DECORATE.startInboundCloseSpan( - handlerContext, closeReason.getReasonPhrase(), closeReason.getCloseCode().getCode())); + return activateSpan(DECORATE.startInboundCloseSpan( + handlerContext, + closeReason.getReasonPhrase(), + closeReason.getCloseCode().getCode())); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/MessageHandlerInstrumentation.java b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/MessageHandlerInstrumentation.java index 846955c332c..103e87f15e3 100644 --- a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/MessageHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/MessageHandlerInstrumentation.java @@ -43,9 +43,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isPublic() .and(named("onMessage")) - .and( - takesArguments(1) // whole - .or(takesArguments(2).and(takesArgument(1, boolean.class)))), // partial + .and(takesArguments(1) // whole + .or(takesArguments(2).and(takesArgument(1, boolean.class)))), // partial getClass().getName() + "$OnMessageAdvice"); } @@ -56,9 +55,9 @@ public static AgentScope onEnter( @Advice.Argument(value = 0, typing = Assigner.Typing.DYNAMIC) final Object data, @Advice.Argument(value = 1, optional = true) final Boolean last, @Advice.Local("handlerContext") HandlerContext.Receiver handlerContext) { - handlerContext = - InstrumentationContext.get(MessageHandler.class, HandlerContext.Receiver.class) - .get(handler); + handlerContext = InstrumentationContext.get( + MessageHandler.class, HandlerContext.Receiver.class) + .get(handler); if (handlerContext == null) { return null; } diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/SessionInstrumentation.java b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/SessionInstrumentation.java index b8ceed2f78d..8ed85b5a588 100644 --- a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/SessionInstrumentation.java +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/SessionInstrumentation.java @@ -44,21 +44,18 @@ public ElementMatcher hierarchyMatcher() { public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isPublic() - .and( - named("addMessageHandler") - .and(takesArgument(0, named(namespace + ".websocket.MessageHandler")))), + .and(named("addMessageHandler") + .and(takesArgument(0, named(namespace + ".websocket.MessageHandler")))), getClass().getName() + "$LinkReceiverSessionArg0Advice"); transformer.applyAdvice( isPublic() - .and( - named("addMessageHandler") - .and( - takesArgument( - 1, - namedOneOf( - namespace + ".websocket.MessageHandler$Whole", - namespace + ".websocket.MessageHandler$Partial")))), + .and(named("addMessageHandler") + .and(takesArgument( + 1, + namedOneOf( + namespace + ".websocket.MessageHandler$Whole", + namespace + ".websocket.MessageHandler$Partial")))), getClass().getName() + "$LinkReceiverSessionArg1Advice"); transformer.applyAdvice( @@ -68,9 +65,8 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( isPublic() .and(named("close")) - .and( - takesArguments(1) - .and(takesArgument(0, named(namespace + ".websocket.CloseReason")))), + .and(takesArguments(1) + .and(takesArgument(0, named(namespace + ".websocket.CloseReason")))), getClass().getName() + "$SessionCloseAdvice"); transformer.applyAdvice( @@ -83,8 +79,9 @@ public static class LinkReceiverSessionArg0Advice { public static void onExit( @Advice.This final Session session, @Advice.Argument(0) final MessageHandler handler) { if (handler != null) { - final HandlerContext.Sender sessionState = - InstrumentationContext.get(Session.class, HandlerContext.Sender.class).get(session); + final HandlerContext.Sender sessionState = InstrumentationContext.get( + Session.class, HandlerContext.Sender.class) + .get(session); if (sessionState != null) { // If the user is adding singletons that is not going to work. However, in this case there // is no chance to have the session linked in any way (even if wrapping the @@ -109,8 +106,9 @@ public static class LinkReceiverSessionArg1Advice { public static void onExit( @Advice.This final Session session, @Advice.Argument(1) final MessageHandler handler) { if (handler != null) { - final HandlerContext.Sender sessionState = - InstrumentationContext.get(Session.class, HandlerContext.Sender.class).get(session); + final HandlerContext.Sender sessionState = InstrumentationContext.get( + Session.class, HandlerContext.Sender.class) + .get(session); if (sessionState != null) { // If the user is adding singletons that is not going to work. However, in this case there // is no chance to have the session linked in any way (even if wrapping the @@ -135,8 +133,9 @@ public static class LinkSenderSessionAdvice { public static void onExit( @Advice.This final Session session, @Advice.Return final RemoteEndpoint remoteEndpoint) { if (remoteEndpoint != null) { - final HandlerContext.Sender sessionState = - InstrumentationContext.get(Session.class, HandlerContext.Sender.class).get(session); + final HandlerContext.Sender sessionState = InstrumentationContext.get( + Session.class, HandlerContext.Sender.class) + .get(session); if (sessionState != null) { InstrumentationContext.get(RemoteEndpoint.class, HandlerContext.Sender.class) .put(remoteEndpoint, sessionState); @@ -156,9 +155,8 @@ public static AgentScope before( if (handlerContext == null) { return null; } - return activateSpan( - DECORATE.startOutboundCloseSpan( - handlerContext, reason.getReasonPhrase(), reason.getCloseCode().getCode())); + return activateSpan(DECORATE.startOutboundCloseSpan( + handlerContext, reason.getReasonPhrase(), reason.getCloseCode().getCode())); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingOutputStream.java b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingOutputStream.java index 7ae4d5416c0..74dbf6193b5 100644 --- a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingOutputStream.java +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingOutputStream.java @@ -53,10 +53,9 @@ public void write(byte[] b, int off, int len) throws IOException { @Override public void close() throws IOException { final boolean doTrace = CallDepthThreadLocalMap.incrementCallDepth(HandlerContext.class) == 0; - try (final ContextScope ignored = - handlerContext.getWebsocketSpan() != null - ? activateSpan(handlerContext.getWebsocketSpan()) - : null) { + try (final ContextScope ignored = handlerContext.getWebsocketSpan() != null + ? activateSpan(handlerContext.getWebsocketSpan()) + : null) { delegate.close(); } finally { if (doTrace) { diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingWriter.java b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingWriter.java index 32f0fd236d0..0892439d883 100644 --- a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingWriter.java +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/src/main/java/datadog/trace/instrumentation/websocket/jsr256/TracingWriter.java @@ -43,10 +43,9 @@ public void flush() throws IOException { @Override public void close() throws IOException { final boolean doTrace = CallDepthThreadLocalMap.incrementCallDepth(HandlerContext.class) == 0; - try (final ContextScope ignored = - handlerContext.getWebsocketSpan() != null - ? activateSpan(handlerContext.getWebsocketSpan()) - : null) { + try (final ContextScope ignored = handlerContext.getWebsocketSpan() != null + ? activateSpan(handlerContext.getWebsocketSpan()) + : null) { delegate.close(); } finally { if (doTrace) { diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/MethodHandleWrappers.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/MethodHandleWrappers.java index 7219b6f0ce9..468f771a75a 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/MethodHandleWrappers.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/MethodHandleWrappers.java @@ -35,31 +35,31 @@ public class MethodHandleWrappers { * context and the original parameter jetty is already binding (the session and the endpoint * config) */ - public static final MethodHandle OPEN_METHOD_HANDLE = - new MethodHandles(MethodHandleWrappers.class.getClassLoader()) - .method( - MethodHandleWrappers.class, - "onOpen", - MethodHandle.class, - ContextStore.class, - ContextStore.class, - JavaxWebSocketSession.class, - EndpointConfig.class); + public static final MethodHandle OPEN_METHOD_HANDLE = new MethodHandles( + MethodHandleWrappers.class.getClassLoader()) + .method( + MethodHandleWrappers.class, + "onOpen", + MethodHandle.class, + ContextStore.class, + ContextStore.class, + JavaxWebSocketSession.class, + EndpointConfig.class); /** * OnClose method handles that takes more arguments comparing to the original. We inject at the * beginning the origin alto delegate the call, the context stores we need to lookup the handler * context and the original parameter jetty is already binding (the session and the close reason) */ - public static final MethodHandle CLOSE_METHOD_HANDLE = - new MethodHandles(MethodHandleWrappers.class.getClassLoader()) - .method( - MethodHandleWrappers.class, - "onClose", - MethodHandle.class, - ContextStore.class, - Session.class, - CloseReason.class); + public static final MethodHandle CLOSE_METHOD_HANDLE = new MethodHandles( + MethodHandleWrappers.class.getClassLoader()) + .method( + MethodHandleWrappers.class, + "onClose", + MethodHandle.class, + ContextStore.class, + Session.class, + CloseReason.class); /** * OnMessage method handles that takes more arguments comparing to the original. We inject at the @@ -68,16 +68,16 @@ public class MethodHandleWrappers { * instrumented. At the end we also accept the original method arguments as an object varargs * since we cannot know in advance the one that will be passed. */ - public static final MethodHandle MESSAGE_METHOD_HANDLE = - new MethodHandles(MethodHandleWrappers.class.getClassLoader()) - .method( - MethodHandleWrappers.class, - "onMessage", - MethodHandle.class, - JavaxWebSocketSession.class, - HandlerContext.Receiver.class, - ContextStore.class, - Object[].class); + public static final MethodHandle MESSAGE_METHOD_HANDLE = new MethodHandles( + MethodHandleWrappers.class.getClassLoader()) + .method( + MethodHandleWrappers.class, + "onMessage", + MethodHandle.class, + JavaxWebSocketSession.class, + HandlerContext.Receiver.class, + ContextStore.class, + Object[].class); public static void onOpen( MethodHandle delegate, @@ -117,12 +117,10 @@ public static void onClose( if (handlerContext != null) { final HandlerContext.Receiver closeContext = new HandlerContext.Receiver(handlerContext.getHandshakeSpan(), session.getId()); - try (ContextScope ignored = - activateSpan( - DECORATE.startInboundCloseSpan( - closeContext, - closeReason.getReasonPhrase(), - closeReason.getCloseCode().getCode()))) { + try (ContextScope ignored = activateSpan(DECORATE.startInboundCloseSpan( + closeContext, + closeReason.getReasonPhrase(), + closeReason.getCloseCode().getCode()))) { delegate.invoke(session, closeReason); } finally { DECORATE.onFrameEnd(closeContext); @@ -146,11 +144,10 @@ public static Object onMessage( boolean instrument; boolean finishSpan = true; try { - instrument = - handlerContext != null - && args != null - && args.length > 0 - && CallDepthThreadLocalMap.incrementCallDepth(MessageHandler.class) == 0; + instrument = handlerContext != null + && args != null + && args.length > 0 + && CallDepthThreadLocalMap.incrementCallDepth(MessageHandler.class) == 0; boolean partialDelivery; if (instrument) { partialDelivery = args.length > 1 && (args[1] instanceof Boolean); diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java index eb41bd9b346..70f69739f07 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10.0/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java @@ -32,19 +32,17 @@ public static void onEnter( // and closed since jetty is directly calling them. // We also insert other arguments at the beginning in order to provide data we need. Inserting // at the beginning won't break bind and invoke jetty will do. - openHandle = - MethodHandles.insertArguments( - MethodHandleWrappers.OPEN_METHOD_HANDLE, - 0, - openHandle, - InstrumentationContext.get(Session.class, HandlerContext.Sender.class), - InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); - closeHandle = - MethodHandles.insertArguments( - MethodHandleWrappers.CLOSE_METHOD_HANDLE, - 0, - closeHandle, - InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); + openHandle = MethodHandles.insertArguments( + MethodHandleWrappers.OPEN_METHOD_HANDLE, + 0, + openHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class), + InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); + closeHandle = MethodHandles.insertArguments( + MethodHandleWrappers.CLOSE_METHOD_HANDLE, + 0, + closeHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); } } @@ -64,19 +62,17 @@ public static void onEnter( // and closed since jetty is directly calling them. // We also insert other arguments at the beginning in order to provide data we need. Inserting // at the beginning won't break bind and invoke jetty will do. - openHandle = - MethodHandles.insertArguments( - MethodHandleWrappers.OPEN_METHOD_HANDLE, - 0, - openHandle, - InstrumentationContext.get(Session.class, HandlerContext.Sender.class), - InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); - closeHandle = - MethodHandles.insertArguments( - MethodHandleWrappers.CLOSE_METHOD_HANDLE, - 0, - closeHandle, - InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); + openHandle = MethodHandles.insertArguments( + MethodHandleWrappers.OPEN_METHOD_HANDLE, + 0, + openHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class), + InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); + closeHandle = MethodHandles.insertArguments( + MethodHandleWrappers.CLOSE_METHOD_HANDLE, + 0, + closeHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); } } @@ -100,15 +96,14 @@ public static void onEnter( // to collect arguments since we need to call the original and we cannot know which one will // be provided. In fact, it will depend on the data used (i.e. byte[], String, etc...) and // if partial delivery is handled (so it will also accept a boolean for the fin bit signal). - metadata.setMethodHandle( - MethodHandles.insertArguments( - MethodHandleWrappers.MESSAGE_METHOD_HANDLE, - 0, - metadata.getMethodHandle(), - session, - new HandlerContext.Receiver(current, session.getId()), - InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)) - .asVarargsCollector(Object[].class)); + metadata.setMethodHandle(MethodHandles.insertArguments( + MethodHandleWrappers.MESSAGE_METHOD_HANDLE, + 0, + metadata.getMethodHandle(), + session, + new HandlerContext.Receiver(current, session.getId()), + InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)) + .asVarargsCollector(Object[].class)); } catch (Throwable t) { // log it ExceptionLogger.LOGGER.debug("Error while mutating MessageSink ", t); diff --git a/dd-java-agent/instrumentation/ws/jakarta-ws-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakartaws/WebServiceInstrumentation.java b/dd-java-agent/instrumentation/ws/jakarta-ws-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakartaws/WebServiceInstrumentation.java index aba631a4552..cb8420fd0ac 100644 --- a/dd-java-agent/instrumentation/ws/jakarta-ws-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakartaws/WebServiceInstrumentation.java +++ b/dd-java-agent/instrumentation/ws/jakarta-ws-annotations-3.0/src/main/java/datadog/trace/instrumentation/jakartaws/WebServiceInstrumentation.java @@ -59,9 +59,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(isPublic()) .and(not(isStatic())) - .and( - hasSuperMethod( - isDeclaredBy(declaresAnnotation(named(WEB_SERVICE_ANNOTATION_NAME))))), + .and(hasSuperMethod( + isDeclaredBy(declaresAnnotation(named(WEB_SERVICE_ANNOTATION_NAME))))), getClass().getName() + "$InvokeAdvice"); } diff --git a/dd-java-agent/instrumentation/ws/jax-ws/jax-ws-annotations-1.1/src/main/java/datadog/trace/instrumentation/jaxws1/WebServiceInstrumentation.java b/dd-java-agent/instrumentation/ws/jax-ws/jax-ws-annotations-1.1/src/main/java/datadog/trace/instrumentation/jaxws1/WebServiceInstrumentation.java index 68642dbcc30..06da3ddc385 100644 --- a/dd-java-agent/instrumentation/ws/jax-ws/jax-ws-annotations-1.1/src/main/java/datadog/trace/instrumentation/jaxws1/WebServiceInstrumentation.java +++ b/dd-java-agent/instrumentation/ws/jax-ws/jax-ws-annotations-1.1/src/main/java/datadog/trace/instrumentation/jaxws1/WebServiceInstrumentation.java @@ -59,9 +59,8 @@ public void methodAdvice(MethodTransformer transformer) { isMethod() .and(isPublic()) .and(not(isStatic())) - .and( - hasSuperMethod( - isDeclaredBy(declaresAnnotation(named(WEB_SERVICE_ANNOTATION_NAME))))), + .and(hasSuperMethod( + isDeclaredBy(declaresAnnotation(named(WEB_SERVICE_ANNOTATION_NAME))))), getClass().getName() + "$InvokeAdvice"); } diff --git a/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentBootstrap.java b/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentBootstrap.java index 0114503447c..415af9830bb 100644 --- a/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentBootstrap.java +++ b/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentBootstrap.java @@ -160,9 +160,8 @@ private static void agentmainImpl( throw new IllegalStateException("DD Java Agent NOT added to bootstrap classpath."); } try { - final Method startMethod = - agentClass.getMethod( - "start", Object.class, Instrumentation.class, URL.class, String.class); + final Method startMethod = agentClass.getMethod( + "start", Object.class, Instrumentation.class, URL.class, String.class); startMethod.invoke(null, initTelemetry, inst, agentJarURL, agentArgs); } catch (Throwable e) { throw new IllegalStateException("Unable to start DD Java Agent.", e); @@ -173,16 +172,15 @@ static boolean getConfig(String configName) { switch (configName) { case LIB_INJECTION_ENABLED_ENV_VAR: return EnvironmentVariables.get(LIB_INJECTION_ENABLED_ENV_VAR) != null; - case LIB_INJECTION_FORCE_SYS_PROP: - { - String envVarName = - LIB_INJECTION_FORCE_SYS_PROP.replace('.', '_').replace('-', '_').toUpperCase(); - String injectionForceFlag = EnvironmentVariables.get(envVarName); - if (injectionForceFlag == null) { - injectionForceFlag = SystemProperties.get(LIB_INJECTION_FORCE_SYS_PROP); - } - return "true".equalsIgnoreCase(injectionForceFlag) || "1".equals(injectionForceFlag); + case LIB_INJECTION_FORCE_SYS_PROP: { + String envVarName = + LIB_INJECTION_FORCE_SYS_PROP.replace('.', '_').replace('-', '_').toUpperCase(); + String injectionForceFlag = EnvironmentVariables.get(envVarName); + if (injectionForceFlag == null) { + injectionForceFlag = SystemProperties.get(LIB_INJECTION_FORCE_SYS_PROP); } + return "true".equalsIgnoreCase(injectionForceFlag) || "1".equals(injectionForceFlag); + } default: return false; } @@ -477,9 +475,8 @@ private static List getAgentFilesFromVMArguments() { for (final String argument : JavaVirtualMachine.getVmOptions()) { if (argument.startsWith(JAVA_AGENT_ARGUMENT)) { int index = argument.indexOf('=', JAVA_AGENT_ARGUMENT.length()); - String agentPathname = - argument.substring( - JAVA_AGENT_ARGUMENT.length(), index == -1 ? argument.length() : index); + String agentPathname = argument.substring( + JAVA_AGENT_ARGUMENT.length(), index == -1 ? argument.length() : index); File agentFile = new File(agentPathname); if (agentFile.exists() && agentFile.isFile()) { agentFiles.add(agentFile); @@ -527,12 +524,11 @@ private static void checkJarManifestMainClassIsThis(final URL jarUrl) throws IOE } } } - throw new IllegalStateException( - "dd-java-agent is not installed, because class '" - + thisClass.getCanonicalName() - + "' is located in '" - + jarUrl - + "'. Make sure you don't have this .class-file anywhere, besides dd-java-agent.jar"); + throw new IllegalStateException("dd-java-agent is not installed, because class '" + + thisClass.getCanonicalName() + + "' is located in '" + + jarUrl + + "'. Make sure you don't have this .class-file anywhere, besides dd-java-agent.jar"); } /** Returns {@code true} if the JVM is training, i.e. writing to a CDS/AOT archive. */ diff --git a/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentJar.java b/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentJar.java index 1b09c703a78..34f8a66d12d 100644 --- a/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentJar.java +++ b/dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentJar.java @@ -169,10 +169,8 @@ public static String getAgentVersionOrDefault(String defaultValue) { public static String getAgentVersion() throws IOException { final StringBuilder sb = new StringBuilder(); - try (final BufferedReader reader = - new BufferedReader( - new InputStreamReader( - thisClass.getResourceAsStream("/dd-java-agent.version"), StandardCharsets.UTF_8))) { + try (final BufferedReader reader = new BufferedReader(new InputStreamReader( + thisClass.getResourceAsStream("/dd-java-agent.version"), StandardCharsets.UTF_8))) { for (int c = reader.read(); c != -1; c = reader.read()) { sb.append((char) c); diff --git a/dd-java-agent/src/main/java6/datadog/trace/bootstrap/AgentPreCheck.java b/dd-java-agent/src/main/java6/datadog/trace/bootstrap/AgentPreCheck.java index e9ea4fc7b7a..f573fe7978c 100644 --- a/dd-java-agent/src/main/java6/datadog/trace/bootstrap/AgentPreCheck.java +++ b/dd-java-agent/src/main/java6/datadog/trace/bootstrap/AgentPreCheck.java @@ -35,41 +35,39 @@ public static void agentmain(final String agentArgs, final Instrumentation inst) private static void reportIncompatibleJava( String javaVersion, String javaHome, String agentVersion, PrintStream output) { - output.println( - "Warning: " - + (agentVersion == null ? "This version" : "Version " + agentVersion) - + " of dd-java-agent is not compatible with Java " - + javaVersion - + " found at '" - + javaHome - + "' and is effectively disabled."); + output.println("Warning: " + + (agentVersion == null ? "This version" : "Version " + agentVersion) + + " of dd-java-agent is not compatible with Java " + + javaVersion + + " found at '" + + javaHome + + "' and is effectively disabled."); output.println("Please upgrade your Java version to 8+"); } static void sendTelemetry(String forwarderPath, String javaVersion, String agentVersion) { // Hardcoded payload for unsupported Java version. - String payload = - "{\"metadata\":{" - + "\"runtime_name\":\"jvm\"," - + "\"language_name\":\"jvm\"," - + "\"runtime_version\":\"" - + javaVersion - + "\"," - + "\"language_version\":\"" - + javaVersion - + "\"," - + "\"tracer_version\":\"" - + agentVersion - + "\"," - + "\"result\":\"abort\"," - + "\"result_class\":\"unknown\"," - + "\"result_reason\":\"incompatible_runtime\"" - + "}," - + "\"points\":[{" - + "\"name\":\"library_entrypoint.abort\"," - + "\"tags\":[\"reason:incompatible_runtime\"]" - + "}]" - + "}"; + String payload = "{\"metadata\":{" + + "\"runtime_name\":\"jvm\"," + + "\"language_name\":\"jvm\"," + + "\"runtime_version\":\"" + + javaVersion + + "\"," + + "\"language_version\":\"" + + javaVersion + + "\"," + + "\"tracer_version\":\"" + + agentVersion + + "\"," + + "\"result\":\"abort\"," + + "\"result_class\":\"unknown\"," + + "\"result_reason\":\"incompatible_runtime\"" + + "}," + + "\"points\":[{" + + "\"name\":\"library_entrypoint.abort\"," + + "\"tags\":[\"reason:incompatible_runtime\"]" + + "}]" + + "}"; ForwarderJsonSenderThread t = new ForwarderJsonSenderThread(forwarderPath, payload); t.setDaemon(true); diff --git a/dd-java-agent/src/test/java/datadog/test/SimpleAgentMock.java b/dd-java-agent/src/test/java/datadog/test/SimpleAgentMock.java index 5595ab5ad79..ffb8964bcfe 100644 --- a/dd-java-agent/src/test/java/datadog/test/SimpleAgentMock.java +++ b/dd-java-agent/src/test/java/datadog/test/SimpleAgentMock.java @@ -21,12 +21,11 @@ */ public class SimpleAgentMock implements Closeable { private static final MockResponse EMPTY_200_RESPONSE = new MockResponse().setResponseCode(200); - private static final MockResponse INFO_RESPONSE = - new MockResponse() - .setResponseCode(200) - .addHeader("Content-Type", "application/json") - .setBody( - "{\"version\":\"7.77.0\",\"endpoints\":[\"/v1.0/traces\",\"/v0.5/traces\",\"/v0.4/traces\"]}"); + private static final MockResponse INFO_RESPONSE = new MockResponse() + .setResponseCode(200) + .addHeader("Content-Type", "application/json") + .setBody( + "{\"version\":\"7.77.0\",\"endpoints\":[\"/v1.0/traces\",\"/v0.5/traces\",\"/v0.4/traces\"]}"); private final MockWebServer server; private final List spans = new CopyOnWriteArrayList<>(); @@ -34,37 +33,36 @@ public class SimpleAgentMock implements Closeable { public SimpleAgentMock() { server = new MockWebServer(); - server.setDispatcher( - new Dispatcher() { - @Override - public MockResponse dispatch(final RecordedRequest request) { - String path = request.getPath(); - if (path != null) { - if (path.startsWith("/info")) { - return INFO_RESPONSE; - } + server.setDispatcher(new Dispatcher() { + @Override + public MockResponse dispatch(final RecordedRequest request) { + String path = request.getPath(); + if (path != null) { + if (path.startsWith("/info")) { + return INFO_RESPONSE; + } - byte[] body = request.getBody().readByteArray(); + byte[] body = request.getBody().readByteArray(); - DecodedMessage message = null; - if (path.startsWith("/v1.0/traces")) { - message = Decoder.decodeV1(body); - } else if (path.startsWith("/v0.5/traces")) { - message = Decoder.decodeV05(body); - } else if (path.startsWith("/v0.4/traces")) { - message = Decoder.decodeV04(body); - } + DecodedMessage message = null; + if (path.startsWith("/v1.0/traces")) { + message = Decoder.decodeV1(body); + } else if (path.startsWith("/v0.5/traces")) { + message = Decoder.decodeV05(body); + } else if (path.startsWith("/v0.4/traces")) { + message = Decoder.decodeV04(body); + } - if (message != null) { - for (DecodedTrace trace : message.getTraces()) { - spans.addAll(trace.getSpans()); - } - } + if (message != null) { + for (DecodedTrace trace : message.getTraces()) { + spans.addAll(trace.getSpans()); } - - return EMPTY_200_RESPONSE; } - }); + } + + return EMPTY_200_RESPONSE; + } + }); } public SimpleAgentMock start() throws IOException { diff --git a/dd-java-agent/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java b/dd-java-agent/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java index ec84b9f13c8..7070148b6ff 100644 --- a/dd-java-agent/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java +++ b/dd-java-agent/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java @@ -135,10 +135,9 @@ public static String getResourceName(final String className) { } public static String[] getBootstrapPackagePrefixes() throws Exception { - final Field f = - getAgentClassLoader() - .loadClass("datadog.trace.bootstrap.Constants") - .getField("BOOTSTRAP_PACKAGE_PREFIXES"); + final Field f = getAgentClassLoader() + .loadClass("datadog.trace.bootstrap.Constants") + .getField("BOOTSTRAP_PACKAGE_PREFIXES"); return (String[]) f.get(null); } diff --git a/dd-java-agent/src/test/java/jvmbootstraptest/CustomSecurityManager.java b/dd-java-agent/src/test/java/jvmbootstraptest/CustomSecurityManager.java index 591fb6283bd..fc7766e5e90 100644 --- a/dd-java-agent/src/test/java/jvmbootstraptest/CustomSecurityManager.java +++ b/dd-java-agent/src/test/java/jvmbootstraptest/CustomSecurityManager.java @@ -712,16 +712,15 @@ final boolean checkSocketPermission(SocketPermission perm, Object ctx) { case "resolve": return checkSocketResolve(perm, ctx, perm.getName()); - case "connect,resolve": - { - String name = perm.getName(); - int colonPos = name.indexOf(':'); + case "connect,resolve": { + String name = perm.getName(); + int colonPos = name.indexOf(':'); - String host = name.substring(0, colonPos); - int port = Integer.parseInt(name.substring(colonPos + 1)); + String host = name.substring(0, colonPos); + int port = Integer.parseInt(name.substring(colonPos + 1)); - return checkSocketResolve(perm, ctx, host) && checkSocketConnect(perm, ctx, host, port); - } + return checkSocketResolve(perm, ctx, host) && checkSocketConnect(perm, ctx, host, port); + } default: return false; diff --git a/dd-java-agent/src/test/java/jvmbootstraptest/InitializationTelemetryCheck.java b/dd-java-agent/src/test/java/jvmbootstraptest/InitializationTelemetryCheck.java index 85efcea28a3..389c4d3a60f 100644 --- a/dd-java-agent/src/test/java/jvmbootstraptest/InitializationTelemetryCheck.java +++ b/dd-java-agent/src/test/java/jvmbootstraptest/InitializationTelemetryCheck.java @@ -115,14 +115,13 @@ public static Result runTestJvm( "echo \"$1 $(cat -)\" >> " + outputFile.getAbsolutePath() + "\n"); try { - int exitCode = - IntegrationTestUtils.runOnSeparateJvm( - InitializationTelemetryCheck.class.getName(), - jvmArgs, - Collections.emptyList(), - InitializationTelemetryCheck.envVars(forwarderFile), - jarFile, - true); + int exitCode = IntegrationTestUtils.runOnSeparateJvm( + InitializationTelemetryCheck.class.getName(), + jvmArgs, + Collections.emptyList(), + InitializationTelemetryCheck.envVars(forwarderFile), + jarFile, + true); return new Result(exitCode, read(outputFile)); } finally { @@ -132,11 +131,10 @@ public static Result runTestJvm( static File createTempFile(String baseName, String extension, Set perms) throws IOException { - Path path = - Files.createTempFile( - baseName + "-integration-telemetry-check", - "." + extension, - PosixFilePermissions.asFileAttribute(perms)); + Path path = Files.createTempFile( + baseName + "-integration-telemetry-check", + "." + extension, + PosixFilePermissions.asFileAttribute(perms)); File file = path.toFile(); file.deleteOnExit(); return file; diff --git a/dd-java-agent/src/test/java/jvmbootstraptest/IsolatedClassloading.java b/dd-java-agent/src/test/java/jvmbootstraptest/IsolatedClassloading.java index 97856a134d9..8f7f2514302 100644 --- a/dd-java-agent/src/test/java/jvmbootstraptest/IsolatedClassloading.java +++ b/dd-java-agent/src/test/java/jvmbootstraptest/IsolatedClassloading.java @@ -4,11 +4,9 @@ public class IsolatedClassloading { public static void main(final String[] args) throws Exception { // isolate an isolating classloader and then use that to try and load the target class - final ClassLoader isolatedLoader = - (ClassLoader) - new IsolatingClassLoader() - .loadClass(IsolatingClassLoader.class.getName()) - .newInstance(); + final ClassLoader isolatedLoader = (ClassLoader) new IsolatingClassLoader() + .loadClass(IsolatingClassLoader.class.getName()) + .newInstance(); isolatedLoader.loadClass(Target.class.getName()); } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/HttpProxy.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/HttpProxy.java index 63df85f3518..40f8dc313a7 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/HttpProxy.java +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/HttpProxy.java @@ -32,13 +32,11 @@ public final class HttpProxy implements Closeable { serverSocket = new ServerSocket(0); // random port serverSocket.setSoTimeout(0); port = serverSocket.getLocalPort(); - executorService = - Executors.newCachedThreadPool( - r -> { - final Thread thread = new Thread(null, r, "Http Proxy: " + port); - thread.setDaemon(true); - return thread; - }); + executorService = Executors.newCachedThreadPool(r -> { + final Thread thread = new Thread(null, r, "Http Proxy: " + port); + thread.setDaemon(true); + return thread; + }); executorService.execute(new SocketAcceptor()); System.out.println("Started proxy server " + this + " on port " + port); } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java index 06535303ff4..28181b50b9d 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java @@ -53,9 +53,8 @@ public static URL createJarWithClasses(final ClassLoader loader, final String... tmpJar.deleteOnExit(); final Manifest manifest = new Manifest(); - try (final JarOutputStream target = - new JarOutputStream( - new BufferedOutputStream(Files.newOutputStream(tmpJar.toPath())), manifest)) { + try (final JarOutputStream target = new JarOutputStream( + new BufferedOutputStream(Files.newOutputStream(tmpJar.toPath())), manifest)) { for (final String resourceName : resourceNames) { try (InputStream is = loader.getResourceAsStream(resourceName)) { if (is != null) { @@ -83,9 +82,8 @@ public static URL createJarWithClasses(final Class... classes) throws IOExcep tmpJar.deleteOnExit(); final Manifest manifest = new Manifest(); - final JarOutputStream target = - new JarOutputStream( - new BufferedOutputStream(Files.newOutputStream(tmpJar.toPath())), manifest); + final JarOutputStream target = new JarOutputStream( + new BufferedOutputStream(Files.newOutputStream(tmpJar.toPath())), manifest); for (final Class clazz : classes) { addToJar(getResourceName(clazz.getName()), convertToByteArray(clazz), target); } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.java index 361aab3845c..0bf62d11654 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.java +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.java @@ -38,14 +38,13 @@ public class OkHttpUtils { private static final HttpLoggingInterceptor LOGGING_INTERCEPTOR = new HttpLoggingInterceptor(CLIENT_LOGGER::debug); - private static final Interceptor EXPECT_CONTINUE_INTERCEPTOR = - chain -> { - final Request.Builder builder = chain.request().newBuilder(); - if (chain.request().body() != null) { - builder.addHeader("Expect", "100-continue"); - } - return chain.proceed(builder.build()); - }; + private static final Interceptor EXPECT_CONTINUE_INTERCEPTOR = chain -> { + final Request.Builder builder = chain.request().newBuilder(); + if (chain.request().body() != null) { + builder.addHeader("Expect", "100-continue"); + } + return chain.proceed(builder.build()); + }; static { LOGGING_INTERCEPTOR.setLevel(Level.BASIC); diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/PortUtils.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/PortUtils.java index df7830a7506..45068e22fe6 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/PortUtils.java +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/PortUtils.java @@ -100,10 +100,9 @@ private static boolean isPortOpen(final int port) { private static boolean isPortOpen(String host, int port) { try (final Socket socket = new Socket()) { - InetSocketAddress address = - host == null - ? new InetSocketAddress(InetAddress.getLoopbackAddress(), port) - : new InetSocketAddress(host, port); + InetSocketAddress address = host == null + ? new InetSocketAddress(InetAddress.getLoopbackAddress(), port) + : new InetSocketAddress(host, port); socket.connect(address, PORT_CONNECT_TIMEOUT_MS); return true; } catch (final IOException e) { @@ -126,12 +125,8 @@ public static void waitForPortToOpen( if (!process.isAlive()) { int exitCode = process.exitValue(); if (exitCode != 0) { - throw new RuntimeException( - "Process exited abnormally exitCode=" - + exitCode - + " before port=" - + port - + " was opened"); + throw new RuntimeException("Process exited abnormally exitCode=" + exitCode + + " before port=" + port + " was opened"); } else { throw new RuntimeException("Process finished before port=" + port + " was opened"); } @@ -142,13 +137,12 @@ public static void waitForPortToOpen( } } - throw new RuntimeException( - "Timed out waiting for port " - + port - + " to be opened, started to wait at: " - + startedAt - + ", timed out at: " - + System.currentTimeMillis()); + throw new RuntimeException("Timed out waiting for port " + + port + + " to be opened, started to wait at: " + + startedAt + + ", timed out at: " + + System.currentTimeMillis()); } public static void waitForPortToOpen(String host, int port, long timeout, TimeUnit unit) { @@ -177,20 +171,12 @@ private static void waitForPort( try { Thread.sleep(100); } catch (final InterruptedException e) { - throw new RuntimeException( - "Interrupted while waiting for " - + (host != null ? host + ":" : "") - + port - + " to be " - + state); + throw new RuntimeException("Interrupted while waiting for " + + (host != null ? host + ":" : "") + port + " to be " + state); } } - throw new RuntimeException( - "Timed out waiting for port " - + (host != null ? host + ":" : "") - + port - + " to be " - + state); + throw new RuntimeException("Timed out waiting for port " + (host != null ? host + ":" : "") + + port + " to be " + state); } } diff --git a/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/server/http/JavaTestHttpServer.java b/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/server/http/JavaTestHttpServer.java index 1ff635fba5e..cc95a95ae88 100644 --- a/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/server/http/JavaTestHttpServer.java +++ b/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/server/http/JavaTestHttpServer.java @@ -72,19 +72,18 @@ public interface RequestHandler { public final SSLContext sslContext; - private final X509TrustManager trustManager = - new X509TrustManager() { - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } + private final X509TrustManager trustManager = new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } - @Override - public void checkClientTrusted(X509Certificate[] certificate, String str) {} + @Override + public void checkClientTrusted(X509Certificate[] certificate, String str) {} - @Override - public void checkServerTrusted(X509Certificate[] certificate, String str) {} - }; + @Override + public void checkServerTrusted(X509Certificate[] certificate, String str) {} + }; private final HostnameVerifier hostnameVerifier = (hostname, session) -> "localhost".equals(hostname); @@ -134,17 +133,16 @@ public JavaTestHttpServer start() { // HTTPS SslContextFactory sslContextFactory = new SslContextFactory(); - keystorePath = - extractKeystoreToDisk(JavaTestHttpServer.class.getResource("datadog.jks")).getPath(); + keystorePath = extractKeystoreToDisk(JavaTestHttpServer.class.getResource("datadog.jks")) + .getPath(); sslContextFactory.setKeyStorePath(keystorePath); sslContextFactory.setKeyStorePassword("datadog"); HttpConfiguration httpsConfiguration = new HttpConfiguration(httpConfiguration); httpsConfiguration.addCustomizer(new SecureRequestCustomizer()); - ServerConnector https = - new ServerConnector( - internalServer, - new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), - new HttpConnectionFactory(httpsConfiguration)); + ServerConnector https = new ServerConnector( + internalServer, + new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()), + new HttpConnectionFactory(httpsConfiguration)); https.setHost("localhost"); https.setPort(0); internalServer.addConnector(https); @@ -170,9 +168,8 @@ public JavaTestHttpServer start() { long rem = TimeUnit.SECONDS.toMillis(5); while (!internalServer.isStarted()) { if (rem <= 0) { - throw new RuntimeException( - new TimeoutException( - "Failed to start server " + this + " on port " + address.getPort())); + throw new RuntimeException(new TimeoutException( + "Failed to start server " + this + " on port " + address.getPort())); } try { Thread.sleep(Math.min(rem, 100)); diff --git a/dd-smoke-tests/apm-tracing-disabled/application/src/main/java/datadog/smoketest/apmtracingdisabled/Controller.java b/dd-smoke-tests/apm-tracing-disabled/application/src/main/java/datadog/smoketest/apmtracingdisabled/Controller.java index d471fcb630b..726b93bd451 100644 --- a/dd-smoke-tests/apm-tracing-disabled/application/src/main/java/datadog/smoketest/apmtracingdisabled/Controller.java +++ b/dd-smoke-tests/apm-tracing-disabled/application/src/main/java/datadog/smoketest/apmtracingdisabled/Controller.java @@ -86,23 +86,21 @@ public String lateOutbound(@RequestParam(name = "url") String url) { final Span span = GlobalTracer.get().activeSpan(); // Thread synchronization relies on waitForTraceCount rather than Thread completion, no race // issue. - Thread thread = - new Thread( - () -> { - try { - // Sleep past PendingTraceBuffer's 500ms flush delay so the root chunk exports - // before this late child. - Thread.sleep(3000); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - try (Scope scope = GlobalTracer.get().activateSpan(span)) { - new RestTemplate().getForObject(url, String.class); - } catch (Exception e) { - log.debug("late outbound call to {} failed", url, e); - } - }); + Thread thread = new Thread(() -> { + try { + // Sleep past PendingTraceBuffer's 500ms flush delay so the root chunk exports + // before this late child. + Thread.sleep(3000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + try (Scope scope = GlobalTracer.get().activateSpan(span)) { + new RestTemplate().getForObject(url, String.class); + } catch (Exception e) { + log.debug("late outbound call to {} failed", url, e); + } + }); thread.setDaemon(true); thread.start(); return "late-outbound"; diff --git a/dd-smoke-tests/appsec/spring-tomcat7/src/main/java/datadog/smoketest/appsec/springtomcat7/Main.java b/dd-smoke-tests/appsec/spring-tomcat7/src/main/java/datadog/smoketest/appsec/springtomcat7/Main.java index 629bd4e8ef5..93af34072d0 100644 --- a/dd-smoke-tests/appsec/spring-tomcat7/src/main/java/datadog/smoketest/appsec/springtomcat7/Main.java +++ b/dd-smoke-tests/appsec/spring-tomcat7/src/main/java/datadog/smoketest/appsec/springtomcat7/Main.java @@ -23,11 +23,10 @@ public static void main(String[] args) throws Exception { try { port = Integer.parseInt(kv[1]); } catch (NumberFormatException e) { - System.out.println( - "--server.port '" - + kv[1] - + "' is not valid port. Will be used default port " - + port); + System.out.println("--server.port '" + + kv[1] + + "' is not valid port. Will be used default port " + + port); } } } @@ -40,14 +39,11 @@ public static void main(String[] args) throws Exception { Context context = tomcat.addContext(ROOT, new File(".").getAbsolutePath()); Tomcat.addServlet( - context, - SERVLET, - new DispatcherServlet( - new AnnotationConfigWebApplicationContext() { - { - register(AppConfigurer.class); - } - })); + context, SERVLET, new DispatcherServlet(new AnnotationConfigWebApplicationContext() { + { + register(AppConfigurer.class); + } + })); context.addServletMapping(ROOT, SERVLET); tomcat.start(); diff --git a/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Author.java b/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Author.java index e4098fdaf87..beb045854a9 100644 --- a/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Author.java +++ b/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Author.java @@ -27,11 +27,10 @@ public String getLastName() { return lastName; } - private static List authors = - Arrays.asList( - new Author("author-1", "Joshua", "Bloch"), - new Author("author-2", "Douglas", "Adams"), - new Author("author-3", "Bill", "Bryson")); + private static List authors = Arrays.asList( + new Author("author-1", "Joshua", "Bloch"), + new Author("author-2", "Douglas", "Adams"), + new Author("author-3", "Bill", "Bryson")); public static Author getById(String id) { return authors.stream().filter(author -> author.id.equals(id)).findFirst().orElse(null); diff --git a/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Book.java b/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Book.java index 580170dd197..443bb011601 100644 --- a/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Book.java +++ b/dd-smoke-tests/appsec/springboot-graphql/src/main/java/datadog/smoketest/appsec/springbootgraphql/dao/Book.java @@ -33,11 +33,10 @@ public String getAuthorId() { return authorId; } - private static List books = - Arrays.asList( - new Book("book-1", "Effective Java", 416, "author-1"), - new Book("book-2", "Hitchhiker's Guide to the Galaxy", 208, "author-2"), - new Book("book-3", "Down Under", 436, "author-3")); + private static List books = Arrays.asList( + new Book("book-1", "Effective Java", 416, "author-1"), + new Book("book-2", "Hitchhiker's Guide to the Galaxy", 208, "author-2"), + new Book("book-3", "Down Under", 436, "author-3")); public static Book getById(String id) { return books.stream().filter(book -> book.id.equals(id)).findFirst().orElse(null); diff --git a/dd-smoke-tests/appsec/springboot-security/src/main/java/datadog/smoketest/appsec/springbootsecurity/WebSecurityConfig.java b/dd-smoke-tests/appsec/springboot-security/src/main/java/datadog/smoketest/appsec/springbootsecurity/WebSecurityConfig.java index 819244a520a..dc040f71447 100644 --- a/dd-smoke-tests/appsec/springboot-security/src/main/java/datadog/smoketest/appsec/springbootsecurity/WebSecurityConfig.java +++ b/dd-smoke-tests/appsec/springboot-security/src/main/java/datadog/smoketest/appsec/springbootsecurity/WebSecurityConfig.java @@ -27,13 +27,11 @@ public WebSecurityConfig(DataSource dataSource) { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.authorizeRequests( - (requests) -> - requests - .antMatchers("/", "/signup", "/register") - .permitAll() - .anyRequest() - .authenticated()) + http.authorizeRequests((requests) -> requests + .antMatchers("/", "/signup", "/register") + .permitAll() + .anyRequest() + .authenticated()) .formLogin((form) -> form.loginPage("/login").permitAll()) .logout(LogoutConfigurer::permitAll); diff --git a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/AIGuardController.java b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/AIGuardController.java index 4f972aecb88..64b1acb8e41 100644 --- a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/AIGuardController.java +++ b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/AIGuardController.java @@ -42,23 +42,20 @@ public ResponseEntity allow( rootSpan.setTag("usr.session_id", sessionId); } } - final Evaluation result = - AIGuard.evaluate( - asList( - Message.message("system", "You are a beautiful AI"), - Message.message("user", "I am harmless"))); + final Evaluation result = AIGuard.evaluate(asList( + Message.message("system", "You are a beautiful AI"), + Message.message("user", "I am harmless"))); return ResponseEntity.ok(result); } @GetMapping(value = "/deny") public ResponseEntity deny(final @RequestHeader("X-Blocking-Enabled") boolean block) { try { - final Evaluation result = - AIGuard.evaluate( - asList( - Message.message("system", "You are a beautiful AI"), - Message.message("user", "You should not trust me" + (block ? " [block]" : ""))), - new Options().block(block)); + final Evaluation result = AIGuard.evaluate( + asList( + Message.message("system", "You are a beautiful AI"), + Message.message("user", "You should not trust me" + (block ? " [block]" : ""))), + new Options().block(block)); return ResponseEntity.ok(result); } catch (AIGuardAbortError e) { return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getReason()); @@ -68,12 +65,11 @@ public ResponseEntity deny(final @RequestHeader("X-Blocking-Enabled") boolean @GetMapping(value = "/abort") public ResponseEntity abort(final @RequestHeader("X-Blocking-Enabled") boolean block) { try { - final Evaluation result = - AIGuard.evaluate( - asList( - Message.message("system", "You are a beautiful AI"), - Message.message("user", "Nuke yourself" + (block ? " [block]" : ""))), - new Options().block(block)); + final Evaluation result = AIGuard.evaluate( + asList( + Message.message("system", "You are a beautiful AI"), + Message.message("user", "Nuke yourself" + (block ? " [block]" : ""))), + new Options().block(block)); return ResponseEntity.ok(result); } catch (AIGuardAbortError e) { return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getReason()); @@ -83,11 +79,9 @@ public ResponseEntity abort(final @RequestHeader("X-Blocking-Enabled") boolea @GetMapping(value = "/deny-default-options") public ResponseEntity denyDefaultOptions() { try { - final Evaluation result = - AIGuard.evaluate( - asList( - Message.message("system", "You are a beautiful AI"), - Message.message("user", "You should not trust me [block]"))); + final Evaluation result = AIGuard.evaluate(asList( + Message.message("system", "You are a beautiful AI"), + Message.message("user", "You should not trust me [block]"))); return ResponseEntity.ok(result); } catch (AIGuardAbortError e) { return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getReason()); @@ -96,16 +90,14 @@ public ResponseEntity denyDefaultOptions() { @GetMapping(value = "/multimodal") public ResponseEntity multimodal() { - final Evaluation result = - AIGuard.evaluate( + final Evaluation result = AIGuard.evaluate(asList( + Message.message("system", "You are a beautiful AI"), + Message.message( + "user", asList( - Message.message("system", "You are a beautiful AI"), - Message.message( - "user", - asList( - AIGuard.ContentPart.text("Describe this image:"), - AIGuard.ContentPart.imageUrl("https://example.com/image.jpg"), - AIGuard.ContentPart.text("What do you see?"))))); + AIGuard.ContentPart.text("Describe this image:"), + AIGuard.ContentPart.imageUrl("https://example.com/image.jpg"), + AIGuard.ContentPart.text("What do you see?"))))); return ResponseEntity.ok(result); } diff --git a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/WebController.java b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/WebController.java index e9237b0cd6b..77754f45d40 100644 --- a/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/WebController.java +++ b/dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/WebController.java @@ -53,7 +53,8 @@ @RestController public class WebController { - @Autowired private AsyncService myAsyncService; + @Autowired + private AsyncService myAsyncService; @RequestMapping("/greeting") public String greeting() { @@ -160,7 +161,8 @@ public String okHttp2(@RequestParam(value = "domain") final String domain) { @GetMapping("/ssrf/okHttp3") public String okHttp3(@RequestParam("domain") final String domain) { final okhttp3.OkHttpClient client = new okhttp3.OkHttpClient(); - final okhttp3.Request request = new okhttp3.Request.Builder().url("http://" + domain).build(); + final okhttp3.Request request = + new okhttp3.Request.Builder().url("http://" + domain).build(); try { client.newCall(request).execute(); } catch (final BlockingException e) { @@ -332,11 +334,10 @@ public ResponseEntity apiSecurityHttpClientOkHttp2(final HttpServletRequ if (requiresBody(request.getMethod())) { final String contentType = request.getContentType(); final byte[] data = readFully(request.getInputStream()); - clientRequest = - clientRequest.method( - request.getMethod(), - com.squareup.okhttp.RequestBody.create( - com.squareup.okhttp.MediaType.parse(contentType), data)); + clientRequest = clientRequest.method( + request.getMethod(), + com.squareup.okhttp.RequestBody.create( + com.squareup.okhttp.MediaType.parse(contentType), data)); } else { clientRequest.method(request.getMethod(), null); } @@ -352,7 +353,8 @@ public ResponseEntity apiSecurityHttpClientOkHttp2(final HttpServletRequ if (echoHeaders != null) { clientRequest = clientRequest.header("echo-headers", echoHeaders); } - final Response clientResponse = new OkHttpClient().newCall(clientRequest.build()).execute(); + final Response clientResponse = + new OkHttpClient().newCall(clientRequest.build()).execute(); return ResponseEntity.status(200).body(clientResponse.body().string()); } @@ -362,7 +364,8 @@ public ResponseEntity apiSecurityHttpClientOkHttp2(final HttpServletRequ public ResponseEntity apiSecurityHttpClientOkHttp3(final HttpServletRequest request) throws IOException { // create an internal http request to the echo endpoint to validate the http client library - final okhttp3.HttpUrl.Builder url = okhttp3.HttpUrl.parse(getEchoUrl(request)).newBuilder(); + final okhttp3.HttpUrl.Builder url = + okhttp3.HttpUrl.parse(getEchoUrl(request)).newBuilder(); final String redirect = request.getParameter("redirect"); if (redirect != null) { url.addQueryParameter("redirect", "true"); @@ -371,10 +374,9 @@ public ResponseEntity apiSecurityHttpClientOkHttp3(final HttpServletRequ if (requiresBody(request.getMethod())) { final String contentType = request.getContentType(); final byte[] data = readFully(request.getInputStream()); - clientRequest = - clientRequest.method( - request.getMethod(), - okhttp3.RequestBody.create(okhttp3.MediaType.parse(contentType), data)); + clientRequest = clientRequest.method( + request.getMethod(), + okhttp3.RequestBody.create(okhttp3.MediaType.parse(contentType), data)); } else { clientRequest.method(request.getMethod(), null); } diff --git a/dd-smoke-tests/armeria-grpc/application/src/main/java/datadog/smoketest/Main.java b/dd-smoke-tests/armeria-grpc/application/src/main/java/datadog/smoketest/Main.java index b0a9b80fcfd..faadd6b30ba 100644 --- a/dd-smoke-tests/armeria-grpc/application/src/main/java/datadog/smoketest/Main.java +++ b/dd-smoke-tests/armeria-grpc/application/src/main/java/datadog/smoketest/Main.java @@ -14,14 +14,13 @@ public static void main(String[] args) { ServerBuilder sb = Server.builder(); sb.http(port); - GrpcService grpcService = - GrpcService.builder() - .addService(new HelloServiceImpl()) - .addService(new IastServiceImpl()) - .addService(ProtoReflectionService.newInstance()) - .supportedSerializationFormats(GrpcSerializationFormats.values()) - .enableUnframedRequests(true) - .build(); + GrpcService grpcService = GrpcService.builder() + .addService(new HelloServiceImpl()) + .addService(new IastServiceImpl()) + .addService(ProtoReflectionService.newInstance()) + .supportedSerializationFormats(GrpcSerializationFormats.values()) + .enableUnframedRequests(true) + .build(); sb.service(grpcService); Server server = sb.build(); diff --git a/dd-smoke-tests/crashtracking/src/main/java/datadog/smoketest/crashtracking/CrashtrackingTestApplication.java b/dd-smoke-tests/crashtracking/src/main/java/datadog/smoketest/crashtracking/CrashtrackingTestApplication.java index 5b8301ba5af..5bef0b373e5 100644 --- a/dd-smoke-tests/crashtracking/src/main/java/datadog/smoketest/crashtracking/CrashtrackingTestApplication.java +++ b/dd-smoke-tests/crashtracking/src/main/java/datadog/smoketest/crashtracking/CrashtrackingTestApplication.java @@ -40,18 +40,16 @@ public static void main(String[] args) throws Exception { System.exit(-1); } - String crashUploaderScript = - Arrays.stream(onError.split(";")) - .filter(s -> s.trim().contains("dd_crash_uploader")) - .findFirst() - .map(s -> s.replace(" %p", "")) - .orElse(null); - String oomeNotifierScript = - Arrays.stream(onOutOfMemoryError.split(";")) - .filter(s -> s.trim().contains("dd_oome_notifier")) - .findFirst() - .map(s -> s.replace(" %p", "")) - .orElse(null); + String crashUploaderScript = Arrays.stream(onError.split(";")) + .filter(s -> s.trim().contains("dd_crash_uploader")) + .findFirst() + .map(s -> s.replace(" %p", "")) + .orElse(null); + String oomeNotifierScript = Arrays.stream(onOutOfMemoryError.split(";")) + .filter(s -> s.trim().contains("dd_oome_notifier")) + .findFirst() + .map(s -> s.replace(" %p", "")) + .orElse(null); if (crashUploaderScript == null && oomeNotifierScript == null) { System.err.println("Neither OnError nor OnOutOfMemoryError contains the expected value"); System.exit(-1); @@ -62,17 +60,15 @@ public static void main(String[] args) throws Exception { CountDownLatch latch = new CountDownLatch(1); - Thread t = - new Thread( - () -> { - Path scriptPath = - Paths.get(crashUploaderScript != null ? crashUploaderScript : oomeNotifierScript); - while (!Files.exists(scriptPath)) { - System.out.println("Waiting for the script " + scriptPath + " to be created..."); - LockSupport.parkNanos(1_000_000_000L); - } - latch.countDown(); - }); + Thread t = new Thread(() -> { + Path scriptPath = + Paths.get(crashUploaderScript != null ? crashUploaderScript : oomeNotifierScript); + while (!Files.exists(scriptPath)) { + System.out.println("Waiting for the script " + scriptPath + " to be created..."); + LockSupport.parkNanos(1_000_000_000L); + } + latch.countDown(); + }); t.setDaemon(true); t.start(); diff --git a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/AbstractCrashtrackingSmokeTest.java b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/AbstractCrashtrackingSmokeTest.java index 8fd62bc020a..5377adb8c9b 100644 --- a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/AbstractCrashtrackingSmokeTest.java +++ b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/AbstractCrashtrackingSmokeTest.java @@ -41,27 +41,26 @@ void setUpTracingServer() throws Exception { tempDir = Files.createTempDirectory("dd-smoketest-"); crashEvents.clear(); tracingServer = new MockWebServer(); - tracingServer.setDispatcher( - new Dispatcher() { - @Override - public MockResponse dispatch(RecordedRequest request) { - String data = request.getBody().readString(StandardCharsets.UTF_8); - System.out.println("URL ====== " + request.getPath()); - if ("/telemetry/proxy/api/v2/apmtelemetry".equals(request.getPath())) { - try { - MinimalTelemetryData minimal = - moshi.adapter(MinimalTelemetryData.class).fromJson(data); - if ("logs".equals(minimal.request_type)) { - crashEvents.add(moshi.adapter(CrashTelemetryData.class).fromJson(data)); - } - } catch (IOException e) { - System.out.println("Unable to parse: " + e); - } + tracingServer.setDispatcher(new Dispatcher() { + @Override + public MockResponse dispatch(RecordedRequest request) { + String data = request.getBody().readString(StandardCharsets.UTF_8); + System.out.println("URL ====== " + request.getPath()); + if ("/telemetry/proxy/api/v2/apmtelemetry".equals(request.getPath())) { + try { + MinimalTelemetryData minimal = + moshi.adapter(MinimalTelemetryData.class).fromJson(data); + if ("logs".equals(minimal.request_type)) { + crashEvents.add(moshi.adapter(CrashTelemetryData.class).fromJson(data)); } - System.out.println(data); - return new MockResponse().setResponseCode(200); + } catch (IOException e) { + System.out.println("Unable to parse: " + e); } - }); + } + System.out.println(data); + return new MockResponse().setResponseCode(200); + } + }); OUTPUT.clearMessages(); } diff --git a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java index 67f1edb9e0e..ad9f814ac1a 100644 --- a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java +++ b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/CrashtrackingSmokeTest.java @@ -51,19 +51,17 @@ private static String getExtension() { void testAutoInjection() throws Exception { assumeTrue(OperatingSystem.isLinux()); // we support only linux ATM - ProcessBuilder pb = - new ProcessBuilder( - Arrays.asList( - javaPath(), - "-javaagent:" + agentShadowJar(), - "-Xmx96m", - "-Xms96m", - "-XX:+CrashOnOutOfMemoryError", // Use OOME to trigger crash - "-Ddd.dogstatsd.start-delay=0", // Minimize the delay to initialize JMX and create - // no need to specify the scripts - "-Ddd.trace.enabled=false", - "-jar", - appShadowJar())); + ProcessBuilder pb = new ProcessBuilder(Arrays.asList( + javaPath(), + "-javaagent:" + agentShadowJar(), + "-Xmx96m", + "-Xms96m", + "-XX:+CrashOnOutOfMemoryError", // Use OOME to trigger crash + "-Ddd.dogstatsd.start-delay=0", // Minimize the delay to initialize JMX and create + // no need to specify the scripts + "-Ddd.trace.enabled=false", + "-jar", + appShadowJar())); pb.environment().put("DD_TRACE_AGENT_PORT", String.valueOf(tracingServer.getPort())); @@ -84,10 +82,9 @@ void testCrashTracking() throws Exception { String onErrorValue = script + " %p"; String errorFile = tempDir.resolve("hs_err.log").toString(); - String onErrorArg = - !Platform.isLinux() - ? "-XX:OnError=" + onErrorValue - : "-Ddd.crashtracking.debug.autoconfig.enable=true"; // on Linux we can automatically + String onErrorArg = !Platform.isLinux() + ? "-XX:OnError=" + onErrorValue + : "-Ddd.crashtracking.debug.autoconfig.enable=true"; // on Linux we can automatically // inject the arg List processArgs = new ArrayList<>(); processArgs.add(javaPath()); @@ -109,7 +106,8 @@ void testCrashTracking() throws Exception { pb.environment().put("DD_TRACE_AGENT_PORT", String.valueOf(tracingServer.getPort())); Process p = pb.start(); - OUTPUT.captureOutput(p, LOG_FILE_DIR.resolve("testProcess.testCrashTracking.log").toFile()); + OUTPUT.captureOutput( + p, LOG_FILE_DIR.resolve("testProcess.testCrashTracking.log").toFile()); assertExpectedCrash(p); assertCrashData(assertCrashPing()); @@ -124,21 +122,19 @@ void testCrashTrackingLegacy() throws Exception { String script = tempDir.resolve("dd_crash_uploader." + getExtension()).toString(); String errorFile = tempDir.resolve("hs_err.log").toString(); - ProcessBuilder pb = - new ProcessBuilder( - Arrays.asList( - javaPath(), - "-javaagent:" + agentShadowJar(), - "-Xmx96m", - "-Xms96m", - "-XX:OnError=" + script, - "-XX:ErrorFile=" + errorFile, - "-XX:+CrashOnOutOfMemoryError", // Use OOME to trigger crash - "-Ddd.dogstatsd.start-delay=0", // Minimize the delay to initialize JMX and create - // the scripts - "-Ddd.trace.enabled=false", - "-jar", - appShadowJar())); + ProcessBuilder pb = new ProcessBuilder(Arrays.asList( + javaPath(), + "-javaagent:" + agentShadowJar(), + "-Xmx96m", + "-Xms96m", + "-XX:OnError=" + script, + "-XX:ErrorFile=" + errorFile, + "-XX:+CrashOnOutOfMemoryError", // Use OOME to trigger crash + "-Ddd.dogstatsd.start-delay=0", // Minimize the delay to initialize JMX and create + // the scripts + "-Ddd.trace.enabled=false", + "-jar", + appShadowJar())); pb.environment().put("DD_TRACE_AGENT_PORT", String.valueOf(tracingServer.getPort())); Process p = pb.start(); @@ -160,10 +156,9 @@ void testOomeTracking() throws Exception { String onErrorValue = script + " %p"; String errorFile = tempDir.resolve("hs_err_pid%p.log").toString(); - String onOOMEArg = - !Platform.isLinux() - ? "-XX:OnOutOfMemoryError=" + onErrorValue - : "-Ddd.crashtracking.debug.autoconfig.enable=true"; // on Linux we can automatically + String onOOMEArg = !Platform.isLinux() + ? "-XX:OnOutOfMemoryError=" + onErrorValue + : "-Ddd.crashtracking.debug.autoconfig.enable=true"; // on Linux we can automatically // inject the arg List processArgs = new ArrayList<>(); @@ -189,7 +184,8 @@ void testOomeTracking() throws Exception { System.out.println("==> Process args: " + pb.command()); Process p = pb.start(); - OUTPUT.captureOutput(p, LOG_FILE_DIR.resolve("testProcess.testOomeTracking.log").toFile()); + OUTPUT.captureOutput( + p, LOG_FILE_DIR.resolve("testProcess.testOomeTracking.log").toFile()); assertExpectedCrash(p); assertOOMEvent(); @@ -203,27 +199,26 @@ void testCombineTracking() throws Exception { String onOomeValue = oomeScript + " %p"; String errorFile = tempDir.resolve("hs_err.log").toString(); - ProcessBuilder pb = - new ProcessBuilder( - Arrays.asList( - javaPath(), - "-javaagent:" + agentShadowJar(), - "-Xmx96m", - "-Xms96m", - "-XX:OnOutOfMemoryError=" + onOomeValue, - "-XX:OnError=" + onErrorValue, - "-XX:ErrorFile=" + errorFile, - "-XX:+CrashOnOutOfMemoryError", // Use OOME to trigger crash - "-Ddd.dogstatsd.start-delay=0", // Minimize the delay to initialize JMX and create - // the scripts - "-Ddd.trace.enabled=false", - "-jar", - appShadowJar())); + ProcessBuilder pb = new ProcessBuilder(Arrays.asList( + javaPath(), + "-javaagent:" + agentShadowJar(), + "-Xmx96m", + "-Xms96m", + "-XX:OnOutOfMemoryError=" + onOomeValue, + "-XX:OnError=" + onErrorValue, + "-XX:ErrorFile=" + errorFile, + "-XX:+CrashOnOutOfMemoryError", // Use OOME to trigger crash + "-Ddd.dogstatsd.start-delay=0", // Minimize the delay to initialize JMX and create + // the scripts + "-Ddd.trace.enabled=false", + "-jar", + appShadowJar())); pb.environment().put("DD_TRACE_AGENT_PORT", String.valueOf(tracingServer.getPort())); pb.environment().put("DD_DOGSTATSD_PORT", String.valueOf(udpServer.getPort())); Process p = pb.start(); - OUTPUT.captureOutput(p, LOG_FILE_DIR.resolve("testProcess.testCombineTracking.log").toFile()); + OUTPUT.captureOutput( + p, LOG_FILE_DIR.resolve("testProcess.testCombineTracking.log").toFile()); assertExpectedCrash(p); assertCrashData(assertCrashPing()); @@ -245,10 +240,9 @@ void testOomeTrackingWithInheritedEnvVars() throws Exception { String onErrorValue = script + " %p"; String errorFile = tempDir.resolve("hs_err_pid%p.log").toString(); - String onOOMEArg = - !Platform.isLinux() - ? "-XX:OnOutOfMemoryError=" + onErrorValue - : "-Ddd.crashtracking.debug.autoconfig.enable=true"; + String onOOMEArg = !Platform.isLinux() + ? "-XX:OnOutOfMemoryError=" + onErrorValue + : "-Ddd.crashtracking.debug.autoconfig.enable=true"; List processArgs = new ArrayList<>(); processArgs.add(javaPath()); @@ -284,7 +278,10 @@ void testOomeTrackingWithInheritedEnvVars() throws Exception { Process p = pb.start(); OUTPUT.captureOutput( - p, LOG_FILE_DIR.resolve("testProcess.testOomeTrackingWithInheritedEnvVars.log").toFile()); + p, + LOG_FILE_DIR + .resolve("testProcess.testOomeTrackingWithInheritedEnvVars.log") + .toFile()); assertExpectedCrash(p); assertOOMEvent(); @@ -305,10 +302,9 @@ void testCrashTrackingWithInheritedEnvVars() throws Exception { String onErrorValue = script + " %p"; String errorFile = tempDir.resolve("hs_err.log").toString(); - String onErrorArg = - !Platform.isLinux() - ? "-XX:OnError=" + onErrorValue - : "-Ddd.crashtracking.debug.autoconfig.enable=true"; + String onErrorArg = !Platform.isLinux() + ? "-XX:OnError=" + onErrorValue + : "-Ddd.crashtracking.debug.autoconfig.enable=true"; List processArgs = new ArrayList<>(); processArgs.add(javaPath()); @@ -344,7 +340,10 @@ void testCrashTrackingWithInheritedEnvVars() throws Exception { Process p = pb.start(); OUTPUT.captureOutput( - p, LOG_FILE_DIR.resolve("testProcess.testCrashTrackingWithInheritedEnvVars.log").toFile()); + p, + LOG_FILE_DIR + .resolve("testProcess.testCrashTrackingWithInheritedEnvVars.log") + .toFile()); assertExpectedCrash(p); assertCrashData(assertCrashPing()); diff --git a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/OpenJ9CrashtrackingSmokeTest.java b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/OpenJ9CrashtrackingSmokeTest.java index a319b53b2b5..d9bd57503f0 100644 --- a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/OpenJ9CrashtrackingSmokeTest.java +++ b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/OpenJ9CrashtrackingSmokeTest.java @@ -38,7 +38,8 @@ protected long crashDataTimeoutMs() { @Test void testCrashTracking() throws Exception { String script = tempDir.resolve("dd_crash_uploader.sh").toString(); - String javacorePattern = tempDir.resolve("javacore.%Y%m%d.%H%M%S.%pid.%seq.txt").toString(); + String javacorePattern = + tempDir.resolve("javacore.%Y%m%d.%H%M%S.%pid.%seq.txt").toString(); List jvmArgs = new ArrayList<>(); jvmArgs.add(javaPath()); @@ -59,7 +60,8 @@ void testCrashTracking() throws Exception { pb.environment().put("DD_TRACE_AGENT_PORT", String.valueOf(tracingServer.getPort())); Process p = pb.start(); - OUTPUT.captureOutput(p, LOG_FILE_DIR.resolve("testProcess.openj9CrashTracking.log").toFile()); + OUTPUT.captureOutput( + p, LOG_FILE_DIR.resolve("testProcess.openj9CrashTracking.log").toFile()); // OpenJ9 runs the dump tool synchronously on crash, so the upload completes before JVM exits assertTrue(p.waitFor(60, TimeUnit.SECONDS), "JVM did not exit within 60s after crash"); diff --git a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/TestUDPServer.java b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/TestUDPServer.java index a748b907467..8f29f7d12b9 100644 --- a/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/TestUDPServer.java +++ b/dd-smoke-tests/crashtracking/src/test/java/datadog/smoketest/TestUDPServer.java @@ -49,38 +49,36 @@ public synchronized void start() throws SocketException { socket = new DatagramSocket(port); socket.setSoTimeout(timeout); - readerThread = - new Thread( - () -> { - while (!closed && !closing) { - byte[] data = new byte[packetSize]; - try { - DatagramPacket packet = new DatagramPacket(data, packetSize); - socket.receive(packet); - - byte[] trimmedData = new byte[packet.getLength()]; - System.arraycopy( - packet.getData(), packet.getOffset(), trimmedData, 0, packet.getLength()); - - if (Arrays.equals(trimmedData, END_MESSAGE)) { - System.err.println("[TestUDPServer] Received message to close"); - break; - } - System.err.println( - "[TestUDPServer] Received message: " + new String(trimmedData)); - dataPackets.add(new String(trimmedData)); - } catch (SocketTimeoutException e) { - System.err.println("[TestUDPServer] Timeout waiting for message"); - // ignore no data sent - } catch (IOException e) { - System.err.println("[TestUDPServer] Error in receiving packet " + e.getMessage()); - e.printStackTrace(); - break; - } + readerThread = new Thread( + () -> { + while (!closed && !closing) { + byte[] data = new byte[packetSize]; + try { + DatagramPacket packet = new DatagramPacket(data, packetSize); + socket.receive(packet); + + byte[] trimmedData = new byte[packet.getLength()]; + System.arraycopy( + packet.getData(), packet.getOffset(), trimmedData, 0, packet.getLength()); + + if (Arrays.equals(trimmedData, END_MESSAGE)) { + System.err.println("[TestUDPServer] Received message to close"); + break; } - closed = true; - }, - "Test UDP Server Receiver"); + System.err.println("[TestUDPServer] Received message: " + new String(trimmedData)); + dataPackets.add(new String(trimmedData)); + } catch (SocketTimeoutException e) { + System.err.println("[TestUDPServer] Timeout waiting for message"); + // ignore no data sent + } catch (IOException e) { + System.err.println("[TestUDPServer] Error in receiving packet " + e.getMessage()); + e.printStackTrace(); + break; + } + } + closed = true; + }, + "Test UDP Server Receiver"); readerThread.setDaemon(true); readerThread.start(); @@ -99,9 +97,8 @@ public synchronized void close() { closing = true; try (DatagramSocket clientSocket = new DatagramSocket()) { - clientSocket.send( - new DatagramPacket( - END_MESSAGE, END_MESSAGE.length, InetAddress.getByName("localhost"), getPort())); + clientSocket.send(new DatagramPacket( + END_MESSAGE, END_MESSAGE.length, InetAddress.getByName("localhost"), getPort())); } catch (IOException e) { System.err.println( "[TestUDPServer] Exception sending close message. Will rely on socket timeout"); diff --git a/dd-smoke-tests/datastreams/kafkaschemaregistry/src/main/java/datadog/smoketest/datastreams/kafkaschemaregistry/Message.java b/dd-smoke-tests/datastreams/kafkaschemaregistry/src/main/java/datadog/smoketest/datastreams/kafkaschemaregistry/Message.java index 0739a00c81e..d3df59c14e8 100644 --- a/dd-smoke-tests/datastreams/kafkaschemaregistry/src/main/java/datadog/smoketest/datastreams/kafkaschemaregistry/Message.java +++ b/dd-smoke-tests/datastreams/kafkaschemaregistry/src/main/java/datadog/smoketest/datastreams/kafkaschemaregistry/Message.java @@ -486,25 +486,22 @@ public Builder mergeFrom( case 0: done = true; break; - case 10: - { - id_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000001; - break; - } // case 10 - case 18: - { - value_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } // case 18 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - done = true; // was an endgroup tag - } - break; - } // default: + case 10: { + id_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: { + value_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: } // switch (tag) } // while (!done) } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -759,14 +756,12 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { "\n\rmessage.proto\"&\n\tMyMessage\022\n\n\002id\030\001 \001(\t" + "\022\r\n\005value\030\002 \001(\tb\006proto3" }; - descriptor = - com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( - descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}); + descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( + descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}); internal_static_MyMessage_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_MyMessage_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( - internal_static_MyMessage_descriptor, - new java.lang.String[] { + internal_static_MyMessage_descriptor, new java.lang.String[] { "Id", "Value", }); } diff --git a/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/DebuggerTestApplication.java b/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/DebuggerTestApplication.java index 030167f6496..9670aa8465d 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/DebuggerTestApplication.java +++ b/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/DebuggerTestApplication.java @@ -93,14 +93,7 @@ private static String fullMethod( int argInt, String argStr, double argDouble, Map argMap, String... argVar) { try { System.out.println("fullMethod"); - return argInt - + ", " - + argStr - + ", " - + argDouble - + ", " - + argMap - + ", " + return argInt + ", " + argStr + ", " + argDouble + ", " + argMap + ", " + String.join(",", argVar); } catch (Exception ex) { ex.printStackTrace(); diff --git a/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/ServerDebuggerTestApplication.java b/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/ServerDebuggerTestApplication.java index c1742293cd3..5b68d416213 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/ServerDebuggerTestApplication.java +++ b/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/ServerDebuggerTestApplication.java @@ -67,14 +67,13 @@ public void start() throws Exception { protected void stop() { System.out.println("Stopping app..."); - new Thread( - () -> { - try { - webServer.shutdown(); - } catch (IOException e) { - e.printStackTrace(); - } - }) + new Thread(() -> { + try { + webServer.shutdown(); + } catch (IOException e) { + e.printStackTrace(); + } + }) .start(); } @@ -185,14 +184,7 @@ private static String runTopLevelMethod(String arg) { private static String fullMethod( int argInt, String argStr, double argDouble, Map argMap, String... argVar) { try { - return argInt - + ", " - + argStr - + ", " - + argDouble - + ", " - + argMap - + ", " + return argInt + ", " + argStr + ", " + argDouble + ", " + argMap + ", " + String.join(",", argVar); } catch (Exception ex) { ex.printStackTrace(); @@ -203,14 +195,7 @@ private static String fullMethod( private static String tracedMethod( int argInt, String argStr, double argDouble, Map argMap, String... argVar) { try { - return argInt - + ", " - + argStr - + ", " - + argDouble - + ", " - + argMap - + ", " + return argInt + ", " + argStr + ", " + argDouble + ", " + argMap + ", " + String.join(",", argVar); } catch (Exception ex) { ex.printStackTrace(); @@ -281,41 +266,35 @@ public AppDispatcher(ServerDebuggerTestApplication app) { public MockResponse dispatch(RecordedRequest request) throws InterruptedException { String path = request.getRequestUrl().url().getPath(); switch (path) { - case "/app/waitForInstrumentation": - { - String className = request.getRequestUrl().queryParameter("classname"); - app.waitForInstrumentation(className); - break; - } - case "/app/waitForReTransformation": - { - String className = request.getRequestUrl().queryParameter("classname"); - app.waitForReTransformation(className); - break; - } - case "/app/waitForExceptionFingerprint": - { - app.waitForExceptionFingerprint(); - break; - } - case "/app/waitForSpecificLine": - { - String feature = request.getRequestUrl().queryParameter("line"); - app.waitForSpecificLine(feature); - break; - } - case "/app/execute": - { - String methodName = request.getRequestUrl().queryParameter("methodname"); - String arg = request.getRequestUrl().queryParameter("arg"); - app.execute(methodName, arg); - break; - } - case "/app/stop": - { - app.stop(); - break; - } + case "/app/waitForInstrumentation": { + String className = request.getRequestUrl().queryParameter("classname"); + app.waitForInstrumentation(className); + break; + } + case "/app/waitForReTransformation": { + String className = request.getRequestUrl().queryParameter("classname"); + app.waitForReTransformation(className); + break; + } + case "/app/waitForExceptionFingerprint": { + app.waitForExceptionFingerprint(); + break; + } + case "/app/waitForSpecificLine": { + String feature = request.getRequestUrl().queryParameter("line"); + app.waitForSpecificLine(feature); + break; + } + case "/app/execute": { + String methodName = request.getRequestUrl().queryParameter("methodname"); + String arg = request.getRequestUrl().queryParameter("arg"); + app.execute(methodName, arg); + break; + } + case "/app/stop": { + app.stop(); + break; + } default: throw new IllegalArgumentException("Unsupported url path: " + path); } diff --git a/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/TestApplicationHelper.java b/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/TestApplicationHelper.java index 02ca0dd989c..4e0aae10d90 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/TestApplicationHelper.java +++ b/dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/TestApplicationHelper.java @@ -33,9 +33,8 @@ public class TestApplicationHelper { public static void waitForTransformerInstalled(String logFileName) throws IOException { waitForSpecificLogLine( Paths.get(logFileName), - line -> - line.contains( - "DEBUG com.datadog.debugger.agent.ConfigurationUpdater - New transformer installed"), + line -> line.contains( + "DEBUG com.datadog.debugger.agent.ConfigurationUpdater - New transformer installed"), () -> {}, Duration.ofMillis(SLEEP_MS), Duration.ofSeconds(TIMEOUT_S)); @@ -157,16 +156,14 @@ private static String waitForSpecificLogLine( System.err.flush(); init.run(); AtomicBoolean fromLineMatched = new AtomicBoolean(fromLineMatcher == null); - Files.lines(logFilePath) - .forEach( - line -> { - if (!fromLineMatched.get()) { - fromLineMatched.set(fromLineMatcher.test(line)); - } else if (lineMatcher.test(line)) { - matchedLine.set(line); - result.set(true); - } - }); + Files.lines(logFilePath).forEach(line -> { + if (!fromLineMatched.get()) { + fromLineMatched.set(fromLineMatcher.test(line)); + } else if (lineMatcher.test(line)) { + matchedLine.set(line); + result.set(true); + } + }); LockSupport.parkNanos(sleep.toNanos()); i++; } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/AgentDebuggerIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/AgentDebuggerIntegrationTest.java index 47d009c7d01..51ab5708e5b 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/AgentDebuggerIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/AgentDebuggerIntegrationTest.java @@ -28,15 +28,13 @@ void testLatestJdk() throws Exception { return; // execute test only if classpath is provided for the latest jdk } List commandParams = getDebuggerCommandParams(); - targetProcess = - ProcessBuilderHelper.createProcessBuilder( - classpath, commandParams, logFilePath, "App", EXPECTED_UPLOADS) - .start(); + targetProcess = ProcessBuilderHelper.createProcessBuilder( + classpath, commandParams, logFilePath, "App", EXPECTED_UPLOADS) + .start(); AtomicBoolean snapshotReceived = new AtomicBoolean(false); - registerSnapshotListener( - snapshot -> { - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + snapshotReceived.set(true); + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); @@ -51,12 +49,12 @@ void testShutdown() throws Exception { LogProbe probe = LogProbe.builder().probeId(PROBE_ID).where(MAIN_CLASS_NAME, METHOD_NAME).build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(false); - registerSnapshotListener( - snapshot -> { - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + snapshotReceived.set(true); + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); @@ -74,16 +72,15 @@ void testDestroy() throws Exception { LogProbe probe = LogProbe.builder().probeId(PROBE_ID).where(MAIN_CLASS_NAME, METHOD_NAME).build(); setCurrentConfiguration(createConfig(probe)); - datadogAgentServer.enqueue( - new MockResponse() - .setHeadersDelay(REQUEST_WAIT_TIMEOUT * 2, TimeUnit.SECONDS) - .setResponseCode(200)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + datadogAgentServer.enqueue(new MockResponse() + .setHeadersDelay(REQUEST_WAIT_TIMEOUT * 2, TimeUnit.SECONDS) + .setResponseCode(200)); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(false); - registerSnapshotListener( - snapshot -> { - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + snapshotReceived.set(true); + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); @@ -102,27 +99,24 @@ void testEndpoints() throws Exception { logFilePath.toString(), "INFO com.datadog.debugger.agent.DebuggerAgent - Started Dynamic Instrumentation", null); - Assertions.assertFalse( - logHasErrors( - logFilePath, - line -> { - if (line.contains("Started BatchUploader[Diagnostics]")) { - return !line.matches( - ".* Started BatchUploader\\[Diagnostics] with target url http://localhost:\\d+/debugger/v1/diagnostics"); - } - if (line.contains("Started BatchUploader[Snapshots]")) { - return !line.matches( - ".* Started BatchUploader\\[Snapshots] with target url http://localhost:\\d+/debugger/v1/diagnostics"); - } - if (line.contains("Started BatchUploader[Logs]")) { - return !line.matches( - ".* Started BatchUploader\\[Logs] with target url http://localhost:\\d+/debugger/v1/diagnostics"); - } - if (line.contains("Started BatchUploader[SymDB]")) { - return !line.matches( - ".* Started BatchUploader\\[SymDB] with target url http://localhost:\\d+/symdb/v1/input"); - } - return false; - })); + Assertions.assertFalse(logHasErrors(logFilePath, line -> { + if (line.contains("Started BatchUploader[Diagnostics]")) { + return !line.matches( + ".* Started BatchUploader\\[Diagnostics] with target url http://localhost:\\d+/debugger/v1/diagnostics"); + } + if (line.contains("Started BatchUploader[Snapshots]")) { + return !line.matches( + ".* Started BatchUploader\\[Snapshots] with target url http://localhost:\\d+/debugger/v1/diagnostics"); + } + if (line.contains("Started BatchUploader[Logs]")) { + return !line.matches( + ".* Started BatchUploader\\[Logs] with target url http://localhost:\\d+/debugger/v1/diagnostics"); + } + if (line.contains("Started BatchUploader[SymDB]")) { + return !line.matches( + ".* Started BatchUploader\\[SymDB] with target url http://localhost:\\d+/symdb/v1/input"); + } + return false; + })); } } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java index 34560553807..e7c2ec53384 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java @@ -71,21 +71,19 @@ public abstract class BaseIntegrationTest { protected static final String SNAPSHOT_UPLOAD_URL_PATH = "/debugger/v2/input"; protected static final String DIAGNOSTICS_URL_PATH = "/debugger/v1/diagnostics"; protected static final int REQUEST_WAIT_TIMEOUT = 10; - private static final Path LOG_FILE_BASE = - Paths.get( - buildDirectory(), - "reports", - "testProcess." + SimpleAppDebuggerIntegrationTest.class.getName()); - private static final String INFO_CONTENT = - "{\"endpoints\": [\"" - + TRACE_URL_PATH - + "\", \"" - + LOG_UPLOAD_URL_PATH - + "\", \"" - + DIAGNOSTICS_URL_PATH - + "\", \"" - + CONFIG_URL_PATH - + "\"]}"; + private static final Path LOG_FILE_BASE = Paths.get( + buildDirectory(), + "reports", + "testProcess." + SimpleAppDebuggerIntegrationTest.class.getName()); + private static final String INFO_CONTENT = "{\"endpoints\": [\"" + + TRACE_URL_PATH + + "\", \"" + + LOG_UPLOAD_URL_PATH + + "\", \"" + + DIAGNOSTICS_URL_PATH + + "\", \"" + + CONFIG_URL_PATH + + "\"]}"; private static final MockResponse AGENT_INFO_RESPONSE = new MockResponse().setResponseCode(200).setBody(INFO_CONTENT); private static final MockResponse TELEMETRY_RESPONSE = new MockResponse().setResponseCode(202); @@ -158,27 +156,26 @@ protected ProcessBuilder createProcessBuilder(Path logFilePath, String... params protected abstract String getAppId(); protected List getDebuggerCommandParams() { - return new ArrayList<>( - Arrays.asList( - "-Ddd.service.name=" + getAppId(), - "-Ddd.profiling.enabled=false", - "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=info", - "-Ddatadog.slf4j.simpleLogger.log.datadog.trace.agent.core=debug", - "-Ddatadog.slf4j.simpleLogger.log.com.datadog.debugger=debug", - "-Ddatadog.slf4j.simpleLogger.log.datadog.trace.bootstrap.debugger=debug", - "-Ddatadog.slf4j.simpleLogger.log.datadog.remoteconfig=debug", - "-Ddd.jmxfetch.start-delay=0", - "-Ddd.jmxfetch.enabled=false", - "-Ddd.dynamic.instrumentation.enabled=true", - "-Ddd.remote_config.poll_interval.seconds=1", - "-Ddd.trace.agent.url=http://localhost:" + datadogAgentServer.getPort(), - "-Ddd.jmxfetch.statsd.port=" + statsDServer.getPort(), - "-Ddd.dynamic.instrumentation.classfile.dump.enabled=true", - "-Ddd.dynamic.instrumentation.upload.batch.size=" + batchSize, - // flush uploads every 100ms to have quick tests - "-Ddd.dynamic.instrumentation.upload.flush.interval=100", - // increase timeout for serialization - "-Ddd.dynamic.instrumentation.capture.timeout=30000")); + return new ArrayList<>(Arrays.asList( + "-Ddd.service.name=" + getAppId(), + "-Ddd.profiling.enabled=false", + "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=info", + "-Ddatadog.slf4j.simpleLogger.log.datadog.trace.agent.core=debug", + "-Ddatadog.slf4j.simpleLogger.log.com.datadog.debugger=debug", + "-Ddatadog.slf4j.simpleLogger.log.datadog.trace.bootstrap.debugger=debug", + "-Ddatadog.slf4j.simpleLogger.log.datadog.remoteconfig=debug", + "-Ddd.jmxfetch.start-delay=0", + "-Ddd.jmxfetch.enabled=false", + "-Ddd.dynamic.instrumentation.enabled=true", + "-Ddd.remote_config.poll_interval.seconds=1", + "-Ddd.trace.agent.url=http://localhost:" + datadogAgentServer.getPort(), + "-Ddd.jmxfetch.statsd.port=" + statsDServer.getPort(), + "-Ddd.dynamic.instrumentation.classfile.dump.enabled=true", + "-Ddd.dynamic.instrumentation.upload.batch.size=" + batchSize, + // flush uploads every 100ms to have quick tests + "-Ddd.dynamic.instrumentation.upload.flush.interval=100", + // increase timeout for serialization + "-Ddd.dynamic.instrumentation.capture.timeout=30000")); } protected enum RequestType { @@ -246,9 +243,8 @@ public void process(BaseIntegrationTest baseIntegrationTest, RecordedRequest req } catch (IOException ex) { ex.printStackTrace(); } - JsonAdapter> adapter = - MoshiHelper.createMoshiProbeStatus() - .adapter(Types.newParameterizedType(List.class, ProbeStatus.class)); + JsonAdapter> adapter = MoshiHelper.createMoshiProbeStatus() + .adapter(Types.newParameterizedType(List.class, ProbeStatus.class)); String bodyStr = request.getBody().readUtf8(); LOG.info("got probe status: {}", bodyStr); try { @@ -296,7 +292,8 @@ private static String parseMultiPart(RecordedRequest request, String bodyStr) th // Parse headers int colon = line.indexOf(':'); if (colon != -1) { - partHeaders.add(line.substring(0, colon).trim(), line.substring(colon + 1).trim()); + partHeaders.add( + line.substring(0, colon).trim(), line.substring(colon + 1).trim()); } } @@ -338,21 +335,20 @@ protected AtomicBoolean registerCheckReceivedInstalledEmitting(ProbeId probeId) AtomicBoolean installed = new AtomicBoolean(); AtomicBoolean emitting = new AtomicBoolean(); AtomicBoolean result = new AtomicBoolean(); - registerProbeStatusListener( - probeStatus -> { - if (probeStatus.getDiagnostics().getProbeId().equals(probeId)) { - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { - received.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.INSTALLED) { - installed.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.EMITTING) { - emitting.set(true); - } - result.set(received.get() && installed.get() && emitting.get()); - } - }); + registerProbeStatusListener(probeStatus -> { + if (probeStatus.getDiagnostics().getProbeId().equals(probeId)) { + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { + received.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.INSTALLED) { + installed.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.EMITTING) { + emitting.set(true); + } + result.set(received.get() && installed.get() && emitting.get()); + } + }); return result; } @@ -469,9 +465,8 @@ protected MockResponse handleConfigRequests() { new Moshi.Builder().build().adapter(ConfigOverrides.class); String configOverridesJson = configAdapter.toJson(configOverrides); LOG.info("Sending configOverrides json: {}", configOverridesJson); - remoteConfigs.add( - new RemoteConfigHelper.RemoteConfig( - APM_TRACING_PRODUCT, configOverridesJson, APM_CONFIG_ID)); + remoteConfigs.add(new RemoteConfigHelper.RemoteConfig( + APM_TRACING_PRODUCT, configOverridesJson, APM_CONFIG_ID)); } String remoteConfigJson = RemoteConfigHelper.encode(remoteConfigs); return new MockResponse().setResponseCode(200).setBody(remoteConfigJson); @@ -487,9 +482,8 @@ private static void addToRemoteConfig( for (T probe : probes) { String json = probeAdapter.toJson(probe); LOG.info("Sending {} json: {}", probe.getClass().getSimpleName(), json); - remoteConfigs.add( - new RemoteConfigHelper.RemoteConfig( - LIVE_DEBUGGING_PRODUCT, json, getProbePrefix(probe) + UUID.randomUUID())); + remoteConfigs.add(new RemoteConfigHelper.RemoteConfig( + LIVE_DEBUGGING_PRODUCT, json, getProbePrefix(probe) + UUID.randomUUID())); } } @@ -559,7 +553,10 @@ protected Configuration createMetricConfig(MetricProbe metricProbe) { } protected Configuration createSpanDecoConfig(SpanDecorationProbe spanDecorationProbe) { - return Configuration.builder().setService(getAppId()).add(spanDecorationProbe).build(); + return Configuration.builder() + .setService(getAppId()) + .add(spanDecorationProbe) + .build(); } protected Configuration createSpanConfig(SpanProbe spanProbe) { @@ -618,16 +615,13 @@ protected void assertCaptureThrowable( protected static boolean logHasErrors(Path logFilePath, Function checker) { try { - long errorLines = - Files.lines(logFilePath) - .filter( - it -> - it.contains(" ERROR ") - || it.contains("ASSERTION FAILED") - || it.contains("Error:") - || checker.apply(it)) - .peek(System.out::println) - .count(); + long errorLines = Files.lines(logFilePath) + .filter(it -> it.contains(" ERROR ") + || it.contains("ASSERTION FAILED") + || it.contains("Error:") + || checker.apply(it)) + .peek(System.out::println) + .count(); boolean hasErrors = errorLines > 0; if (hasErrors) { LOG.info("Test application log is containing errors. See full run logs in {}", logFilePath); diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/CodeOriginIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/CodeOriginIntegrationTest.java index dbf83505afd..040a13e905c 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/CodeOriginIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/CodeOriginIntegrationTest.java @@ -35,24 +35,22 @@ void testCodeOriginTraceAnnotation() throws Exception { waitForInstrumentation(appUrl); execute(appUrl, TRACED_METHOD_NAME); AtomicBoolean codeOrigin = new AtomicBoolean(); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - if (span.getMeta().containsKey(DDTags.DD_CODE_ORIGIN_TYPE)) { - assertEquals("entry", span.getMeta().get(DDTags.DD_CODE_ORIGIN_TYPE)); - assertEquals( - "ServerDebuggerTestApplication.java", - span.getMeta().get(DD_CODE_ORIGIN_FRAME_FILE)); - assertEquals("runTracedMethod", span.getMeta().get(DD_CODE_ORIGIN_FRAME_METHOD)); - assertEquals( - "(java.lang.String)", span.getMeta().get(DD_CODE_ORIGIN_FRAME_SIGNATURE)); - assertEquals("158", span.getMeta().get(DD_CODE_ORIGIN_FRAME_LINE)); - codeOrigin.set(true); - } - } + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + if (span.getMeta().containsKey(DDTags.DD_CODE_ORIGIN_TYPE)) { + assertEquals("entry", span.getMeta().get(DDTags.DD_CODE_ORIGIN_TYPE)); + assertEquals( + "ServerDebuggerTestApplication.java", + span.getMeta().get(DD_CODE_ORIGIN_FRAME_FILE)); + assertEquals("runTracedMethod", span.getMeta().get(DD_CODE_ORIGIN_FRAME_METHOD)); + assertEquals("(java.lang.String)", span.getMeta().get(DD_CODE_ORIGIN_FRAME_SIGNATURE)); + assertEquals("158", span.getMeta().get(DD_CODE_ORIGIN_FRAME_LINE)); + codeOrigin.set(true); } - }); + } + } + }); processRequests( codeOrigin::get, () -> String.format("timeout codeOrigin=%s", codeOrigin.get())); } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ExceptionDebuggerIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ExceptionDebuggerIntegrationTest.java index a544da9f253..38c34f813c9 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ExceptionDebuggerIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ExceptionDebuggerIntegrationTest.java @@ -29,11 +29,9 @@ public class ExceptionDebuggerIntegrationTest extends ServerAppDebuggerIntegrati private boolean snapshotReceived; private Map snapshots = new HashMap<>(); private List additionalJvmArgs = new ArrayList<>(); - private Supplier timeoutMessage = - () -> - String.format( - "Timeout! traceReceived=%s snapshotReceived=%s #snapshots=%d", - traceReceived, snapshotReceived, snapshots.size()); + private Supplier timeoutMessage = () -> String.format( + "Timeout! traceReceived=%s snapshotReceived=%s #snapshots=%d", + traceReceived, snapshotReceived, snapshots.size()); @Override protected ProcessBuilder createProcessBuilder(Path logFilePath, String... params) { @@ -61,10 +59,9 @@ void testSimpleSingleFrameException() throws Exception { execute(appUrl, TRACED_METHOD_NAME, "oops"); // collecting snapshots and sending them registerTraceListener(this::receiveExceptionReplayTrace); registerSnapshotListener(this::receiveSnapshot); - registerIntakeRequestListener( - intakeRequest -> { - assertEquals("snapshot", intakeRequest.getType()); - }); + registerIntakeRequestListener(intakeRequest -> { + assertEquals("snapshot", intakeRequest.getType()); + }); processRequests( () -> { if (snapshotIdTags.isEmpty()) { @@ -75,7 +72,8 @@ void testSimpleSingleFrameException() throws Exception { Snapshot snapshot = snapshots.get(snapshotId0); assertNotNull(snapshot); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertFullMethodCaptureArgs(snapshot.getCaptures().getReturn()); return true; } @@ -95,16 +93,15 @@ void testNoSubsequentCaptureAfterFirst() throws Exception { resetSnapshotsAndTraces(); // we should not receive any more snapshots after the first one execute(appUrl, TRACED_METHOD_NAME, "oops"); // no snapshot should be sent - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - assertFalse(span.getMeta().containsKey("error.debug_info_captured")); - assertFalse(span.getMeta().containsKey("_dd.debug.error.0.snapshot_id")); - traceReceived = true; - } - } - }); + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + assertFalse(span.getMeta().containsKey("error.debug_info_captured")); + assertFalse(span.getMeta().containsKey("_dd.debug.error.0.snapshot_id")); + traceReceived = true; + } + } + }); processRequests(() -> traceReceived && !snapshotReceived, timeoutMessage); } @@ -146,7 +143,8 @@ void test3CapturedFrames() throws Exception { Snapshot snapshot = snapshots.get(snapshotId0); assertNotNull(snapshot); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithException", snapshot.getStack().get(0).getFunction()); @@ -154,7 +152,8 @@ void test3CapturedFrames() throws Exception { // snapshot 1 snapshot = snapshots.get(snapshotId1); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithDeepException5", snapshot.getStack().get(0).getFunction()); @@ -162,7 +161,8 @@ void test3CapturedFrames() throws Exception { // snapshot 2 snapshot = snapshots.get(snapshotId2); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithDeepException4", snapshot.getStack().get(0).getFunction()); @@ -208,7 +208,8 @@ void test5CapturedFrames() throws Exception { Snapshot snapshot = snapshots.get(snapshotId0); assertNotNull(snapshot); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithException", snapshot.getStack().get(0).getFunction()); @@ -216,7 +217,8 @@ void test5CapturedFrames() throws Exception { // snapshot 1 snapshot = snapshots.get(snapshotId1); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithDeepException5", snapshot.getStack().get(0).getFunction()); @@ -224,7 +226,8 @@ void test5CapturedFrames() throws Exception { // snapshot 2 snapshot = snapshots.get(snapshotId2); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithDeepException4", snapshot.getStack().get(0).getFunction()); @@ -232,7 +235,8 @@ void test5CapturedFrames() throws Exception { // snapshot 3 snapshot = snapshots.get(snapshotId3); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithDeepException3", snapshot.getStack().get(0).getFunction()); @@ -240,7 +244,8 @@ void test5CapturedFrames() throws Exception { // snapshot 4 snapshot = snapshots.get(snapshotId4); assertEquals( - "oops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "oops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithDeepException2", snapshot.getStack().get(0).getFunction()); @@ -292,7 +297,8 @@ void test3CapturedRecursiveFrames() throws Exception { private static void assertRecursiveSnapshot(Snapshot snapshot) { assertNotNull(snapshot); assertEquals( - "recursiveOops", snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); + "recursiveOops", + snapshot.getCaptures().getReturn().getCapturedThrowable().getMessage()); assertEquals( "datadog.smoketest.debugger.ServerDebuggerTestApplication.tracedMethodWithRecursiveException", snapshot.getStack().get(0).getFunction()); diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/InProductEnablementIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/InProductEnablementIntegrationTest.java index 602b7b6d197..6cf27c2b9bb 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/InProductEnablementIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/InProductEnablementIntegrationTest.java @@ -33,8 +33,10 @@ protected ProcessBuilder createProcessBuilder(Path logFilePath, String... params void testDynamicInstrumentationEnablement() throws Exception { appUrl = startAppAndAndGetUrl(); setConfigOverrides(createConfigOverrides(true, false)); - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .build(); setCurrentConfiguration(createConfig(probe)); waitForFeatureStarted(appUrl, "Dynamic Instrumentation"); waitForInstrumentation(appUrl); @@ -51,11 +53,10 @@ void testDynamicInstrumentationEnablementWithLineProbe() throws Exception { additionalJvmArgs.add("-Ddd.third.party.excludes=datadog.smoketest"); appUrl = startAppAndAndGetUrl(); setConfigOverrides(createConfigOverrides(true, false)); - LogProbe probe = - LogProbe.builder() - .probeId(LINE_PROBE_ID1) - .where("ServerDebuggerTestApplication.java", 329) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(LINE_PROBE_ID1) + .where("ServerDebuggerTestApplication.java", 329) + .build(); setCurrentConfiguration(createConfig(probe)); waitForFeatureStarted(appUrl, "Dynamic Instrumentation"); execute(appUrl, "topLevelMethod", ""); @@ -75,8 +76,10 @@ void testDynamicInstrumentationEnablementStaticallyDisabled() throws Exception { additionalJvmArgs.add("-Ddd.dynamic.instrumentation.enabled=false"); appUrl = startAppAndAndGetUrl(); setConfigOverrides(createConfigOverrides(true, false)); - LogProbe probe = - LogProbe.builder().probeId(PROBE_ID).where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME).build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .build(); setCurrentConfiguration(createConfig(probe)); waitForSpecificLine(appUrl, "Feature dynamic.instrumentation.enabled is explicitly disabled"); } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java index 4ff2d8bbfb3..fb00aac5c66 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java @@ -53,12 +53,12 @@ void testInaccessibleObject() throws Exception { LogProbe probe = LogProbe.builder().probeId(PROBE_ID).where(MAIN_CLASS_NAME, METHOD_NAME).build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(false); - registerSnapshotListener( - snapshot -> { - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + snapshotReceived.set(true); + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); @@ -70,43 +70,40 @@ void testInaccessibleObject() throws Exception { void testFullMethod() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .captureSnapshot(true) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .captureSnapshot(true) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerIntakeRequestListener( - intakeRequest -> { - assertEquals("snapshot", intakeRequest.getType()); - }); - registerSnapshotListener( - snapshot -> { - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertFullMethodCaptureArgs(snapshot.getCaptures().getEntry()); - assertNull(snapshot.getCaptures().getEntry().getLocals()); - assertNull(snapshot.getCaptures().getEntry().getCapturedThrowable()); - assertFullMethodCaptureArgs(snapshot.getCaptures().getReturn()); - assertCaptureReturnValue( - snapshot.getCaptures().getReturn(), - "java.lang.String", - "42, foobar, 3.42, {key1=val1, key2=val2, key3=val3}, var1,var2,var3"); - assertNotNull(snapshot.getCaptures().getReturn().getLocals()); - // @return is the only locals but ex is safely hoisted in the method - assertEquals(2, snapshot.getCaptures().getReturn().getLocals().size()); - assertNull(snapshot.getCaptures().getReturn().getCapturedThrowable()); - snapshotReceived.set(true); - }); + registerIntakeRequestListener(intakeRequest -> { + assertEquals("snapshot", intakeRequest.getType()); + }); + registerSnapshotListener(snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertFullMethodCaptureArgs(snapshot.getCaptures().getEntry()); + assertNull(snapshot.getCaptures().getEntry().getLocals()); + assertNull(snapshot.getCaptures().getEntry().getCapturedThrowable()); + assertFullMethodCaptureArgs(snapshot.getCaptures().getReturn()); + assertCaptureReturnValue( + snapshot.getCaptures().getReturn(), + "java.lang.String", + "42, foobar, 3.42, {key1=val1, key2=val2, key3=val3}, var1,var2,var3"); + assertNotNull(snapshot.getCaptures().getReturn().getLocals()); + // @return is the only locals but ex is safely hoisted in the method + assertEquals(2, snapshot.getCaptures().getReturn().getLocals().size()); + assertNull(snapshot.getCaptures().getReturn().getCapturedThrowable()); + snapshotReceived.set(true); + }); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), - () -> - String.format( - "timeout snapshotReceived=%s statusResult=%s", - snapshotReceived.get(), statusResult.get())); + () -> String.format( + "timeout snapshotReceived=%s statusResult=%s", + snapshotReceived.get(), statusResult.get())); } @Test @@ -114,31 +111,27 @@ void testFullMethod() throws Exception { void testFullMethodWithCondition() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .when( - new ProbeCondition( - when(eq(ref("argStr"), value("foobar"))), "argStr == \"foobar\"")) - .captureSnapshot(true) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .when(new ProbeCondition(when(eq(ref("argStr"), value("foobar"))), "argStr == \"foobar\"")) + .captureSnapshot(true) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertFullMethodCaptureArgs(snapshot.getCaptures().getEntry()); - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertFullMethodCaptureArgs(snapshot.getCaptures().getEntry()); + snapshotReceived.set(true); + }); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), - () -> - String.format( - "timeout snapshotReceived=%s statusResult=%s", - snapshotReceived.get(), statusResult.get())); + () -> String.format( + "timeout snapshotReceived=%s statusResult=%s", + snapshotReceived.get(), statusResult.get())); } @Test @@ -146,33 +139,30 @@ void testFullMethodWithCondition() throws Exception { void testFullMethodWithConditionAtExit() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .when( - new ProbeCondition( - when(and(gt(len(ref("@return")), value(0)), gt(ref("@duration"), value(0)))), - "len(@return) > 0 && @duration > 0")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .when(new ProbeCondition( + when(and(gt(len(ref("@return")), value(0)), gt(ref("@duration"), value(0)))), + "len(@return) > 0 && @duration > 0")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertFullMethodCaptureArgs(snapshot.getCaptures().getReturn()); - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertFullMethodCaptureArgs(snapshot.getCaptures().getReturn()); + snapshotReceived.set(true); + }); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), - () -> - String.format( - "timeout snapshotReceived=%s statusResult=%s", - snapshotReceived.get(), statusResult.get())); + () -> String.format( + "timeout snapshotReceived=%s statusResult=%s", + snapshotReceived.get(), statusResult.get())); } @Test @@ -180,32 +170,30 @@ void testFullMethodWithConditionAtExit() throws Exception { void testFullMethodWithConditionFailed() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .when(new ProbeCondition(when(eq(ref("noarg"), nullValue())), "noarg == null")) - .captureSnapshot(true) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .when(new ProbeCondition(when(eq(ref("noarg"), nullValue())), "noarg == null")) + .captureSnapshot(true) + .evaluateAt(MethodLocation.EXIT) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertEquals(1, snapshot.getEvaluationErrors().size()); - assertEquals( - "Cannot find symbol: noarg", snapshot.getEvaluationErrors().get(0).getMessage()); - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals(1, snapshot.getEvaluationErrors().size()); + assertEquals( + "Cannot find symbol: noarg", snapshot.getEvaluationErrors().get(0).getMessage()); + snapshotReceived.set(true); + }); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), - () -> - String.format( - "timeout snapshotReceived=%s statusResult=%s", - snapshotReceived.get(), statusResult.get())); + () -> String.format( + "timeout snapshotReceived=%s statusResult=%s", + snapshotReceived.get(), statusResult.get())); } @Test @@ -214,35 +202,32 @@ void testFullMethodWithLogTemplate() throws Exception { final String METHOD_NAME = "fullMethod"; final String LOG_TEMPLATE = "log line {argInt} {argStr} {argDouble} {argMap} {argVar}"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); AtomicBoolean correctLogMessage = new AtomicBoolean(); - registerIntakeRequestListener( - intakeRequest -> { - assertEquals( - "log line 42 foobar 3.42 {[key1=val1], [key2=val2], [key3=val3]} [var1, var2, var3]", - intakeRequest.getMessage()); - correctLogMessage.set(true); - }); - registerSnapshotListener( - snapshot -> { - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - snapshotReceived.set(true); - }); + registerIntakeRequestListener(intakeRequest -> { + assertEquals( + "log line 42 foobar 3.42 {[key1=val1], [key2=val2], [key3=val3]} [var1, var2, var3]", + intakeRequest.getMessage()); + correctLogMessage.set(true); + }); + registerSnapshotListener(snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + snapshotReceived.set(true); + }); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && correctLogMessage.get() && statusResult.get(), - () -> - String.format( - "timeout snapshotReceived=%s correctLogMessage=%s statusResult=%s", - snapshotReceived.get(), correctLogMessage.get(), statusResult.get())); + () -> String.format( + "timeout snapshotReceived=%s correctLogMessage=%s statusResult=%s", + snapshotReceived.get(), correctLogMessage.get(), statusResult.get())); } @Test @@ -250,51 +235,47 @@ void testFullMethodWithLogTemplate() throws Exception { void testFullMethodWithCaptureExpressions() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .evaluateAt(MethodLocation.EXIT) - .captureExpressions( - Arrays.asList( - new LogProbe.CaptureExpression( - "argStr", - new ValueScript(DSL.ref("argStr"), "argStr"), - new LogProbe.Capture(3, 100, 3, 20)), - new LogProbe.CaptureExpression( - "argMap[key2]", - new ValueScript( - DSL.index(DSL.ref("argMap"), DSL.value("key2")), "argMap['key2']"), - new LogProbe.Capture(3, 100, 4, 20)))) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .evaluateAt(MethodLocation.EXIT) + .captureExpressions(Arrays.asList( + new LogProbe.CaptureExpression( + "argStr", + new ValueScript(DSL.ref("argStr"), "argStr"), + new LogProbe.Capture(3, 100, 3, 20)), + new LogProbe.CaptureExpression( + "argMap[key2]", + new ValueScript(DSL.index(DSL.ref("argMap"), DSL.value("key2")), "argMap['key2']"), + new LogProbe.Capture(3, 100, 4, 20)))) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertEquals(2, snapshot.getCaptures().getReturn().getCaptureExpressions().size()); - assertNull(snapshot.getCaptures().getReturn().getArguments()); - assertNull(snapshot.getCaptures().getReturn().getLocals()); - CapturedContext.CapturedValue argStrValue = - snapshot.getCaptures().getReturn().getCaptureExpressions().get("argStr"); - assertEquals("argStr", argStrValue.getName()); - assertEquals("foo", argStrValue.getValue()); - assertEquals("truncated", argStrValue.getNotCapturedReason()); - CapturedContext.CapturedValue key2Value = - snapshot.getCaptures().getReturn().getCaptureExpressions().get("argMap[key2]"); - assertEquals("argMap[key2]", key2Value.getName()); - assertEquals("val2", key2Value.getValue()); - assertNull(key2Value.getNotCapturedReason()); - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals(2, snapshot.getCaptures().getReturn().getCaptureExpressions().size()); + assertNull(snapshot.getCaptures().getReturn().getArguments()); + assertNull(snapshot.getCaptures().getReturn().getLocals()); + CapturedContext.CapturedValue argStrValue = + snapshot.getCaptures().getReturn().getCaptureExpressions().get("argStr"); + assertEquals("argStr", argStrValue.getName()); + assertEquals("foo", argStrValue.getValue()); + assertEquals("truncated", argStrValue.getNotCapturedReason()); + CapturedContext.CapturedValue key2Value = + snapshot.getCaptures().getReturn().getCaptureExpressions().get("argMap[key2]"); + assertEquals("argMap[key2]", key2Value.getName()); + assertEquals("val2", key2Value.getValue()); + assertNull(key2Value.getNotCapturedReason()); + snapshotReceived.set(true); + }); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), - () -> - String.format( - "timeout snapshotReceived=%s statusResult=%s", - snapshotReceived.get(), statusResult.get())); + () -> String.format( + "timeout snapshotReceived=%s statusResult=%s", + snapshotReceived.get(), statusResult.get())); } @Test @@ -303,44 +284,38 @@ void testMultiProbes() throws Exception { final String METHOD_NAME = "fullMethod"; List probes = new ArrayList<>(); for (int i = 0; i < 10; i++) { - probes.add( - LogProbe.builder() - .probeId(getProbeId(i)) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .captureSnapshot(true) - .build()); + probes.add(LogProbe.builder() + .probeId(getProbeId(i)) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .captureSnapshot(true) + .build()); } setCurrentConfiguration(createConfig(probes)); final int NB_PROBES = 10; int expectedSnapshotUploads = NB_PROBES * 4; // (3 statuses + 1 snapshot) * 10 probes - targetProcess = - createProcessBuilder(logFilePath, METHOD_NAME, String.valueOf(expectedSnapshotUploads)) - .start(); + targetProcess = createProcessBuilder( + logFilePath, METHOD_NAME, String.valueOf(expectedSnapshotUploads)) + .start(); Set probeIds = new HashSet<>(); AtomicBoolean allSnapshotReceived = new AtomicBoolean(); AtomicBoolean allStatusEmitting = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - probeIds.add(snapshot.getProbe().getId()); - allSnapshotReceived.set(probeIds.size() == NB_PROBES); - }); + registerSnapshotListener(snapshot -> { + probeIds.add(snapshot.getProbe().getId()); + allSnapshotReceived.set(probeIds.size() == NB_PROBES); + }); Map statuses = new HashMap<>(); - registerProbeStatusListener( - probeStatus -> { - statuses.put( - probeStatus.getDiagnostics().getProbeId().getId(), - probeStatus.getDiagnostics().getStatus()); - allStatusEmitting.set( - statuses.size() == NB_PROBES - && statuses.values().stream() - .allMatch(status -> status == ProbeStatus.Status.EMITTING)); - }); + registerProbeStatusListener(probeStatus -> { + statuses.put( + probeStatus.getDiagnostics().getProbeId().getId(), + probeStatus.getDiagnostics().getStatus()); + allStatusEmitting.set(statuses.size() == NB_PROBES + && statuses.values().stream().allMatch(status -> status == ProbeStatus.Status.EMITTING)); + }); processRequests( () -> allSnapshotReceived.get() && allStatusEmitting.get(), - () -> - String.format( - "timeout allSnapshotReceived=%s allStatusEmitting=%s", - allSnapshotReceived.get(), allStatusEmitting.get())); + () -> String.format( + "timeout allSnapshotReceived=%s allStatusEmitting=%s", + allSnapshotReceived.get(), allStatusEmitting.get())); assertEquals(NB_PROBES, probeIds.size()); for (int i = 0; i < NB_PROBES; i++) { assertTrue(probeIds.contains(String.valueOf(i))); @@ -353,31 +328,29 @@ void testMultiProbes() throws Exception { void testLineProbe() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(LINE_PROBE_ID1) - .where("DebuggerTestApplication.java", 95) - .captureSnapshot(true) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(LINE_PROBE_ID1) + .where("DebuggerTestApplication.java", 95) + .captureSnapshot(true) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals(LINE_PROBE_ID1.getId(), snapshot.getProbe().getId()); - CapturedContext capturedContext = snapshot.getCaptures().getLines().get(95); - assertFullMethodCaptureArgs(capturedContext); - assertNull(capturedContext.getLocals()); - assertNull(capturedContext.getCapturedThrowable()); - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + assertEquals(LINE_PROBE_ID1.getId(), snapshot.getProbe().getId()); + CapturedContext capturedContext = snapshot.getCaptures().getLines().get(95); + assertFullMethodCaptureArgs(capturedContext); + assertNull(capturedContext.getLocals()); + assertNull(capturedContext.getCapturedThrowable()); + snapshotReceived.set(true); + }); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(LINE_PROBE_ID1); processRequests( () -> snapshotReceived.get() && statusResult.get(), - () -> - String.format( - "timeout snapshotReceived=%s statusResult=%s", - snapshotReceived.get(), statusResult.get())); + () -> String.format( + "timeout snapshotReceived=%s statusResult=%s", + snapshotReceived.get(), statusResult.get())); } @Test @@ -413,24 +386,21 @@ private void doSamplingSnapshot(ProbeCondition probeCondition, MethodLocation ev throws Exception { final int LOOP_COUNT = 1000; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, "fullMethod") - .when(probeCondition) - .evaluateAt(evaluateAt) - .captureSnapshot(true) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, "fullMethod") + .when(probeCondition) + .evaluateAt(evaluateAt) + .captureSnapshot(true) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = - createProcessBuilder( - logFilePath, "loopingFullMethod", EXPECTED_UPLOADS, String.valueOf(LOOP_COUNT)) - .start(); + targetProcess = createProcessBuilder( + logFilePath, "loopingFullMethod", EXPECTED_UPLOADS, String.valueOf(LOOP_COUNT)) + .start(); AtomicInteger snapshotCount = new AtomicInteger(); - registerSnapshotListener( - snapshot -> { - snapshotCount.incrementAndGet(); - }); + registerSnapshotListener(snapshot -> { + snapshotCount.incrementAndGet(); + }); processRequests( () -> { LOG.info("snapshots={}", snapshotCount.get()); @@ -449,24 +419,21 @@ void testSamplingLogDefault() throws Exception { final int LOOP_COUNT = 1000; final String LOG_TEMPLATE = "log line {argInt} {argStr} {argDouble} {argMap} {argVar}"; final String EXPECTED_UPLOADS = String.valueOf(LOOP_COUNT / batchSize + 3); // +3 statuses - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, "fullMethod") - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(false) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, "fullMethod") + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(false) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = - createProcessBuilder( - logFilePath, "loopingFullMethod", EXPECTED_UPLOADS, String.valueOf(LOOP_COUNT)) - .start(); + targetProcess = createProcessBuilder( + logFilePath, "loopingFullMethod", EXPECTED_UPLOADS, String.valueOf(LOOP_COUNT)) + .start(); AtomicInteger snapshotCount = new AtomicInteger(); - registerSnapshotListener( - snapshot -> { - snapshotCount.incrementAndGet(); - }); + registerSnapshotListener(snapshot -> { + snapshotCount.incrementAndGet(); + }); processRequests( () -> { LOG.info("snapshots={}", snapshotCount.get()); @@ -484,24 +451,21 @@ void testSamplingLogCustom() throws Exception { final int LOOP_COUNT = 1000; final String LOG_TEMPLATE = "log line {argInt} {argStr} {argDouble} {argMap} {argVar}"; final String EXPECTED_UPLOADS = "170"; - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, "fullMethod") - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - .evaluateAt(MethodLocation.EXIT) - .sampling(10) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, "fullMethod") + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + .evaluateAt(MethodLocation.EXIT) + .sampling(10) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = - createProcessBuilder( - logFilePath, "loopingFullMethod", EXPECTED_UPLOADS, String.valueOf(LOOP_COUNT)) - .start(); + targetProcess = createProcessBuilder( + logFilePath, "loopingFullMethod", EXPECTED_UPLOADS, String.valueOf(LOOP_COUNT)) + .start(); AtomicInteger snapshotCount = new AtomicInteger(); - registerSnapshotListener( - snapshot -> { - snapshotCount.incrementAndGet(); - }); + registerSnapshotListener(snapshot -> { + snapshotCount.incrementAndGet(); + }); processRequests( () -> { LOG.info("snapshots={}", snapshotCount.get()); @@ -515,29 +479,27 @@ void testSamplingLogCustom() throws Exception { void testUncaughtException() throws Exception { final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot final String METHOD_NAME = "exceptionMethod"; - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(true) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(true) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = - createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS, "uncaught").start(); + targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS, "uncaught") + .start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals("123356536", snapshot.getProbe().getId()); - CapturedContext.CapturedThrowable throwable = - snapshot.getCaptures().getReturn().getCapturedThrowable(); - assertEquals("oops uncaught!", throwable.getMessage()); - assertTrue(throwable.getStacktrace().size() > 0); - assertEquals( - "datadog.smoketest.debugger.Main.exceptionMethod", - throwable.getStacktrace().get(0).getFunction()); - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + assertEquals("123356536", snapshot.getProbe().getId()); + CapturedContext.CapturedThrowable throwable = + snapshot.getCaptures().getReturn().getCapturedThrowable(); + assertEquals("oops uncaught!", throwable.getMessage()); + assertTrue(throwable.getStacktrace().size() > 0); + assertEquals( + "datadog.smoketest.debugger.Main.exceptionMethod", + throwable.getStacktrace().get(0).getFunction()); + snapshotReceived.set(true); + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); @@ -548,29 +510,27 @@ void testUncaughtException() throws Exception { void testCaughtException() throws Exception { final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot final String METHOD_NAME = "exceptionMethod"; - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(true) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(true) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = - createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS, "caught").start(); + targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS, "caught") + .start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals("123356536", snapshot.getProbe().getId()); - assertEquals(1, snapshot.getCaptures().getCaughtExceptions().size()); - CapturedContext.CapturedThrowable throwable = - snapshot.getCaptures().getCaughtExceptions().get(0); - assertEquals("oops caught!", throwable.getMessage()); - assertEquals( - "datadog.smoketest.debugger.Main.exceptionMethod", - throwable.getStacktrace().get(0).getFunction()); - snapshotReceived.set(true); - }); + registerSnapshotListener(snapshot -> { + assertEquals("123356536", snapshot.getProbe().getId()); + assertEquals(1, snapshot.getCaptures().getCaughtExceptions().size()); + CapturedContext.CapturedThrowable throwable = + snapshot.getCaptures().getCaughtExceptions().get(0); + assertEquals("oops caught!", throwable.getMessage()); + assertEquals( + "datadog.smoketest.debugger.Main.exceptionMethod", + throwable.getStacktrace().get(0).getFunction()); + snapshotReceived.set(true); + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); @@ -581,28 +541,26 @@ void testCaughtException() throws Exception { void testConditionTimeout() throws Exception { final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot final String METHOD_NAME = "processLargeCollection"; - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(true) - .when( - new ProbeCondition( - when(all(ref("largeList"), gt(len(ref("@it")), value(0)))), - "all(largeList, {len(@it) > 0}")) - .build(); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(true) + .when(new ProbeCondition( + when(all(ref("largeList"), gt(len(ref("@it")), value(0)))), + "all(largeList, {len(@it) > 0}")) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - if (snapshot.getProbe().getProbeId().equals(PROBE_ID)) { - assertEquals(1, snapshot.getEvaluationErrors().size()); - assertEquals("timeout (50ms)", snapshot.getEvaluationErrors().get(0).getMessage()); - snapshotReceived.set(true); - } - }); + registerSnapshotListener(snapshot -> { + if (snapshot.getProbe().getProbeId().equals(PROBE_ID)) { + assertEquals(1, snapshot.getEvaluationErrors().size()); + assertEquals("timeout (50ms)", snapshot.getEvaluationErrors().get(0).getMessage()); + snapshotReceived.set(true); + } + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); @@ -614,31 +572,27 @@ void testTemplateTimeout() throws Exception { final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 snapshot final String METHOD_NAME = "processLargeCollection"; final String LARGE_COLLECTION_TEMPLATE = "{filter(largeList, {len(@it) > 0})}"; - List segments = - singletonList( - new LogProbe.Segment( - new ValueScript( - filter(ref("largeList"), gt(len(ref("@it")), value(0))), - "filter(largeList, {len(@it) > 0})"))); - LogProbe probe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .evaluateAt(MethodLocation.EXIT) - .captureSnapshot(true) - .template(LARGE_COLLECTION_TEMPLATE, segments) - .build(); + List segments = singletonList(new LogProbe.Segment(new ValueScript( + filter(ref("largeList"), gt(len(ref("@it")), value(0))), + "filter(largeList, {len(@it) > 0})"))); + LogProbe probe = LogProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .evaluateAt(MethodLocation.EXIT) + .captureSnapshot(true) + .template(LARGE_COLLECTION_TEMPLATE, segments) + .build(); setCurrentConfiguration(createConfig(probe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean snapshotReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - if (snapshot.getProbe().getProbeId().equals(PROBE_ID)) { - assertEquals(1, snapshot.getEvaluationErrors().size()); - assertEquals("timeout (50ms)", snapshot.getEvaluationErrors().get(0).getMessage()); - snapshotReceived.set(true); - } - }); + registerSnapshotListener(snapshot -> { + if (snapshot.getProbe().getProbeId().equals(PROBE_ID)) { + assertEquals(1, snapshot.getEvaluationErrors().size()); + assertEquals("timeout (50ms)", snapshot.getEvaluationErrors().get(0).getMessage()); + snapshotReceived.set(true); + } + }); processRequests( snapshotReceived::get, () -> String.format("timeout snapshotReceived=%s", snapshotReceived.get())); diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java index dfd5150fcd4..e995d28fcd8 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java @@ -100,16 +100,16 @@ private void doMethodMetric( final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "-1"; // wait for TIMEOUT_S for letting the metric being sent (async) - MetricProbe metricProbe = - MetricProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .kind(kind) - .metricName(metricName) - .valueScript(script) - .build(); + MetricProbe metricProbe = MetricProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .kind(kind) + .metricName(metricName) + .valueScript(script) + .build(); setCurrentConfiguration(createMetricConfig(metricProbe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); String msgExpected = String.format(expectedMsgFormat, metricName, PROBE_ID.getId()); assertNotNull(retrieveStatsdMessage(msgExpected)); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); @@ -123,28 +123,27 @@ private void doMethodInvalidMetric( final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "-1"; // wait for TIMEOUT_S for letting the Probe Status to be sent (async) - MetricProbe metricProbe = - MetricProbe.builder() - .probeId(PROBE_ID) - .where(MAIN_CLASS_NAME, METHOD_NAME) - .kind(kind) - .metricName(metricName) - .valueScript(script) - .build(); + MetricProbe metricProbe = MetricProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .kind(kind) + .metricName(metricName) + .valueScript(script) + .build(); setCurrentConfiguration(createMetricConfig(metricProbe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean received = new AtomicBoolean(); AtomicBoolean error = new AtomicBoolean(); - registerProbeStatusListener( - probeStatus -> { - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { - received.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.ERROR) { - assertEquals(expectedMsg, probeStatus.getDiagnostics().getException().getMessage()); - error.set(true); - } - }); + registerProbeStatusListener(probeStatus -> { + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { + received.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.ERROR) { + assertEquals(expectedMsg, probeStatus.getDiagnostics().getException().getMessage()); + error.set(true); + } + }); processRequests( () -> received.get() && error.get(), () -> String.format("timeout received=%s error=%s", received.get(), error.get())); @@ -206,17 +205,17 @@ private void doLineMetric( final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "-1"; // wait for TIMEOUT_S for letting the metric being sent (async) - MetricProbe metricProbe = - MetricProbe.builder() - .probeId(PROBE_ID) - // on line: System.out.println("fullMethod"); - .where("DebuggerTestApplication.java", 95) - .kind(kind) - .metricName(metricName) - .valueScript(script) - .build(); + MetricProbe metricProbe = MetricProbe.builder() + .probeId(PROBE_ID) + // on line: System.out.println("fullMethod"); + .where("DebuggerTestApplication.java", 95) + .kind(kind) + .metricName(metricName) + .valueScript(script) + .build(); setCurrentConfiguration(createMetricConfig(metricProbe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); String msgExpected = String.format(expectedMsgFormat, metricName, PROBE_ID.getId()); assertNotNull(retrieveStatsdMessage(msgExpected)); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java index 3fb17608915..380ff0a0765 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java @@ -26,8 +26,8 @@ public class ProbeFileIntegrationTest extends ServerAppDebuggerIntegrationTest { @Override public void setup(TestInfo testInfo) throws Exception { super.setup(testInfo); - probeFilePath = - Paths.get(ProbeFileIntegrationTest.class.getResource("/test_probe_file.json").toURI()); + probeFilePath = Paths.get( + ProbeFileIntegrationTest.class.getResource("/test_probe_file.json").toURI()); appUrl = startAppAndAndGetUrl(); } @@ -52,27 +52,24 @@ void testProbeFile() throws Exception { execute(appUrl, TRACED_METHOD_NAME); AtomicBoolean snapshotReceived = new AtomicBoolean(); AtomicBoolean traceReceived = new AtomicBoolean(); - registerSnapshotListener( - snapshot -> { - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertEquals(5, snapshot.getCaptures().getReturn().getArguments().size()); - snapshotReceived.set(true); - }); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isDynamicSpan(span)) { - assertEquals("foobar", span.getMeta().get("client")); - assertEquals(PROBE_ID2.getId(), span.getMeta().get("_dd.di.client.probe_id")); - traceReceived.set(true); - } - } - }); + registerSnapshotListener(snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals(5, snapshot.getCaptures().getReturn().getArguments().size()); + snapshotReceived.set(true); + }); + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isDynamicSpan(span)) { + assertEquals("foobar", span.getMeta().get("client")); + assertEquals(PROBE_ID2.getId(), span.getMeta().get("_dd.di.client.probe_id")); + traceReceived.set(true); + } + } + }); processRequests( () -> snapshotReceived.get() && traceReceived.get(), - () -> - String.format( - "Timeout! traceReceived=%s snapshotReceived=%s", traceReceived, snapshotReceived)); + () -> String.format( + "Timeout! traceReceived=%s snapshotReceived=%s", traceReceived, snapshotReceived)); assertFalse(logHasErrors(logFilePath, it -> it.contains(" Error "))); } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeStateIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeStateIntegrationTest.java index 0004a508cfa..72908910168 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeStateIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeStateIntegrationTest.java @@ -42,8 +42,10 @@ protected List getDebuggerCommandParams() { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testAddRemoveProbes() throws Exception { - LogProbe logProbe = - LogProbe.builder().probeId(PROBE_ID).where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME).build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME) + .build(); addProbe(logProbe); waitForInstrumentation(appUrl); execute(appUrl, FULL_METHOD_NAME); @@ -64,12 +66,11 @@ void testAddRemoveProbes() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testAddSourceFileProbeLargeInnerClasses() throws Exception { - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - .where("LargeInnerClasses.java", 6) - .captureSnapshot(true) - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where("LargeInnerClasses.java", 6) + .captureSnapshot(true) + .build(); addProbe(logProbe); waitForInstrumentation(appUrl, "datadog.smoketest.debugger.LargeInnerClasses", true); } @@ -83,12 +84,11 @@ void testAddSourceFileProbeLargeInnerClasses() throws Exception { // disabledReason = "Flaky on J9 JVMs") void testAddSourceFileProbeHugeInnerClasses() throws Exception { waitForSpecificLine(appUrl, " totalentries: 5"); - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - .where("HugeInnerClasses.java", 6) - .captureSnapshot(true) - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where("HugeInnerClasses.java", 6) + .captureSnapshot(true) + .build(); addProbe(logProbe); waitForSpecificLine( appUrl, "java.lang.IllegalStateException: Too many classes to retransform: 1001"); @@ -100,8 +100,10 @@ void testAddSourceFileProbeHugeInnerClasses() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testDisableEnableProbes() throws Exception { - LogProbe logProbe = - LogProbe.builder().probeId(PROBE_ID).where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME).build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME) + .build(); addProbe(logProbe); waitForInstrumentation(appUrl); execute(appUrl, FULL_METHOD_NAME); @@ -123,8 +125,10 @@ void testDisableEnableProbes() throws Exception { disabledReason = "Flaky on J9 JVMs") @Disabled("Not supported for config coming from RemoteConfig") void testDisableEnableProbesUsingDenyList() throws Exception { - LogProbe logProbe = - LogProbe.builder().probeId(PROBE_ID).where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME).build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME) + .build(); addProbe(logProbe); waitForInstrumentation(appUrl); execute(appUrl, FULL_METHOD_NAME); @@ -155,8 +159,10 @@ void testDisableEnableProbesUsingDenyList() throws Exception { disabledReason = "Flaky on J9 JVMs") @Disabled("Not supported for config coming from RemoteConfig") void testDisableEnableProbesUsingAllowList() throws Exception { - LogProbe logProbe = - LogProbe.builder().probeId(PROBE_ID).where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME).build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, FULL_METHOD_NAME) + .build(); addProbe(logProbe); waitForInstrumentation(appUrl); execute(appUrl, FULL_METHOD_NAME); @@ -186,26 +192,24 @@ void testDisableEnableProbesUsingAllowList() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") public void testProbeStatusError() throws Exception { - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - .where(TEST_APP_CLASS_NAME, "unknownMethodName") - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, "unknownMethodName") + .build(); addProbe(logProbe); AtomicBoolean received = new AtomicBoolean(); AtomicBoolean error = new AtomicBoolean(); - registerProbeStatusListener( - probeStatus -> { - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { - received.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.ERROR) { - assertEquals( - "Cannot find method datadog/smoketest/debugger/ServerDebuggerTestApplication::unknownMethodName", - probeStatus.getDiagnostics().getException().getMessage()); - error.set(true); - } - }); + registerProbeStatusListener(probeStatus -> { + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { + received.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.ERROR) { + assertEquals( + "Cannot find method datadog/smoketest/debugger/ServerDebuggerTestApplication::unknownMethodName", + probeStatus.getDiagnostics().getException().getMessage()); + error.set(true); + } + }); processRequests( () -> received.get() && error.get(), () -> String.format("timeout received=%s error=%s", received.get(), error.get())); diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java index e0ee9150109..0e4856d27b8 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProcessBuilderHelper.java @@ -34,26 +34,24 @@ public static ProcessBuilder createProcessBuilder( // Gradle daemon. // // Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock. - String prefsDir = - System.getProperty("java.io.tmpdir") - + File.separator - + "userPrefs" - + File.separator - + mainClassName - + "_" - + System.nanoTime(); + String prefsDir = System.getProperty("java.io.tmpdir") + + File.separator + + "userPrefs" + + File.separator + + mainClassName + + "_" + + System.nanoTime(); - List baseCommand = - Arrays.asList( - javaPath(), - // "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5006", - "-Xmx" + System.getProperty("datadog.forkedMaxHeapSize", "1024M"), - "-Xms" + System.getProperty("datadog.forkedMinHeapSize", "64M"), - "-javaagent:" + agentShadowJar(), - "-XX:ErrorFile=/tmp/hs_err_pid%p.log", - "-Ddd.env=smoketest", - "-Ddd.version=99", - "-Djava.util.prefs.userRoot=" + prefsDir); + List baseCommand = Arrays.asList( + javaPath(), + // "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5006", + "-Xmx" + System.getProperty("datadog.forkedMaxHeapSize", "1024M"), + "-Xms" + System.getProperty("datadog.forkedMinHeapSize", "64M"), + "-javaagent:" + agentShadowJar(), + "-XX:ErrorFile=/tmp/hs_err_pid%p.log", + "-Ddd.env=smoketest", + "-Ddd.version=99", + "-Djava.util.prefs.userRoot=" + prefsDir); List command = new ArrayList<>(); command.addAll(baseCommand); diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/RemoteConfigHelper.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/RemoteConfigHelper.java index d9f7c7cc85d..4ff8e1701bd 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/RemoteConfigHelper.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/RemoteConfigHelper.java @@ -42,9 +42,8 @@ public static String encode(List remoteConfigs) { private static String buildClientConfigs(List remoteConfigs) { StringJoiner sj = new StringJoiner(",\n"); for (RemoteConfig rc : remoteConfigs) { - sj.add( - String.format( - " \"datadog/2/%s/%s/config\"\n", rc.product, rc.configId)); + sj.add(String.format( + " \"datadog/2/%s/%s/config\"\n", rc.product, rc.configId)); } return sj.toString(); } @@ -53,13 +52,10 @@ private static String buildTargetFiles(List remoteConfigs) { StringJoiner sj = new StringJoiner(",\n"); for (RemoteConfig rc : remoteConfigs) { String encodedConfig = new String(Base64.getEncoder().encode(rc.config.getBytes())); - sj.add( - String.format( - " {\n" - + " \"path\": \"datadog/2/%s/%s/config\",\n" - + " \"raw\": \"%s\"\n" - + " }\n", - rc.product, rc.configId, encodedConfig)); + sj.add(String.format( + " {\n" + " \"path\": \"datadog/2/%s/%s/config\",\n" + " \"raw\": \"%s\"\n" + + " }\n", + rc.product, rc.configId, encodedConfig)); } return sj.toString(); } @@ -80,17 +76,16 @@ private static String buildTargets(List hashes, List remot StringJoiner sj = new StringJoiner(",\n"); for (int i = 0; i < remoteConfigs.size(); i++) { RemoteConfig rc = remoteConfigs.get(i); - sj.add( - String.format( - " \"datadog/2/%s/%s/config\":{" - + " \"length\": %d,\n" - + " \"custom\": { \"v\": 123 },\n" - + " \"hashes\":\n" - + " {\n" - + " \"sha256\": \"%s\"\n" - + " }" - + " }", - rc.product, rc.configId, rc.config.length(), hashes.get(i))); + sj.add(String.format( + " \"datadog/2/%s/%s/config\":{" + + " \"length\": %d,\n" + + " \"custom\": { \"v\": 123 },\n" + + " \"hashes\":\n" + + " {\n" + + " \"sha256\": \"%s\"\n" + + " }" + + " }", + rc.product, rc.configId, rc.config.length(), hashes.get(i))); } String targets = sj.toString(); return String.format( diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ServerAppDebuggerIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ServerAppDebuggerIntegrationTest.java index 4365b85119a..ad33f8091bc 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ServerAppDebuggerIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ServerAppDebuggerIntegrationTest.java @@ -112,15 +112,14 @@ protected void waitForInstrumentation( if (waitOnProbeStatuses) { AtomicBoolean received = new AtomicBoolean(); AtomicBoolean installed = new AtomicBoolean(); - registerProbeStatusListener( - probeStatus -> { - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { - received.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.INSTALLED) { - installed.set(true); - } - }); + registerProbeStatusListener(probeStatus -> { + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { + received.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.INSTALLED) { + installed.set(true); + } + }); processRequests( () -> received.get() && installed.get(), () -> String.format("timeout received=%s installed=%s", received.get(), installed.get())); @@ -137,10 +136,9 @@ protected void waitForExceptionFingerprint() throws Exception { protected void waitForAProbeStatus(ProbeStatus.Status status) throws Exception { AtomicBoolean statusResult = new AtomicBoolean(); - registerProbeStatusListener( - probeStatus -> { - statusResult.set(probeStatus.getDiagnostics().getStatus() == status); - }); + registerProbeStatusListener(probeStatus -> { + statusResult.set(probeStatus.getDiagnostics().getStatus() == status); + }); processRequests( statusResult::get, () -> String.format("timeout statusResult=%s", statusResult.get())); } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanDecorationProbesIntegrationTests.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanDecorationProbesIntegrationTests.java index 09346289fb7..6585d36bee1 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanDecorationProbesIntegrationTests.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanDecorationProbesIntegrationTests.java @@ -57,27 +57,25 @@ protected ProcessBuilder createProcessBuilder(Path logFilePath, String... params value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "we cannot get local variable debug info") void testMethodSimpleTagNoCondition() throws Exception { - SpanDecorationProbe spanDecorationProbe = - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) - .decorations(createDecoration("tag1", "{argStr}")) - .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) - .build(); + SpanDecorationProbe spanDecorationProbe = SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .decorations(createDecoration("tag1", "{argStr}")) + .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) + .build(); addProbe(spanDecorationProbe); waitForInstrumentation(appUrl); execute(appUrl, TRACED_METHOD_NAME); AtomicBoolean traceReceived = new AtomicBoolean(); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - assertEquals("foobar", span.getMeta().get("tag1")); - assertEquals(PROBE_ID.getId(), span.getMeta().get("_dd.di.tag1.probe_id")); - traceReceived.set(true); - } - } - }); + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + assertEquals("foobar", span.getMeta().get("tag1")); + assertEquals(PROBE_ID.getId(), span.getMeta().get("_dd.di.tag1.probe_id")); + traceReceived.set(true); + } + } + }); processRequests( traceReceived::get, () -> String.format("timeout traceReceived=%s", traceReceived.get())); } @@ -89,44 +87,37 @@ void testMethodSimpleTagNoCondition() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "we cannot get local variable debug info") void testMethodMultiTagsMultiConditions() throws Exception { - List decorations = - Arrays.asList( - createDecoration( - not(eq(ref("argStr"), nullValue())), "argStr != null", "tag1", "{argStr}"), - createDecoration(lt(ref("argInt"), value(0)), "argInt < 0", "tag2", "{argInt}"), - createDecoration( - gt(ref("argDouble"), value(3.14)), - "argDouble > 3.14", - "tag3", - "Above Pi: {argDouble}"), - createDecoration( - eq(index(ref("argMap"), value("key2")), value("val2")), - "argMap['key2'] == 'val2'", - "tag4", - "{argMap['key2']}")); - SpanDecorationProbe spanDecorationProbe = - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) - .decorations(decorations) - .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) - .build(); + List decorations = Arrays.asList( + createDecoration(not(eq(ref("argStr"), nullValue())), "argStr != null", "tag1", "{argStr}"), + createDecoration(lt(ref("argInt"), value(0)), "argInt < 0", "tag2", "{argInt}"), + createDecoration( + gt(ref("argDouble"), value(3.14)), "argDouble > 3.14", "tag3", "Above Pi: {argDouble}"), + createDecoration( + eq(index(ref("argMap"), value("key2")), value("val2")), + "argMap['key2'] == 'val2'", + "tag4", + "{argMap['key2']}")); + SpanDecorationProbe spanDecorationProbe = SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .decorations(decorations) + .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) + .build(); addProbe(spanDecorationProbe); waitForInstrumentation(appUrl); execute(appUrl, TRACED_METHOD_NAME); AtomicBoolean traceReceived = new AtomicBoolean(); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - assertEquals("foobar", span.getMeta().get("tag1")); - assertFalse(span.getMeta().containsKey("tag2")); - assertEquals("Above Pi: 3.42", span.getMeta().get("tag3")); - assertEquals("val2", span.getMeta().get("tag4")); - traceReceived.set(true); - } - } - }); + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + assertEquals("foobar", span.getMeta().get("tag1")); + assertFalse(span.getMeta().containsKey("tag2")); + assertEquals("Above Pi: 3.42", span.getMeta().get("tag3")); + assertEquals("val2", span.getMeta().get("tag4")); + traceReceived.set(true); + } + } + }); processRequests( traceReceived::get, () -> String.format("timeout traceReceived=%s", traceReceived.get())); } @@ -137,41 +128,37 @@ void testMethodMultiTagsMultiConditions() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testMethodSimpleTagValueError() throws Exception { - SpanDecorationProbe spanDecorationProbe = - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) - .decorations(createDecoration("tag1", "{invalidArg}")) - .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) - .build(); + SpanDecorationProbe spanDecorationProbe = SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .decorations(createDecoration("tag1", "{invalidArg}")) + .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) + .build(); addProbe(spanDecorationProbe); waitForInstrumentation(appUrl); execute(appUrl, TRACED_METHOD_NAME); AtomicBoolean snapshotTest = new AtomicBoolean(false); AtomicBoolean spanTest = new AtomicBoolean(false); - registerSnapshotListener( - snapshot -> { + registerSnapshotListener(snapshot -> { + assertEquals( + "Cannot find symbol: invalidArg", + snapshot.getEvaluationErrors().get(0).getMessage()); + snapshotTest.set(true); + }); + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + assertFalse(span.getMeta().containsKey("tag1")); assertEquals( - "Cannot find symbol: invalidArg", snapshot.getEvaluationErrors().get(0).getMessage()); - snapshotTest.set(true); - }); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - assertFalse(span.getMeta().containsKey("tag1")); - assertEquals( - "Cannot find symbol: invalidArg", - span.getMeta().get("_dd.di.tag1.evaluation_error")); - spanTest.set(true); - } - } - }); + "Cannot find symbol: invalidArg", span.getMeta().get("_dd.di.tag1.evaluation_error")); + spanTest.set(true); + } + } + }); processRequests( () -> snapshotTest.get() && spanTest.get(), - () -> - String.format( - "timeout snapshotTest=%s spanTest=%s", snapshotTest.get(), spanTest.get())); + () -> String.format( + "timeout snapshotTest=%s spanTest=%s", snapshotTest.get(), spanTest.get())); } @Test @@ -180,43 +167,36 @@ void testMethodSimpleTagValueError() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testMethodSimpleTagConditionError() throws Exception { - SpanDecorationProbe spanDecorationProbe = - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) - .decorations( - createDecoration( - not(eq(ref("invalidArg"), nullValue())), - "invalidArg != null", - "tag1", - "{argStr}")) - .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) - .build(); + SpanDecorationProbe spanDecorationProbe = SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .decorations(createDecoration( + not(eq(ref("invalidArg"), nullValue())), "invalidArg != null", "tag1", "{argStr}")) + .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) + .build(); addProbe(spanDecorationProbe); waitForInstrumentation(appUrl); execute(appUrl, TRACED_METHOD_NAME); AtomicBoolean snapshotTest = new AtomicBoolean(false); AtomicBoolean spanTest = new AtomicBoolean(false); - registerSnapshotListener( - snapshot -> { - assertEquals( - "Cannot find symbol: invalidArg", snapshot.getEvaluationErrors().get(0).getMessage()); - snapshotTest.set(true); - }); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - assertFalse(span.getMeta().containsKey("tag1")); - spanTest.set(true); - } - } - }); + registerSnapshotListener(snapshot -> { + assertEquals( + "Cannot find symbol: invalidArg", + snapshot.getEvaluationErrors().get(0).getMessage()); + snapshotTest.set(true); + }); + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + assertFalse(span.getMeta().containsKey("tag1")); + spanTest.set(true); + } + } + }); processRequests( () -> snapshotTest.get() && spanTest.get(), - () -> - String.format( - "timeout snapshotTest=%s spanTest=%s", snapshotTest.get(), spanTest.get())); + () -> String.format( + "timeout snapshotTest=%s spanTest=%s", snapshotTest.get(), spanTest.get())); } @Test @@ -225,49 +205,43 @@ void testMethodSimpleTagConditionError() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testMethodMultiTagValueError() throws Exception { - List decorations = - Arrays.asList( - createDecoration("tag1", "{invalidArg}"), createDecoration("tag2", "{invalidArg2}")); - SpanDecorationProbe spanDecorationProbe = - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) - .decorations(decorations) - .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) - .build(); + List decorations = Arrays.asList( + createDecoration("tag1", "{invalidArg}"), createDecoration("tag2", "{invalidArg2}")); + SpanDecorationProbe spanDecorationProbe = SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .decorations(decorations) + .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) + .build(); addProbe(spanDecorationProbe); waitForInstrumentation(appUrl); execute(appUrl, TRACED_METHOD_NAME); AtomicBoolean snapshotTest = new AtomicBoolean(false); AtomicBoolean spanTest = new AtomicBoolean(false); - registerSnapshotListener( - snapshot -> { - List evalErrors = snapshot.getEvaluationErrors(); - assertEquals("Cannot find symbol: invalidArg", evalErrors.get(0).getMessage()); - assertEquals("Cannot find symbol: invalidArg2", evalErrors.get(1).getMessage()); - snapshotTest.set(true); - }); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - assertFalse(span.getMeta().containsKey("tag1")); - assertFalse(span.getMeta().containsKey("tag2")); - assertEquals( - "Cannot find symbol: invalidArg", - span.getMeta().get("_dd.di.tag1.evaluation_error")); - assertEquals( - "Cannot find symbol: invalidArg2", - span.getMeta().get("_dd.di.tag2.evaluation_error")); - spanTest.set(true); - } - } - }); + registerSnapshotListener(snapshot -> { + List evalErrors = snapshot.getEvaluationErrors(); + assertEquals("Cannot find symbol: invalidArg", evalErrors.get(0).getMessage()); + assertEquals("Cannot find symbol: invalidArg2", evalErrors.get(1).getMessage()); + snapshotTest.set(true); + }); + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + assertFalse(span.getMeta().containsKey("tag1")); + assertFalse(span.getMeta().containsKey("tag2")); + assertEquals( + "Cannot find symbol: invalidArg", span.getMeta().get("_dd.di.tag1.evaluation_error")); + assertEquals( + "Cannot find symbol: invalidArg2", + span.getMeta().get("_dd.di.tag2.evaluation_error")); + spanTest.set(true); + } + } + }); processRequests( () -> snapshotTest.get() && spanTest.get(), - () -> - String.format( - "timeout snapshotTest=%s spanTest=%s", snapshotTest.get(), spanTest.get())); + () -> String.format( + "timeout snapshotTest=%s spanTest=%s", snapshotTest.get(), spanTest.get())); } @Test @@ -276,44 +250,38 @@ void testMethodMultiTagValueError() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testSamplingSpanDecoration() throws Exception { - SpanDecorationProbe spanDecorationProbe = - SpanDecorationProbe.builder() - .probeId(PROBE_ID) - .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) - .decorations(createDecoration("tag1", "staticText")) - .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) - .build(); + SpanDecorationProbe spanDecorationProbe = SpanDecorationProbe.builder() + .probeId(PROBE_ID) + .where(TEST_APP_CLASS_NAME, TRACED_METHOD_NAME) + .decorations(createDecoration("tag1", "staticText")) + .targetSpan(SpanDecorationProbe.TargetSpan.ACTIVE) + .build(); addProbe(spanDecorationProbe); waitForInstrumentation(appUrl); execute(appUrl, "loopingTracedMethod", "100"); AtomicInteger count = new AtomicInteger(); - registerTraceListener( - decodedTrace -> { - for (DecodedSpan span : decodedTrace.getSpans()) { - if (isTracedFullMethodSpan(span)) { - if (span.getMeta().containsKey("tag1")) { - count.incrementAndGet(); - } - } + registerTraceListener(decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isTracedFullMethodSpan(span)) { + if (span.getMeta().containsKey("tag1")) { + count.incrementAndGet(); } - }); + } + } + }); processRequests(() -> count.get() >= 100, () -> String.format("timeout count=%d", count.get())); } private SpanDecorationProbe.Decoration createDecoration(String tagName, String valueDsl) { - List tags = - Arrays.asList( - new SpanDecorationProbe.Tag( - tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); + List tags = Arrays.asList(new SpanDecorationProbe.Tag( + tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); return new SpanDecorationProbe.Decoration(null, tags); } private SpanDecorationProbe.Decoration createDecoration( BooleanExpression expression, String dsl, String tagName, String valueDsl) { - List tags = - Arrays.asList( - new SpanDecorationProbe.Tag( - tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); + List tags = Arrays.asList(new SpanDecorationProbe.Tag( + tagName, new SpanDecorationProbe.TagValue(valueDsl, parseTemplate(valueDsl)))); return new SpanDecorationProbe.Decoration(new ProbeCondition(DSL.when(expression), dsl), tags); } } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java index 63dc4a9dc98..fb97d147a6a 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java @@ -29,25 +29,25 @@ protected ProcessBuilder createProcessBuilder(Path logFilePath, String... params void testMethodSpan() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 for letting the trace being sent (async) - SpanProbe spanProbe = - SpanProbe.builder().probeId(PROBE_ID).where(MAIN_CLASS_NAME, METHOD_NAME).build(); + SpanProbe spanProbe = SpanProbe.builder() + .probeId(PROBE_ID) + .where(MAIN_CLASS_NAME, METHOD_NAME) + .build(); setCurrentConfiguration(createSpanConfig(spanProbe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); AtomicBoolean traceReceived = new AtomicBoolean(); - registerTraceListener( - decodedTrace -> { - DecodedSpan decodedSpan = decodedTrace.getSpans().get(0); - assertEquals("Main.fullMethod", decodedSpan.getResource()); - traceReceived.set(true); - }); + registerTraceListener(decodedTrace -> { + DecodedSpan decodedSpan = decodedTrace.getSpans().get(0); + assertEquals("Main.fullMethod", decodedSpan.getResource()); + traceReceived.set(true); + }); processRequests( () -> statusResult.get() && traceReceived.get(), - () -> - String.format( - "timeout statusResult=%s traceReceived=%s", - statusResult.get(), traceReceived.get())); + () -> String.format( + "timeout statusResult=%s traceReceived=%s", statusResult.get(), traceReceived.get())); } @Test @@ -55,29 +55,26 @@ void testMethodSpan() throws Exception { void testLineRangeSpan() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "4"; // 3 statuses + 1 for letting the trace being sent (async) - SpanProbe spanProbe = - SpanProbe.builder() - .probeId(PROBE_ID) - // from line: System.out.println("fullMethod"); - // to line: + String.join(",", argVar); - .where(MAIN_CLASS_NAME, 95, 104) - .build(); + SpanProbe spanProbe = SpanProbe.builder() + .probeId(PROBE_ID) + // from line: System.out.println("fullMethod"); + // to line: + String.join(",", argVar); + .where(MAIN_CLASS_NAME, 95, 104) + .build(); setCurrentConfiguration(createSpanConfig(spanProbe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); AtomicBoolean traceReceived = new AtomicBoolean(); - registerTraceListener( - decodedTrace -> { - DecodedSpan decodedSpan = decodedTrace.getSpans().get(0); - assertEquals("Main.fullMethod:L95-104", decodedSpan.getResource()); - traceReceived.set(true); - }); + registerTraceListener(decodedTrace -> { + DecodedSpan decodedSpan = decodedTrace.getSpans().get(0); + assertEquals("Main.fullMethod:L95-104", decodedSpan.getResource()); + traceReceived.set(true); + }); processRequests( () -> statusResult.get() && traceReceived.get(), - () -> - String.format( - "timeout statusResult=%s traceReceived=%s", - statusResult.get(), traceReceived.get())); + () -> String.format( + "timeout statusResult=%s traceReceived=%s", statusResult.get(), traceReceived.get())); } @Test @@ -88,28 +85,27 @@ void testLineRangeSpan() throws Exception { void testSingleLineSpan() throws Exception { final String METHOD_NAME = "fullMethod"; final String EXPECTED_UPLOADS = "2"; // 2 probe statuses: RECEIVED + ERROR - SpanProbe spanProbe = - SpanProbe.builder() - .probeId(PROBE_ID) - // on line: System.out.println("fullMethod"); - .where(MAIN_CLASS_NAME, 95) - .build(); + SpanProbe spanProbe = SpanProbe.builder() + .probeId(PROBE_ID) + // on line: System.out.println("fullMethod"); + .where(MAIN_CLASS_NAME, 95) + .build(); setCurrentConfiguration(createSpanConfig(spanProbe)); - targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); + targetProcess = + createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); AtomicBoolean received = new AtomicBoolean(false); AtomicBoolean error = new AtomicBoolean(false); - registerProbeStatusListener( - probeStatus -> { - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { - received.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.ERROR) { - assertEquals( - "Single line span is not supported, you need to provide a range.", - probeStatus.getDiagnostics().getException().getMessage()); - error.set(true); - } - }); + registerProbeStatusListener(probeStatus -> { + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { + received.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.ERROR) { + assertEquals( + "Single line span is not supported, you need to provide a range.", + probeStatus.getDiagnostics().getException().getMessage()); + error.set(true); + } + }); processRequests( () -> received.get() && error.get(), () -> String.format("timeout received=%s error=%s", received.get(), error.get())); diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpringBasedIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpringBasedIntegrationTest.java index 9f05e22735b..019c6e093f5 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpringBasedIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpringBasedIntegrationTest.java @@ -50,8 +50,10 @@ protected String startSpringApp(List logProbes, boolean enableProcessT protected void sendRequest(String httpPort, String urlPath) { OkHttpClient client = new OkHttpClient.Builder().build(); - Request request = - new Request.Builder().url("http://localhost:" + httpPort + urlPath).get().build(); + Request request = new Request.Builder() + .url("http://localhost:" + httpPort + urlPath) + .get() + .build(); try { client.newCall(request).execute(); } catch (Exception ex) { @@ -65,13 +67,11 @@ protected static void waitForSpecificLogLine( long total = sleep.toNanos() == 0 ? 0 : timeout.toNanos() / sleep.toNanos(); int i = 0; while (i < total && !result[0]) { - Files.lines(logFilePath) - .forEach( - it -> { - if (it.contains(line)) { - result[0] = true; - } - }); + Files.lines(logFilePath).forEach(it -> { + if (it.contains(line)) { + result[0] = true; + } + }); LockSupport.parkNanos(sleep.toNanos()); i++; } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/TracerDebuggerIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/TracerDebuggerIntegrationTest.java index bd3572287f7..eb6914835a8 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/TracerDebuggerIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/TracerDebuggerIntegrationTest.java @@ -38,33 +38,30 @@ public class TracerDebuggerIntegrationTest extends SpringBasedIntegrationTest { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testTracer(boolean processTagsEnabled) throws Exception { - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - .where( - "org.springframework.web.servlet.DispatcherServlet", - "doService", - "(HttpServletRequest, HttpServletResponse)") - .captureSnapshot(true) - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where( + "org.springframework.web.servlet.DispatcherServlet", + "doService", + "(HttpServletRequest, HttpServletResponse)") + .captureSnapshot(true) + .build(); AtomicBoolean requestReceived = new AtomicBoolean(false); - registerIntakeRequestListener( - intakeRequest -> { - assertEquals( - PROBE_ID.getId(), intakeRequest.getDebugger().getSnapshot().getProbe().getId()); - assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); - assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); - if (processTagsEnabled) { - assertNotNull(intakeRequest.getProcessTags()); - assertTrue( - intakeRequest - .getProcessTags() - .contains("entrypoint.name:" + TagsHelper.sanitize(DEBUGGER_TEST_APP_CLASS))); - } else { - assertNull(intakeRequest.getProcessTags()); - } - requestReceived.set(true); - }); + registerIntakeRequestListener(intakeRequest -> { + assertEquals( + PROBE_ID.getId(), intakeRequest.getDebugger().getSnapshot().getProbe().getId()); + assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); + assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); + if (processTagsEnabled) { + assertNotNull(intakeRequest.getProcessTags()); + assertTrue(intakeRequest + .getProcessTags() + .contains("entrypoint.name:" + TagsHelper.sanitize(DEBUGGER_TEST_APP_CLASS))); + } else { + assertNull(intakeRequest.getProcessTags()); + } + requestReceived.set(true); + }); String httpPort = startSpringApp(singletonList(logProbe), processTagsEnabled); sendRequest(httpPort, "/greeting"); processRequests( @@ -78,28 +75,25 @@ void testTracer(boolean processTagsEnabled) throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testTracerDynamicLog() throws Exception { - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - .where( - "org.springframework.web.servlet.DispatcherServlet", - "doService", - "(HttpServletRequest, HttpServletResponse)") - .captureSnapshot(false) - .evaluateAt(MethodLocation.EXIT) - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where( + "org.springframework.web.servlet.DispatcherServlet", + "doService", + "(HttpServletRequest, HttpServletResponse)") + .captureSnapshot(false) + .evaluateAt(MethodLocation.EXIT) + .build(); AtomicBoolean requestReceived = new AtomicBoolean(false); - registerIntakeRequestListener( - intakeRequest -> { - Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); - assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); - assertFalse( - logHasErrors( - logFilePath, it -> it.contains("TypePool$Resolution$NoSuchTypeException"))); - requestReceived.set(true); - }); + registerIntakeRequestListener(intakeRequest -> { + Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); + assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); + assertFalse( + logHasErrors(logFilePath, it -> it.contains("TypePool$Resolution$NoSuchTypeException"))); + requestReceived.set(true); + }); String httpPort = startSpringApp(singletonList(logProbe)); sendRequest(httpPort, "/greeting"); processRequests( @@ -113,25 +107,23 @@ void testTracerDynamicLog() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testTracerSameMethod() throws Exception { - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - .where("datadog.smoketest.debugger.controller.WebController", "processWithArg", null) - .captureSnapshot(true) - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .where("datadog.smoketest.debugger.controller.WebController", "processWithArg", null) + .captureSnapshot(true) + .build(); AtomicBoolean requestReceived = new AtomicBoolean(false); - registerIntakeRequestListener( - intakeRequest -> { - Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertEquals( - 42, snapshot.getCaptures().getEntry().getArguments().get("argInt").getValue()); - // no locals captured - assertNull(snapshot.getCaptures().getEntry().getLocals()); - assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); - assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); - requestReceived.set(true); - }); + registerIntakeRequestListener(intakeRequest -> { + Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals( + 42, snapshot.getCaptures().getEntry().getArguments().get("argInt").getValue()); + // no locals captured + assertNull(snapshot.getCaptures().getEntry().getLocals()); + assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); + assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); + requestReceived.set(true); + }); String httpPort = startSpringApp(singletonList(logProbe)); sendRequest(httpPort, "/greeting"); processRequests( @@ -145,25 +137,23 @@ void testTracerSameMethod() throws Exception { value = "datadog.environment.JavaVirtualMachine#isJ9", disabledReason = "Flaky on J9 JVMs") void testTracerLineSnapshotProbe() throws Exception { - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - // on line: System.out.println(argInt); - .where("WebController.java", 15) - .captureSnapshot(true) - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + // on line: System.out.println(argInt); + .where("WebController.java", 15) + .captureSnapshot(true) + .build(); AtomicBoolean requestReceived = new AtomicBoolean(false); - registerIntakeRequestListener( - intakeRequest -> { - Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertEquals( - 42, - snapshot.getCaptures().getLines().get(15).getArguments().get("argInt").getValue()); - assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); - assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); - requestReceived.set(true); - }); + registerIntakeRequestListener(intakeRequest -> { + Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals( + 42, + snapshot.getCaptures().getLines().get(15).getArguments().get("argInt").getValue()); + assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); + assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); + requestReceived.set(true); + }); String httpPort = startSpringApp(singletonList(logProbe)); sendRequest(httpPort, "/greeting"); processRequests( @@ -178,24 +168,22 @@ void testTracerLineSnapshotProbe() throws Exception { disabledReason = "Flaky on J9 JVMs") void testTracerLineDynamicLogProbe() throws Exception { final String LOG_TEMPLATE = "processWithArg {argInt}"; - LogProbe logProbe = - LogProbe.builder() - .probeId(PROBE_ID) - .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) - // on line: System.out.println(argInt); - .where("WebController.java", 15) - .captureSnapshot(false) - .build(); + LogProbe logProbe = LogProbe.builder() + .probeId(PROBE_ID) + .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) + // on line: System.out.println(argInt); + .where("WebController.java", 15) + .captureSnapshot(false) + .build(); AtomicBoolean requestReceived = new AtomicBoolean(false); - registerIntakeRequestListener( - intakeRequest -> { - Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); - assertEquals("processWithArg 42", intakeRequest.getMessage()); - assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); - assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); - requestReceived.set(true); - }); + registerIntakeRequestListener(intakeRequest -> { + Snapshot snapshot = intakeRequest.getDebugger().getSnapshot(); + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals("processWithArg 42", intakeRequest.getMessage()); + assertTrue(Pattern.matches("[0-9a-f]+", intakeRequest.getTraceId())); + assertTrue(Pattern.matches("\\d+", intakeRequest.getSpanId())); + requestReceived.set(true); + }); String httpPort = startSpringApp(singletonList(logProbe)); sendRequest(httpPort, "/greeting"); processRequests( diff --git a/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/AppSecActivationSmokeTest.java b/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/AppSecActivationSmokeTest.java index 6e83f85d3b2..dfe202183ab 100644 --- a/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/AppSecActivationSmokeTest.java +++ b/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/AppSecActivationSmokeTest.java @@ -47,12 +47,11 @@ class AppSecActivationSmokeTest { static final AgentBackend agent = AgentBackend.testAgent(); @RegisterExtension - static final SmokeCliApp app = - SmokeCliApp.named("appsec-activation") - .mainClass(AppSecApplication.class, APPLICATION_JAR) - .jvmArgs("-Ddd.remote_config.enabled=true", "-Ddd.remote_config.poll_interval.seconds=1") - .backend(agent) - .build(); + static final SmokeCliApp app = SmokeCliApp.named("appsec-activation") + .mainClass(AppSecApplication.class, APPLICATION_JAR) + .jvmArgs("-Ddd.remote_config.enabled=true", "-Ddd.remote_config.poll_interval.seconds=1") + .backend(agent) + .build(); @Test void activatesAppSecViaRemoteConfig() { @@ -63,9 +62,8 @@ void activatesAppSecViaRemoteConfig() { // AppSec is enabled but inactive: a poll that has not subscribed to any ASM rule product yet // advertises the ASM_ACTIVATION capability, but not ASM_CUSTOM_RULES. - Map beforeActivation = - remoteConfig.waitForRequest( - request -> disjoint(decodeProducts(request), ASM_RULE_PRODUCTS), TIMEOUT_IN_SECONDS); + Map beforeActivation = remoteConfig.waitForRequest( + request -> disjoint(decodeProducts(request), ASM_RULE_PRODUCTS), TIMEOUT_IN_SECONDS); long capabilities = RemoteConfig.capabilities(beforeActivation); assertTrue(hasCapability(capabilities, CAPABILITY_ASM_ACTIVATION), "ASM_ACTIVATION advertised"); assertFalse( @@ -81,9 +79,8 @@ void activatesAppSecViaRemoteConfig() { AppSecActivationSmokeTest::appsecEnabledFromRemoteConfig, TIMEOUT_IN_SECONDS); // Now active: the tracer subscribes to the ASM rule products and advertises ASM_CUSTOM_RULES. - Map afterActivation = - remoteConfig.waitForRequest( - request -> decodeProducts(request).containsAll(ASM_RULE_PRODUCTS), TIMEOUT_IN_SECONDS); + Map afterActivation = remoteConfig.waitForRequest( + request -> decodeProducts(request).containsAll(ASM_RULE_PRODUCTS), TIMEOUT_IN_SECONDS); assertTrue( hasCapability(RemoteConfig.capabilities(afterActivation), CAPABILITY_ASM_CUSTOM_RULES), "ASM_CUSTOM_RULES advertised after activation"); diff --git a/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/DynamicServiceMappingSmokeTest.java b/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/DynamicServiceMappingSmokeTest.java index 2805652786e..bb415ac6888 100644 --- a/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/DynamicServiceMappingSmokeTest.java +++ b/dd-smoke-tests/dynamic-config/src/test/java/datadog/smoketest/DynamicServiceMappingSmokeTest.java @@ -29,13 +29,12 @@ class DynamicServiceMappingSmokeTest { private static final TestAgentBackend agent = AgentBackend.testAgentBuilder().build(); @RegisterExtension - static final SmokeCliApp app = - SmokeCliApp.named("dynamic-service-mapping") - .mainClass(ServiceMappingApplication.class, APPLICATION_JAR) - .jvmArgs("-Ddd.remote_config.enabled=true", "-Ddd.remote_config.poll_interval.seconds=1") - .backend(agent) - .skipTelemetryCheck() - .build(); + static final SmokeCliApp app = SmokeCliApp.named("dynamic-service-mapping") + .mainClass(ServiceMappingApplication.class, APPLICATION_JAR) + .jvmArgs("-Ddd.remote_config.enabled=true", "-Ddd.remote_config.poll_interval.seconds=1") + .backend(agent) + .skipTelemetryCheck() + .build(); @Test void updatedServiceMappingObserved() { diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/AbstractGradleTest.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/AbstractGradleTest.java index 6cb475766af..f7ac87d4d34 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/AbstractGradleTest.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/AbstractGradleTest.java @@ -44,7 +44,8 @@ public abstract class AbstractGradleTest extends CiVisibilitySmokeTest { private static final int TEMP_DIR_CLEANUP_RETRIES = 10; private static final long TEMP_DIR_CLEANUP_RETRY_DELAY_MILLIS = 200; - @TempDir protected Path projectFolder; + @TempDir + protected Path projectFolder; protected final MockBackend mockBackend = new MockBackend(); @@ -84,11 +85,10 @@ protected static void deleteTempDirectoryQuietly(Path directory) { } } if (Files.exists(directory)) { - System.err.println( - "WARNING: could not fully delete temp directory " - + directory - + " after stopping Gradle daemons; leaving it for the OS to reap. " - + "A Gradle daemon likely still holds a file handle on it."); + System.err.println("WARNING: could not fully delete temp directory " + + directory + + " after stopping Gradle daemons; leaving it for the OS to reap. " + + "A Gradle daemon likely still holds a file handle on it."); } } @@ -99,32 +99,27 @@ protected static void killGradleDaemonsIn(Path testKitDir) { } boolean windows = OperatingSystem.isWindows(); try (Stream files = Files.walk(testKitDir)) { - files - .filter(Files::isRegularFile) - .forEach( - file -> { - String name = file.getFileName().toString(); - if (!name.startsWith("daemon-") || !name.endsWith(".out.log")) { - return; - } - String pid = - name.substring("daemon-".length(), name.length() - ".out.log".length()); - if (!pid.matches("\\d+")) { - // skip the UUID fallback Gradle uses when the PID is unavailable - return; - } - ProcessBuilder kill = - windows - ? new ProcessBuilder("taskkill", "/F", "/PID", pid) - : new ProcessBuilder("kill", pid); - try { - kill.redirectErrorStream(true).start().waitFor(5, TimeUnit.SECONDS); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (Exception e) { - // best effort — the daemon may already be stopped - } - }); + files.filter(Files::isRegularFile).forEach(file -> { + String name = file.getFileName().toString(); + if (!name.startsWith("daemon-") || !name.endsWith(".out.log")) { + return; + } + String pid = name.substring("daemon-".length(), name.length() - ".out.log".length()); + if (!pid.matches("\\d+")) { + // skip the UUID fallback Gradle uses when the PID is unavailable + return; + } + ProcessBuilder kill = windows + ? new ProcessBuilder("taskkill", "/F", "/PID", pid) + : new ProcessBuilder("kill", pid); + try { + kill.redirectErrorStream(true).start().waitFor(5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (Exception e) { + // best effort — the daemon may already be stopped + } + }); } catch (Exception e) { // best effort — failing to enumerate daemon logs must not fail the test run } @@ -141,47 +136,42 @@ protected void givenGradleProjectFiles( throws IOException { Path projectResourcesPath; try { - projectResourcesPath = - Paths.get(this.getClass().getClassLoader().getResource(projectFilesSources).toURI()); + projectResourcesPath = Paths.get( + this.getClass().getClassLoader().getResource(projectFilesSources).toURI()); } catch (Exception e) { throw new RuntimeException(e); } FileUtils.copyDirectory(projectResourcesPath.toFile(), projectFolder.toFile()); - Files.walkFileTree( - projectFolder, - new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - Map replacements = - replacementsByFileName.get(file.getFileName().toString()); - if (replacements != null) { - String fileContents = new String(Files.readAllBytes(file), StandardCharsets.UTF_8); - Matcher matcher = PLACEHOLDER_PATTERN.matcher(fileContents); + Files.walkFileTree(projectFolder, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Map replacements = + replacementsByFileName.get(file.getFileName().toString()); + if (replacements != null) { + String fileContents = new String(Files.readAllBytes(file), StandardCharsets.UTF_8); + Matcher matcher = PLACEHOLDER_PATTERN.matcher(fileContents); - StringBuffer result = new StringBuffer(); - while (matcher.find()) { - String propertyName = matcher.group(1); - String replacement = replacements.getOrDefault(propertyName, matcher.group(0)); - matcher.appendReplacement(result, Matcher.quoteReplacement(replacement)); - } - matcher.appendTail(result); + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + String propertyName = matcher.group(1); + String replacement = replacements.getOrDefault(propertyName, matcher.group(0)); + matcher.appendReplacement(result, Matcher.quoteReplacement(replacement)); + } + matcher.appendTail(result); - Files.write(file, result.toString().getBytes(StandardCharsets.UTF_8)); - } + Files.write(file, result.toString().getBytes(StandardCharsets.UTF_8)); + } - if (file.toString().endsWith(GRADLE_TEST_RESOURCE_EXTENSION)) { - Path fileWithFixedExtension = - Paths.get( - file.toString() - .replace(GRADLE_TEST_RESOURCE_EXTENSION, GRADLE_REGULAR_EXTENSION)); - Files.move(file, fileWithFixedExtension); - } + if (file.toString().endsWith(GRADLE_TEST_RESOURCE_EXTENSION)) { + Path fileWithFixedExtension = Paths.get( + file.toString().replace(GRADLE_TEST_RESOURCE_EXTENSION, GRADLE_REGULAR_EXTENSION)); + Files.move(file, fileWithFixedExtension); + } - return FileVisitResult.CONTINUE; - } - }); + return FileVisitResult.CONTINUE; + } + }); // creating empty .git directory so that the tracer could detect projectFolder as repo root Files.createDirectory(projectFolder.resolve(".git")); @@ -253,10 +243,9 @@ protected void givenConfigurationCacheIsCompatibleWithCurrentPlatform( private static Properties loadToolVersions() { Properties properties = new Properties(); - try (InputStream stream = - AbstractGradleTest.class - .getClassLoader() - .getResourceAsStream("latest-tool-versions.properties")) { + try (InputStream stream = AbstractGradleTest.class + .getClassLoader() + .getResourceAsStream("latest-tool-versions.properties")) { if (stream == null) { throw new IllegalStateException( "Could not find latest-tool-versions.properties on classpath"); @@ -271,11 +260,10 @@ private static Properties loadToolVersions() { protected static String toolVersion(String key) { String value = TOOL_VERSIONS.getProperty(key); if (value == null) { - throw new IllegalStateException( - "Missing '" - + key - + "' in latest-tool-versions.properties; re-run the " - + "update-smoke-test-latest-versions workflow."); + throw new IllegalStateException("Missing '" + + key + + "' in latest-tool-versions.properties; re-run the " + + "update-smoke-test-latest-versions workflow."); } return value; } diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java index 37cd8c8a99c..72e650842a3 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDaemonSmokeTest.java @@ -50,11 +50,10 @@ class GradleDaemonSmokeTest extends AbstractGradleTest { private static final String TEST_SERVICE_NAME = "test-gradle-service"; - private static final Path GRADLE_DAEMON_DIAGNOSTICS_DIR = - Paths.get( - System.getProperty("datadog.smoketest.builddir", "build"), - "reports", - "gradle-daemon-diagnostics"); + private static final Path GRADLE_DAEMON_DIAGNOSTICS_DIR = Paths.get( + System.getProperty("datadog.smoketest.builddir", "build"), + "reports", + "gradle-daemon-diagnostics"); private static final Pattern DAEMON_LOG_PATTERN = Pattern.compile("daemon-(.+)\\.out\\.log"); // Gradle's default timeout is 10s @@ -196,9 +195,8 @@ void testInjectedDependencyVerification(String gradleVersion, boolean verificati givenGradleProjectProperties(additionalArgs); ensureDependenciesDownloaded(gradleVersion); - BuildResult buildResult = - runGradle( - gradleVersion, Arrays.asList("compileJava", "--stacktrace"), !verificationEnabled); + BuildResult buildResult = runGradle( + gradleVersion, Arrays.asList("compileJava", "--stacktrace"), !verificationEnabled); if (verificationEnabled) { assertTrue(buildResult.getOutput().contains("Dependency verification failed")); @@ -391,12 +389,11 @@ private BuildResult runGradleTests( private void ensureDependenciesDownloaded(String gradleVersion) { try { org.gradle.wrapper.Logger logger = new org.gradle.wrapper.Logger(false); - Download download = - new Download( - logger, - "Gradle Tooling API", - GradleVersion.current().getVersion(), - GRADLE_DISTRIBUTION_NETWORK_TIMEOUT); + Download download = new Download( + logger, + "Gradle Tooling API", + GradleVersion.current().getVersion(), + GRADLE_DISTRIBUTION_NETWORK_TIMEOUT); java.io.File userHomeDir = testKitFolder.toFile(); java.io.File projectDir = projectFolder.toFile(); @@ -432,15 +429,14 @@ private BuildResult runGradle( } GradleDistribution.propagateMassReadUrl(buildEnv); - GradleRunner gradleRunner = - GradleDistribution.withDistribution( - GradleRunner.create() - .withTestKitDir(testKitFolder.toFile()) - .withProjectDir(projectFolder.toFile()), - gradleVersion) - .withArguments(arguments) - .withEnvironment(buildEnv) - .forwardOutput(); + GradleRunner gradleRunner = GradleDistribution.withDistribution( + GradleRunner.create() + .withTestKitDir(testKitFolder.toFile()) + .withProjectDir(projectFolder.toFile()), + gradleVersion) + .withArguments(arguments) + .withEnvironment(buildEnv) + .forwardOutput(); try { return successExpected ? gradleRunner.build() : gradleRunner.buildAndFail(); @@ -460,10 +456,8 @@ private static void addCrashDiagnostics(List arguments) { if (JavaVirtualMachine.isJ9()) { arguments.add("-Xdump:directory=" + GRADLE_DAEMON_DIAGNOSTICS_DIR.toAbsolutePath()); } else { - arguments.add( - "-XX:ErrorFile=" - + GRADLE_DAEMON_DIAGNOSTICS_DIR.toAbsolutePath() - + "/hs_err_pid%p.log"); + arguments.add("-XX:ErrorFile=" + GRADLE_DAEMON_DIAGNOSTICS_DIR.toAbsolutePath() + + "/hs_err_pid%p.log"); } } catch (IOException e) { System.err.println("Failed to configure Gradle daemon crash diagnostics: " + e); @@ -472,9 +466,8 @@ private static void addCrashDiagnostics(List arguments) { private void collectDaemonDiagnostics(String gradleVersion, Exception failure) throws IOException { - Path failureDir = - GRADLE_DAEMON_DIAGNOSTICS_DIR.resolve( - gradleVersion + "-" + projectFolder.getFileName().toString()); + Path failureDir = GRADLE_DAEMON_DIAGNOSTICS_DIR.resolve( + gradleVersion + "-" + projectFolder.getFileName().toString()); Files.createDirectories(failureDir); List summary = new ArrayList<>(); @@ -523,9 +516,8 @@ private void collectDaemonDiagnostics(String gradleVersion, Exception failure) try { System.out.println("=============================================================="); - System.out.println( - "Gradle Daemon log:\n" - + new String(Files.readAllBytes(daemonLog), StandardCharsets.UTF_8)); + System.out.println("Gradle Daemon log:\n" + + new String(Files.readAllBytes(daemonLog), StandardCharsets.UTF_8)); System.out.println("=============================================================="); } catch (IOException e) { summary.add("daemonLogReadFailed=" + e); @@ -593,7 +585,8 @@ private static Path newestDaemonLog(Path daemonLogDir) throws IOException { } try (Stream daemonLogs = Files.list(daemonLogDir)) { return daemonLogs - .filter(path -> DAEMON_LOG_PATTERN.matcher(path.getFileName().toString()).matches()) + .filter( + path -> DAEMON_LOG_PATTERN.matcher(path.getFileName().toString()).matches()) .max(Comparator.comparingLong(path -> path.toFile().lastModified())) .orElse(null); } diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDistribution.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDistribution.java index edaa526dbac..727ba1485f1 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDistribution.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleDistribution.java @@ -60,10 +60,7 @@ static void rewriteWrapperDistributionUrl(Path projectFolder, String gradleVersi private static URI massUriFor(String massReadUrl, String gradleVersion) { String baseUrl = massReadUrl.endsWith("/") ? massReadUrl : massReadUrl + "/"; - return URI.create( - baseUrl - + "internal/artifact/services.gradle.org/distributions/gradle-" - + gradleVersion - + "-bin.zip"); + return URI.create(baseUrl + "internal/artifact/services.gradle.org/distributions/gradle-" + + gradleVersion + "-bin.zip"); } } diff --git a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java index 199e21bfe70..38f71d8753f 100644 --- a/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java +++ b/dd-smoke-tests/gradle/src/test/java/datadog/smoketest/GradleLauncherSmokeTest.java @@ -30,7 +30,8 @@ class GradleLauncherSmokeTest extends AbstractGradleTest { private static final String JAVA_HOME = buildJavaHome(); - @TempDir static Path gradleUserHome; + @TempDir + static Path gradleUserHome; @TableTest({ "scenario | gradleVersion | gradleDaemonCmdLineParams ", diff --git a/dd-smoke-tests/grpc-1.5/src/main/java/datadog/smoketest/grpc/App.java b/dd-smoke-tests/grpc-1.5/src/main/java/datadog/smoketest/grpc/App.java index 74137b6fe0c..36fc6c11d3d 100644 --- a/dd-smoke-tests/grpc-1.5/src/main/java/datadog/smoketest/grpc/App.java +++ b/dd-smoke-tests/grpc-1.5/src/main/java/datadog/smoketest/grpc/App.java @@ -18,24 +18,20 @@ public class App { private void start() throws IOException { int port = Integer.getInteger("grpc.http.port", 8080); - server = - Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create()) - .addService(new IastServiceImpl()) - .build() - .start(); + server = Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create()) + .addService(new IastServiceImpl()) + .build() + .start(); logger.info("Server started, listening on " + port); - Runtime.getRuntime() - .addShutdownHook( - new Thread( - () -> { - System.err.println("*** shutting down gRPC server since JVM is shutting down"); - try { - App.this.stop(); - } catch (InterruptedException e) { - e.printStackTrace(System.err); - } - System.err.println("*** server shut down"); - })); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + System.err.println("*** shutting down gRPC server since JVM is shutting down"); + try { + App.this.stop(); + } catch (InterruptedException e) { + e.printStackTrace(System.err); + } + System.err.println("*** server shut down"); + })); } private void stop() throws InterruptedException { diff --git a/dd-smoke-tests/iast-propagation/src/main/java/datadog/smoketest/springboot/PropagationController.java b/dd-smoke-tests/iast-propagation/src/main/java/datadog/smoketest/springboot/PropagationController.java index 3302b4916c5..fdd1b54edae 100644 --- a/dd-smoke-tests/iast-propagation/src/main/java/datadog/smoketest/springboot/PropagationController.java +++ b/dd-smoke-tests/iast-propagation/src/main/java/datadog/smoketest/springboot/PropagationController.java @@ -30,17 +30,15 @@ public String propagation( @SuppressWarnings("unchecked") private Supplier> supplierForLanguage(final String language) { - return suppliers.computeIfAbsent( - language, - l -> { - try { - String name = Character.toUpperCase(l.charAt(0)) + l.substring(1) + "Propagation"; - Class instance = Thread.currentThread().getContextClassLoader().loadClass(name); - return (Supplier>) instance.newInstance(); - } catch (final Exception e) { - throw new RuntimeException(e); - } - }); + return suppliers.computeIfAbsent(language, l -> { + try { + String name = Character.toUpperCase(l.charAt(0)) + l.substring(1) + "Propagation"; + Class instance = Thread.currentThread().getContextClassLoader().loadClass(name); + return (Supplier>) instance.newInstance(); + } catch (final Exception e) { + throw new RuntimeException(e); + } + }); } private String invokeMethod( diff --git a/dd-smoke-tests/iast-util/iast-util-11/src/main/java/datadog/smoketest/springboot/controller/SsrfController.java b/dd-smoke-tests/iast-util/iast-util-11/src/main/java/datadog/smoketest/springboot/controller/SsrfController.java index 9cf1dc620bf..baf02a82b3e 100644 --- a/dd-smoke-tests/iast-util/iast-util-11/src/main/java/datadog/smoketest/springboot/controller/SsrfController.java +++ b/dd-smoke-tests/iast-util/iast-util-11/src/main/java/datadog/smoketest/springboot/controller/SsrfController.java @@ -32,14 +32,12 @@ public String javaNet( httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString()); } } else { - HttpRequest httpRequest = - HttpRequest.newBuilder() - .uri(new URI(uri)) - .timeout( - java.time.Duration.ofSeconds( - 1)) // prevents Idle timeout expired in jetty servers when the client is not - // responding in sync mode - .build(); + HttpRequest httpRequest = HttpRequest.newBuilder() + .uri(new URI(uri)) + .timeout(java.time.Duration.ofSeconds( + 1)) // prevents Idle timeout expired in jetty servers when the client is not + // responding in sync mode + .build(); httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); } } catch (Exception e) { diff --git a/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/controller/IastWebController.java b/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/controller/IastWebController.java index f9b20ca2796..de30196b315 100644 --- a/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/controller/IastWebController.java +++ b/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/controller/IastWebController.java @@ -229,9 +229,7 @@ public String matrixAndPathVariables( @PostMapping("/request_body/test") public String jsonRequestBody(@RequestBody TestBean testBean) { - return "@RequestBody to Test bean -> name: " - + testBean.getName() - + ", value: " + return "@RequestBody to Test bean -> name: " + testBean.getName() + ", value: " + testBean.getValue(); } @@ -337,17 +335,15 @@ public String handleFileUpload( public String jakartaMailHtmlVulnerability(HttpServletRequest request) throws jakarta.mail.MessagingException { jakarta.mail.Session session = jakarta.mail.Session.getDefaultInstance(new Properties()); - jakarta.mail.Provider provider = - new jakarta.mail.Provider( - jakarta.mail.Provider.Type.TRANSPORT, - "smtp", - JakartaMockTransport.class.getName(), - "MockTransport", - "1.0"); + jakarta.mail.Provider provider = new jakarta.mail.Provider( + jakarta.mail.Provider.Type.TRANSPORT, + "smtp", + JakartaMockTransport.class.getName(), + "MockTransport", + "1.0"); session.setProvider(provider); - boolean sanitize = - StringUtils.isNotEmpty(request.getParameter("sanitize")) - && request.getParameter("sanitize").equalsIgnoreCase("true"); + boolean sanitize = StringUtils.isNotEmpty(request.getParameter("sanitize")) + && request.getParameter("sanitize").equalsIgnoreCase("true"); jakarta.mail.internet.MimeMessage message = new jakarta.mail.internet.MimeMessage(session); if (request.getParameter("messageText") != null) { message.setText( @@ -480,11 +476,10 @@ private interface Operation { public static class CustomStringReader extends StringReader { public CustomStringReader(String s) { - super( - "Super " - + s - + (new StringReader( - "New_1" + new StringReader("New_2" + new StringReader("New_3" + s))))); + super("Super " + + s + + (new StringReader( + "New_1" + new StringReader("New_2" + new StringReader("New_3" + s))))); } } } diff --git a/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartGetItemIteratorServlet.java b/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartGetItemIteratorServlet.java index 379b3e52527..6f67a24df21 100644 --- a/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartGetItemIteratorServlet.java +++ b/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartGetItemIteratorServlet.java @@ -19,7 +19,8 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr final ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); try { final FileItemIterator fileItemIterator = servletFileUpload.getItemIterator(request); - final ObjectInputStream ois = new ObjectInputStream(fileItemIterator.next().openStream()); + final ObjectInputStream ois = + new ObjectInputStream(fileItemIterator.next().openStream()); ois.close(); response.setHeader("Content-Type", "text/plain"); response.getWriter().write("OK"); diff --git a/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartParseRequestServlet.java b/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartParseRequestServlet.java index 9dc7f825515..ddaba52097e 100644 --- a/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartParseRequestServlet.java +++ b/dd-smoke-tests/iast-util/src/main/java/datadog/smoketest/springboot/servlet/MultipartParseRequestServlet.java @@ -20,7 +20,8 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr final ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); try { final List fileItemIterator = servletFileUpload.parseRequest(request); - final ObjectInputStream ois = new ObjectInputStream(fileItemIterator.get(0).getInputStream()); + final ObjectInputStream ois = + new ObjectInputStream(fileItemIterator.get(0).getInputStream()); ois.close(); response.setHeader("Content-Type", "text/plain"); response.getWriter().write("OK"); diff --git a/dd-smoke-tests/jersey-2/src/main/java/com/restserver/Resource.java b/dd-smoke-tests/jersey-2/src/main/java/com/restserver/Resource.java index 2538b616a34..30713c0bfb1 100644 --- a/dd-smoke-tests/jersey-2/src/main/java/com/restserver/Resource.java +++ b/dd-smoke-tests/jersey-2/src/main/java/com/restserver/Resource.java @@ -125,13 +125,17 @@ public String sourceParameterName(Form form) { @Path("/setlocationheader") @GET public Response locationHeader(@QueryParam("param") String param) { - return Response.status(Response.Status.TEMPORARY_REDIRECT).header("Location", param).build(); + return Response.status(Response.Status.TEMPORARY_REDIRECT) + .header("Location", param) + .build(); } @Path("/setresponselocation") @GET public Response responseLocation(@QueryParam("param") String param) throws URISyntaxException { - return Response.status(Response.Status.TEMPORARY_REDIRECT).location(new URI(param)).build(); + return Response.status(Response.Status.TEMPORARY_REDIRECT) + .location(new URI(param)) + .build(); } @Path("/insecurecookie") @@ -151,6 +155,9 @@ public Response bodyJson(RequestBody input) { @GET @Path("/api_security/sampling/{i}") public Response apiSecuritySamplingWithStatus(@PathParam("i") int i) { - return Response.status(i).header("content-type", "text/plain").entity("Hello!\n").build(); + return Response.status(i) + .header("content-type", "text/plain") + .entity("Hello!\n") + .build(); } } diff --git a/dd-smoke-tests/jersey-3/src/main/java/smoketest/MainApp.java b/dd-smoke-tests/jersey-3/src/main/java/smoketest/MainApp.java index 292a233b6eb..516bb04aedd 100644 --- a/dd-smoke-tests/jersey-3/src/main/java/smoketest/MainApp.java +++ b/dd-smoke-tests/jersey-3/src/main/java/smoketest/MainApp.java @@ -43,9 +43,8 @@ public static HttpServer startServer(String httpPort) { public static void main(String[] args) { String httpPort = "8034"; - ParamConverter paramConverter = - new StringConstructor() - .getConverter(String.class, new GenericClass(String.class).getMyType(), null); + ParamConverter paramConverter = new StringConstructor() + .getConverter(String.class, new GenericClass(String.class).getMyType(), null); Object pepe = paramConverter.fromString("Pepe"); if (args.length == 1) { @@ -56,20 +55,17 @@ public static void main(String[] args) { final HttpServer httpServer = startServer(httpPort); // add jvm shutdown hook - Runtime.getRuntime() - .addShutdownHook( - new Thread( - () -> { - try { - System.out.println("Shutting down the application..."); - - httpServer.shutdownNow(); - - System.out.println("Done, exit."); - } catch (Exception e) { - Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, e); - } - })); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + System.out.println("Shutting down the application..."); + + httpServer.shutdownNow(); + + System.out.println("Done, exit."); + } catch (Exception e) { + Logger.getLogger(MainApp.class.getName()).log(Level.SEVERE, null, e); + } + })); System.out.println("Application started."); System.out.println("Stop the application using CTRL+C"); diff --git a/dd-smoke-tests/jersey-3/src/main/java/smoketest/Resource.java b/dd-smoke-tests/jersey-3/src/main/java/smoketest/Resource.java index 9e5d7364ca3..78e64939730 100644 --- a/dd-smoke-tests/jersey-3/src/main/java/smoketest/Resource.java +++ b/dd-smoke-tests/jersey-3/src/main/java/smoketest/Resource.java @@ -116,13 +116,17 @@ public String sourceParameterName(Form form) { @Path("/setlocationheader") @GET public Response locationHeader(@QueryParam("param") String param) { - return Response.status(Response.Status.TEMPORARY_REDIRECT).header("Location", param).build(); + return Response.status(Response.Status.TEMPORARY_REDIRECT) + .header("Location", param) + .build(); } @Path("/setresponselocation") @GET public Response responseLocation(@QueryParam("param") String param) throws URISyntaxException { - return Response.status(Response.Status.TEMPORARY_REDIRECT).location(new URI(param)).build(); + return Response.status(Response.Status.TEMPORARY_REDIRECT) + .location(new URI(param)) + .build(); } @Path("/insecurecookie") @@ -142,6 +146,9 @@ public Response bodyJson(RequestBody input) { @GET @Path("/api_security/sampling/{i}") public Response apiSecuritySamplingWithStatus(@PathParam("i") int i) { - return Response.status(i).header("content-type", "text/plain").entity("Hello!\n").build(); + return Response.status(i) + .header("content-type", "text/plain") + .entity("Hello!\n") + .build(); } } diff --git a/dd-smoke-tests/jersey-3/src/main/java/smoketest/config/AutoScanFeature.java b/dd-smoke-tests/jersey-3/src/main/java/smoketest/config/AutoScanFeature.java index 548f8ed7231..7efa35bf48b 100644 --- a/dd-smoke-tests/jersey-3/src/main/java/smoketest/config/AutoScanFeature.java +++ b/dd-smoke-tests/jersey-3/src/main/java/smoketest/config/AutoScanFeature.java @@ -16,7 +16,8 @@ /* Auto scan the jax-rx @Contract and @Service */ public class AutoScanFeature implements Feature { - @Inject ServiceLocator serviceLocator; + @Inject + ServiceLocator serviceLocator; @Override public boolean configure(FeatureContext context) { diff --git a/dd-smoke-tests/junit-console/src/test/java/datadog/smoketest/JUnitConsoleSmokeTest.java b/dd-smoke-tests/junit-console/src/test/java/datadog/smoketest/JUnitConsoleSmokeTest.java index 17d9f2704fc..93c6667fe8a 100644 --- a/dd-smoke-tests/junit-console/src/test/java/datadog/smoketest/JUnitConsoleSmokeTest.java +++ b/dd-smoke-tests/junit-console/src/test/java/datadog/smoketest/JUnitConsoleSmokeTest.java @@ -46,7 +46,8 @@ class JUnitConsoleSmokeTest extends CiVisibilitySmokeTest { System.getProperty("datadog.smoketest.junit.console.jar.path"); private static final String JAVA_HOME = buildJavaHome(); - @TempDir Path projectHome; + @TempDir + Path projectHome; static final MockBackend mockBackend = new MockBackend(); @@ -83,10 +84,9 @@ void testHeadlessFailedTestReplay() throws Exception { int exitCode = whenRunningJUnitConsole(agentArgs, Collections.emptyMap()); assertEquals(1, exitCode); - List additionalDynamicTags = - Arrays.asList( - "content.meta.['_dd.debug.error.6.snapshot_id']", - "content.meta.['_dd.debug.error.exception_id']"); + List additionalDynamicTags = Arrays.asList( + "content.meta.['_dd.debug.error.6.snapshot_id']", + "content.meta.['_dd.debug.error.exception_id']"); verifyEventsAndCoverages( projectName, "junit-console", @@ -98,29 +98,26 @@ void testHeadlessFailedTestReplay() throws Exception { } private void givenProjectFiles(String projectFilesSources) throws Exception { - Path projectResourcesPath = - Paths.get(this.getClass().getClassLoader().getResource(projectFilesSources).toURI()); + Path projectResourcesPath = Paths.get( + this.getClass().getClassLoader().getResource(projectFilesSources).toURI()); copyFolder(projectResourcesPath, projectHome); } private void copyFolder(Path src, Path dest) throws IOException { - Files.walkFileTree( - src, - new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - Files.createDirectories(dest.resolve(src.relativize(dir))); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - Files.copy(file, dest.resolve(src.relativize(file))); - return FileVisitResult.CONTINUE; - } - }); + Files.walkFileTree(src, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + Files.createDirectories(dest.resolve(src.relativize(dir))); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.copy(file, dest.resolve(src.relativize(file))); + return FileVisitResult.CONTINUE; + } + }); // creating empty .git directory so that the tracer could detect projectFolder as repo root Files.createDirectory(projectHome.resolve(".git")); @@ -139,12 +136,11 @@ private int compileTestProject() throws Exception { if (Files.exists(srcDir)) { List mainJavaFiles = findJavaFiles(srcDir); if (!mainJavaFiles.isEmpty()) { - int result = - runProcess( - createCompilerProcessBuilder( - classesDir.toString(), mainJavaFiles, Collections.emptyList()) - .start(), - PROCESS_TIMEOUT_SECS); + int result = runProcess( + createCompilerProcessBuilder( + classesDir.toString(), mainJavaFiles, Collections.emptyList()) + .start(), + PROCESS_TIMEOUT_SECS); if (result != 0) { LOGGER.error("Error compiling source classes for JUnit Console smoke test"); return result; @@ -155,14 +151,13 @@ private int compileTestProject() throws Exception { // Compile test classes List testJavaFiles = findJavaFiles(testSrcDir); if (!testJavaFiles.isEmpty()) { - int result = - runProcess( - createCompilerProcessBuilder( - testClassesDir.toString(), - testJavaFiles, - Collections.singletonList(classesDir.toString())) - .start(), - PROCESS_TIMEOUT_SECS); + int result = runProcess( + createCompilerProcessBuilder( + testClassesDir.toString(), + testJavaFiles, + Collections.singletonList(classesDir.toString())) + .start(), + PROCESS_TIMEOUT_SECS); if (result != 0) { LOGGER.error("Error compiling source classes for JUnit Console smoke test"); return result; @@ -198,18 +193,15 @@ private static List findJavaFiles(Path directory) throws IOException { } List javaFiles = new ArrayList<>(); - Files.walkFileTree( - directory, - new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - if (file.toString().endsWith(".java")) { - javaFiles.add(file.toString()); - } - return FileVisitResult.CONTINUE; - } - }); + Files.walkFileTree(directory, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (file.toString().endsWith(".java")) { + javaFiles.add(file.toString()); + } + return FileVisitResult.CONTINUE; + } + }); return javaFiles; } @@ -217,9 +209,8 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) private int whenRunningJUnitConsole( Map additionalAgentArgs, Map additionalEnvVars) throws Exception { - ProcessBuilder processBuilder = - createConsoleProcessBuilder( - Collections.singletonList("execute"), additionalAgentArgs, additionalEnvVars); + ProcessBuilder processBuilder = createConsoleProcessBuilder( + Collections.singletonList("execute"), additionalAgentArgs, additionalEnvVars); processBuilder.environment().put("DD_API_KEY", "01234567890abcdef123456789ABCDEF"); return runProcess(processBuilder.start(), PROCESS_TIMEOUT_SECS); } @@ -250,12 +241,9 @@ ProcessBuilder createConsoleProcessBuilder( command.add("-Ddatadog.slf4j.simpleLogger.defaultLogLevel=DEBUG"); command.addAll(Arrays.asList("-jar", JUNIT_CONSOLE_JAR_PATH)); command.addAll(consoleCommand); - command.addAll( - Arrays.asList( - "--class-path", - projectHome.resolve("target/classes") - + ":" - + projectHome.resolve("target/test-classes"))); + command.addAll(Arrays.asList( + "--class-path", + projectHome.resolve("target/classes") + ":" + projectHome.resolve("target/test-classes"))); command.add("--scan-class-path"); ProcessBuilder processBuilder = new ProcessBuilder(command); diff --git a/dd-smoke-tests/lib-injection/src/main/java/datadog/smoketest/Application.java b/dd-smoke-tests/lib-injection/src/main/java/datadog/smoketest/Application.java index fdc1711fedd..8e08c46e7ab 100644 --- a/dd-smoke-tests/lib-injection/src/main/java/datadog/smoketest/Application.java +++ b/dd-smoke-tests/lib-injection/src/main/java/datadog/smoketest/Application.java @@ -8,7 +8,8 @@ public class Application { public static void main(String[] args) throws InterruptedException { // Get an Open Telemetry tracer - Tracer tracer = GlobalOpenTelemetry.getTracerProvider().tracerBuilder("smoketests").build(); + Tracer tracer = + GlobalOpenTelemetry.getTracerProvider().tracerBuilder("smoketests").build(); // Create a trace with few spans for (int i = 0; i < 10; i++) { Span span = tracer.spanBuilder("span-" + i).startSpan(); diff --git a/dd-smoke-tests/log-injection/src/main/java/datadog/smoketest/loginjection/BaseApplication.java b/dd-smoke-tests/log-injection/src/main/java/datadog/smoketest/loginjection/BaseApplication.java index 09b82cd8536..f7d4d0d514a 100644 --- a/dd-smoke-tests/log-injection/src/main/java/datadog/smoketest/loginjection/BaseApplication.java +++ b/dd-smoke-tests/log-injection/src/main/java/datadog/smoketest/loginjection/BaseApplication.java @@ -56,41 +56,29 @@ private static boolean getLogInjectionEnabled() { @Trace public void firstTracedMethod() { doLog("INSIDE FIRST SPAN"); - System.out.println( - "FIRSTTRACEID " - + CorrelationIdentifier.getTraceId() - + " " - + CorrelationIdentifier.getSpanId()); + System.out.println("FIRSTTRACEID " + CorrelationIdentifier.getTraceId() + " " + + CorrelationIdentifier.getSpanId()); } @Trace public void secondTracedMethod() { doLog("INSIDE SECOND SPAN"); - System.out.println( - "SECONDTRACEID " - + CorrelationIdentifier.getTraceId() - + " " - + CorrelationIdentifier.getSpanId()); + System.out.println("SECONDTRACEID " + CorrelationIdentifier.getTraceId() + " " + + CorrelationIdentifier.getSpanId()); } @Trace public void thirdTracedMethod() { doLog("INSIDE THIRD SPAN"); - System.out.println( - "THIRDTRACEID " - + CorrelationIdentifier.getTraceId() - + " " - + CorrelationIdentifier.getSpanId()); + System.out.println("THIRDTRACEID " + CorrelationIdentifier.getTraceId() + " " + + CorrelationIdentifier.getSpanId()); } @Trace public void forthTracedMethod() { doLog("INSIDE FORTH SPAN"); - System.out.println( - "FORTHTRACEID " - + CorrelationIdentifier.getTraceId() - + " " - + CorrelationIdentifier.getSpanId()); + System.out.println("FORTHTRACEID " + CorrelationIdentifier.getTraceId() + " " + + CorrelationIdentifier.getSpanId()); } private static boolean waitForCondition(Supplier condition) throws InterruptedException { diff --git a/dd-smoke-tests/maven/src/main/java/datadog/smoketest/maven/MavenRunner.java b/dd-smoke-tests/maven/src/main/java/datadog/smoketest/maven/MavenRunner.java index 9bbb2c998f0..4324e13d087 100644 --- a/dd-smoke-tests/maven/src/main/java/datadog/smoketest/maven/MavenRunner.java +++ b/dd-smoke-tests/maven/src/main/java/datadog/smoketest/maven/MavenRunner.java @@ -22,8 +22,7 @@ public class MavenRunner { public static void main(String[] args) throws Exception { if (args.length < 2) { throw new IllegalArgumentException( - "2 arguments are required: project home, command to execute. " - + "Got: " + "2 arguments are required: project home, command to execute. " + "Got: " + Arrays.toString(args)); } diff --git a/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java b/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java index 898c5d8afea..e16c1e34e19 100644 --- a/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java +++ b/dd-smoke-tests/maven/src/test/java/datadog/smoketest/MavenSmokeTest.java @@ -70,7 +70,8 @@ public static boolean disabledOnIbm8() { return JavaVirtualMachine.isIbm8(); } - @TempDir Path projectHome; + @TempDir + Path projectHome; static final MockBackend mockBackend = new MockBackend(); @@ -144,21 +145,19 @@ void testMavenRun( mockBackend.givenImpactedTestsDetection(true); - boolean coverageReportExpected = - jacocoCoverage - && CiVisibilitySmokeTest.class - .getClassLoader() - .getResource(projectName + "/coverage_report_event.ftl") - != null; + boolean coverageReportExpected = jacocoCoverage + && CiVisibilitySmokeTest.class + .getClassLoader() + .getResource(projectName + "/coverage_report_event.ftl") + != null; if (coverageReportExpected) { mockBackend.givenCodeCoverageReportUpload(true); } - Map agentArgs = - jacocoCoverage - ? Collections.singletonMap( - CiVisibilityConfig.CIVISIBILITY_JACOCO_PLUGIN_VERSION, JACOCO_PLUGIN_VERSION) - : Collections.emptyMap(); + Map agentArgs = jacocoCoverage + ? Collections.singletonMap( + CiVisibilityConfig.CIVISIBILITY_JACOCO_PLUGIN_VERSION, JACOCO_PLUGIN_VERSION) + : Collections.emptyMap(); int exitCode = whenRunningMavenBuild(agentArgs, commandLineParams, Collections.emptyMap(), true); @@ -216,9 +215,8 @@ void testTestManagement(String projectName, String mavenVersion) throws Exceptio "datadog.smoke.TestSucceeded", "test_another_succeeded"); - int exitCode = - whenRunningMavenBuild( - Collections.emptyMap(), Collections.emptyList(), Collections.emptyMap(), true); + int exitCode = whenRunningMavenBuild( + Collections.emptyMap(), Collections.emptyList(), Collections.emptyMap(), true); assertEquals(0, exitCode); verifyEventsAndCoverages( @@ -246,10 +244,9 @@ void testJunit4ClassOrdering( List expectedOrder, int eventsNumber) throws Exception { - surefireVersion = - "latest-maven-surefire".equals(surefireVersion) - ? getLatestMavenSurefireVersion() - : surefireVersion; + surefireVersion = "latest-maven-surefire".equals(surefireVersion) + ? getLatestMavenSurefireVersion() + : surefireVersion; Map additionalEnvVars = new HashMap<>(); additionalEnvVars.put("SMOKE_TEST_SUREFIRE_VERSION", surefireVersion); @@ -272,13 +269,12 @@ void testJunit4ClassOrdering( knownTest.getName()); } - int exitCode = - whenRunningMavenBuild( - Collections.singletonMap( - CiVisibilityConfig.CIVISIBILITY_TEST_ORDER, CIConstants.FAIL_FAST_TEST_ORDER), - Collections.emptyList(), - additionalEnvVars, - true); + int exitCode = whenRunningMavenBuild( + Collections.singletonMap( + CiVisibilityConfig.CIVISIBILITY_TEST_ORDER, CIConstants.FAIL_FAST_TEST_ORDER), + Collections.emptyList(), + additionalEnvVars, + true); assertEquals(0, exitCode); verifyTestOrder(mockBackend.waitForEvents(eventsNumber), expectedOrder); @@ -294,9 +290,8 @@ void testServiceNamePropagation(String projectName, String mavenVersion) throws givenMavenProjectFiles(projectName); givenMavenDependenciesAreLoaded(projectName, mavenVersion); - int exitCode = - whenRunningMavenBuild( - Collections.emptyMap(), Collections.emptyList(), Collections.emptyMap(), false); + int exitCode = whenRunningMavenBuild( + Collections.emptyMap(), Collections.emptyList(), Collections.emptyMap(), false); assertEquals(0, exitCode); List additionalDynamicPaths = Collections.singletonList("content.service"); @@ -336,10 +331,9 @@ void testFailedTestReplay(String projectName, String mavenVersion) throws Except whenRunningMavenBuild(agentArgs, Collections.emptyList(), Collections.emptyMap(), true); assertEquals(1, exitCode); - List additionalDynamicTags = - Arrays.asList( - "content.meta.['_dd.debug.error.3.snapshot_id']", - "content.meta.['_dd.debug.error.exception_id']"); + List additionalDynamicTags = Arrays.asList( + "content.meta.['_dd.debug.error.3.snapshot_id']", + "content.meta.['_dd.debug.error.exception_id']"); verifyEventsAndCoverages( projectName, "maven", @@ -351,12 +345,11 @@ void testFailedTestReplay(String projectName, String mavenVersion) throws Except } private void givenWrapperPropertiesFile(String mavenVersion) throws IOException { - String distributionUrl = - "https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/" - + mavenVersion - + "/apache-maven-" - + mavenVersion - + "-bin.zip"; + String distributionUrl = "https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/" + + mavenVersion + + "/apache-maven-" + + mavenVersion + + "-bin.zip"; Properties properties = new Properties(); properties.setProperty("distributionUrl", distributionUrl); @@ -369,33 +362,30 @@ private void givenWrapperPropertiesFile(String mavenVersion) throws IOException } private void givenMavenProjectFiles(String projectFilesSources) throws Exception { - Path projectResourcesPath = - Paths.get(this.getClass().getClassLoader().getResource(projectFilesSources).toURI()); + Path projectResourcesPath = Paths.get( + this.getClass().getClassLoader().getResource(projectFilesSources).toURI()); copyFolder(projectResourcesPath, projectHome); - Path sharedSettingsPath = - Paths.get(this.getClass().getClassLoader().getResource("settings.mirror.xml").toURI()); + Path sharedSettingsPath = Paths.get( + this.getClass().getClassLoader().getResource("settings.mirror.xml").toURI()); Files.copy(sharedSettingsPath, projectHome.resolve("settings.mirror.xml")); } private void copyFolder(Path src, Path dest) throws IOException { - Files.walkFileTree( - src, - new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - Files.createDirectories(dest.resolve(src.relativize(dir))); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - Files.copy(file, dest.resolve(src.relativize(file))); - return FileVisitResult.CONTINUE; - } - }); + Files.walkFileTree(src, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + Files.createDirectories(dest.resolve(src.relativize(dir))); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.copy(file, dest.resolve(src.relativize(file))); + return FileVisitResult.CONTINUE; + } + }); // creating empty .git directory so that the tracer could detect projectFolder as repo root Files.createDirectory(projectHome.resolve(".git")); @@ -454,12 +444,8 @@ private void retryUntilSuccessfulOrNoAttemptsLeft( LOGGER.warn("Failed dependency resolution with exception: ", e); } } - throw new AssertionError( - "Tried " - + DEPENDENCIES_DOWNLOAD_RETRIES - + " times to execute " - + mvnCommand - + " and failed"); + throw new AssertionError("Tried " + DEPENDENCIES_DOWNLOAD_RETRIES + " times to execute " + + mvnCommand + " and failed"); } private int whenRunningMavenBuild( @@ -473,9 +459,8 @@ private int whenRunningMavenBuild( mvnCommand.add("test"); mvnCommand.addAll(additionalCommandLineParams); - ProcessBuilder processBuilder = - createProcessBuilder( - mvnCommand, true, setServiceName, additionalAgentArgs, additionalEnvVars); + ProcessBuilder processBuilder = createProcessBuilder( + mvnCommand, true, setServiceName, additionalAgentArgs, additionalEnvVars); processBuilder.environment().put("DD_API_KEY", "01234567890abcdef123456789ABCDEF"); @@ -542,11 +527,10 @@ List jvmArguments( arguments.add("-Dmaven.multiModuleProjectDirectory=" + projectHome.toAbsolutePath()); arguments.add("-Dmaven.artifact.threads=10"); if (runWithAgent) { - arguments.addAll( - buildJvmArguments( - mockBackend.getIntakeUrl(), - setServiceName ? TEST_SERVICE_NAME : null, - additionalAgentArgs)); + arguments.addAll(buildJvmArguments( + mockBackend.getIntakeUrl(), + setServiceName ? TEST_SERVICE_NAME : null, + additionalAgentArgs)); } return arguments; } @@ -582,10 +566,9 @@ public void run() { private static Properties loadLatestToolVersions() { Properties properties = new Properties(); - try (InputStream stream = - MavenSmokeTest.class - .getClassLoader() - .getResourceAsStream("latest-tool-versions.properties")) { + try (InputStream stream = MavenSmokeTest.class + .getClassLoader() + .getResourceAsStream("latest-tool-versions.properties")) { if (stream == null) { throw new IllegalStateException( "Could not find latest-tool-versions.properties on classpath"); diff --git a/dd-smoke-tests/openfeature/application/src/main/java/datadog/smoketest/springboot/openfeature/OpenFeatureController.java b/dd-smoke-tests/openfeature/application/src/main/java/datadog/smoketest/springboot/openfeature/OpenFeatureController.java index 47b5e6b18ab..21035422baf 100644 --- a/dd-smoke-tests/openfeature/application/src/main/java/datadog/smoketest/springboot/openfeature/OpenFeatureController.java +++ b/dd-smoke-tests/openfeature/application/src/main/java/datadog/smoketest/springboot/openfeature/OpenFeatureController.java @@ -41,14 +41,12 @@ public ResponseEntity evaluate(@RequestBody final EvaluateRequest request) { FlagEvaluationDetails details; switch (request.getVariationType()) { case "BOOLEAN": - details = - client.getBooleanDetails( - request.getFlag(), (Boolean) request.getDefaultValue(), context); + details = client.getBooleanDetails( + request.getFlag(), (Boolean) request.getDefaultValue(), context); break; case "STRING": - details = - client.getStringDetails( - request.getFlag(), (String) request.getDefaultValue(), context); + details = client.getStringDetails( + request.getFlag(), (String) request.getDefaultValue(), context); break; case "INTEGER": final Number integerEval = (Number) request.getDefaultValue(); @@ -59,9 +57,8 @@ public ResponseEntity evaluate(@RequestBody final EvaluateRequest request) { details = client.getDoubleDetails(request.getFlag(), doubleEval.doubleValue(), context); break; case "JSON": - details = - client.getObjectDetails( - request.getFlag(), Value.objectToValue(request.getDefaultValue()), context); + details = client.getObjectDetails( + request.getFlag(), Value.objectToValue(request.getDefaultValue()), context); break; default: throw new IllegalArgumentException( @@ -88,24 +85,23 @@ private static EvaluationContext context(final EvaluateRequest request) { final MutableContext context = new MutableContext(); context.setTargetingKey(request.getTargetingKey()); if (request.attributes != null) { - request.attributes.forEach( - (key, value) -> { - if (value instanceof Boolean) { - context.add(key, (Boolean) value); - } else if (value instanceof Integer) { - context.add(key, (Integer) value); - } else if (value instanceof Double) { - context.add(key, (Double) value); - } else if (value instanceof String) { - context.add(key, (String) value); - } else if (value instanceof Map) { - context.add(key, Value.objectToValue(value).asStructure()); - } else if (value instanceof List) { - context.add(key, Value.objectToValue(value).asList()); - } else { - context.add(key, (Structure) null); - } - }); + request.attributes.forEach((key, value) -> { + if (value instanceof Boolean) { + context.add(key, (Boolean) value); + } else if (value instanceof Integer) { + context.add(key, (Integer) value); + } else if (value instanceof Double) { + context.add(key, (Double) value); + } else if (value instanceof String) { + context.add(key, (String) value); + } else if (value instanceof Map) { + context.add(key, Value.objectToValue(value).asStructure()); + } else if (value instanceof List) { + context.add(key, Value.objectToValue(value).asList()); + } else { + context.add(key, (Structure) null); + } + }); } return context; } diff --git a/dd-smoke-tests/opentelemetry/src/test/java/datadog/smoketest/OpenTelemetrySmokeTest.java b/dd-smoke-tests/opentelemetry/src/test/java/datadog/smoketest/OpenTelemetrySmokeTest.java index e3c87e30d3b..b69f0fe7f48 100644 --- a/dd-smoke-tests/opentelemetry/src/test/java/datadog/smoketest/OpenTelemetrySmokeTest.java +++ b/dd-smoke-tests/opentelemetry/src/test/java/datadog/smoketest/OpenTelemetrySmokeTest.java @@ -27,13 +27,12 @@ class OpenTelemetrySmokeTest { System.getProperty("datadog.smoketest.shadowJar.path"); @RegisterExtension - static final SmokeCliApp app = - SmokeCliApp.named("opentelemetry") - .jar(APPLICATION_JAR) - .jvmArgs("-Ddd.trace.otel.enabled=true") - .workingDirectory(WORKING_DIRECTORY) - .backend(testAgent()) - .build(); + static final SmokeCliApp app = SmokeCliApp.named("opentelemetry") + .jar(APPLICATION_JAR) + .jvmArgs("-Ddd.trace.otel.enabled=true") + .workingDirectory(WORKING_DIRECTORY) + .backend(testAgent()) + .build(); @Test void receivesTraces() { @@ -42,11 +41,10 @@ void receivesTraces() { TIMEOUT_SECONDS, UNORDERED, // The standalone annotated span from the app set-up. - trace( - span() - .root() - .operationName("Application.loadConfiguration") - .tag("events", validates(events -> events.contains("configuration-loaded")))), + trace(span() + .root() + .operationName("Application.loadConfiguration") + .tag("events", validates(events -> events.contains("configuration-loaded")))), // The batch trace: // batch-job (tracer, server, root) // ├─ Application.splitBatch (annotated, main thread) diff --git a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java index 94e290b8c2b..cc5c2d132f8 100644 --- a/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java +++ b/dd-smoke-tests/opentracing/src/main/java/datadog/smoketest/opentracing/ApiVerification.java @@ -9,24 +9,23 @@ public final class ApiVerification { private ApiVerification() {} public static void verifyInterceptors(Tracer otTracer, boolean throwError) { - TraceInterceptor interceptor = - new TraceInterceptor() { - @Override - public Collection onTraceComplete( - Collection trace) { - // Emulates situation when user code will throw an Error. - if (throwError) { - throw new AssertionError(); - } + TraceInterceptor interceptor = new TraceInterceptor() { + @Override + public Collection onTraceComplete( + Collection trace) { + // Emulates situation when user code will throw an Error. + if (throwError) { + throw new AssertionError(); + } - return trace; - } + return trace; + } - @Override - public int priority() { - return 1729; - } - }; + @Override + public int priority() { + return 1729; + } + }; otTracer.addTraceInterceptor(interceptor); } diff --git a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/app/OSGiApplication.java b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/app/OSGiApplication.java index c50f1203752..c7afb1c1e5c 100644 --- a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/app/OSGiApplication.java +++ b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/app/OSGiApplication.java @@ -57,9 +57,8 @@ public static void main(final String[] args) throws Exception { bundle.start(); } - ServiceTracker publisherTracker = - new ServiceTracker( - frameworkContext, "datadog.smoketest.osgi.messaging.PublisherSupport", null); + ServiceTracker publisherTracker = new ServiceTracker( + frameworkContext, "datadog.smoketest.osgi.messaging.PublisherSupport", null); publisherTracker.open(); Object publisher = publisherTracker.waitForService(1_000); diff --git a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/client/Activator.java b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/client/Activator.java index 43261689507..7d424d86f33 100644 --- a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/client/Activator.java +++ b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/client/Activator.java @@ -14,9 +14,8 @@ public void start(final BundleContext bundleContext) throws Exception { messageClient = new MessageClient(); messageClient.start(); - subscriberRegistration = - bundleContext.registerService( - MessageClient.class.getName(), messageClient, new Properties()); + subscriberRegistration = bundleContext.registerService( + MessageClient.class.getName(), messageClient, new Properties()); } @Override diff --git a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/publishing/Activator.java b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/publishing/Activator.java index b2b50d7e64e..aff9464f764 100644 --- a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/publishing/Activator.java +++ b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/publishing/Activator.java @@ -17,25 +17,24 @@ public class Activator implements BundleActivator { private ServiceRegistration publisherRegistration; public void start(final BundleContext bundleContext) throws Exception { - subscriberTracker = - new ServiceTracker(bundleContext, SubscriberSupport.class.getName(), null) { - @Override - public Object addingService(final ServiceReference reference) { - SubscriberSupport subscriber = (SubscriberSupport) bundleContext.getService(reference); - if (null == publisher) { - startPublisher(bundleContext, subscriber); - } else { - publisher.subscribe(subscriber); - } - return subscriber; - } + subscriberTracker = new ServiceTracker(bundleContext, SubscriberSupport.class.getName(), null) { + @Override + public Object addingService(final ServiceReference reference) { + SubscriberSupport subscriber = (SubscriberSupport) bundleContext.getService(reference); + if (null == publisher) { + startPublisher(bundleContext, subscriber); + } else { + publisher.subscribe(subscriber); + } + return subscriber; + } - @Override - public void removedService(final ServiceReference reference, final Object subscriber) { - publisher.unsubscribe((SubscriberSupport) subscriber); - bundleContext.ungetService(reference); - } - }; + @Override + public void removedService(final ServiceReference reference, final Object subscriber) { + publisher.unsubscribe((SubscriberSupport) subscriber); + bundleContext.ungetService(reference); + } + }; subscriberTracker.open(); } @@ -62,9 +61,8 @@ private void startPublisher(final BundleContext bundleContext, SubscriberSupport AsyncPublisher publisher = new AsyncPublisher(); publisher.start(); publisher.subscribe(subscriber); - publisherRegistration = - bundleContext.registerService( - PublisherSupport.class.getName(), publisher, new Properties()); + publisherRegistration = bundleContext.registerService( + PublisherSupport.class.getName(), publisher, new Properties()); this.publisher = publisher; } catch (Exception e) { throw new IllegalStateException("Publisher did not start", e); diff --git a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/subscribing/Activator.java b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/subscribing/Activator.java index f5241c67d08..b0aec9e557b 100644 --- a/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/subscribing/Activator.java +++ b/dd-smoke-tests/osgi/src/main/java/datadog/smoketest/osgi/subscribing/Activator.java @@ -14,9 +14,8 @@ public void start(final BundleContext bundleContext) throws Exception { subscriber = new AsyncSubscriber(); subscriber.start(); - subscriberRegistration = - bundleContext.registerService( - SubscriberSupport.class.getName(), subscriber, new Properties()); + subscriberRegistration = bundleContext.registerService( + SubscriberSupport.class.getName(), subscriber, new Properties()); } public void stop(final BundleContext bundleContext) throws Exception { diff --git a/dd-smoke-tests/play-2.7/app/controllers/JController.java b/dd-smoke-tests/play-2.7/app/controllers/JController.java index 7bfbae6af64..51b849da3d2 100644 --- a/dd-smoke-tests/play-2.7/app/controllers/JController.java +++ b/dd-smoke-tests/play-2.7/app/controllers/JController.java @@ -25,10 +25,9 @@ public class JController extends Controller { @Inject public JController(WSClient ws, Configuration configuration, ControllerComponents c) { this.ws = ws; - this.clientRequestBase = - configuration - .getOptional("client.request.base", ConfigLoader.stringLoader()) - .getOrElse(() -> "http://localhost:0/broken/"); + this.clientRequestBase = configuration + .getOptional("client.request.base", ConfigLoader.stringLoader()) + .getOrElse(() -> "http://localhost:0/broken/"); } @With({Action1.class, Action2.class}) diff --git a/dd-smoke-tests/play-2.8-otel/app/controllers/JController.java b/dd-smoke-tests/play-2.8-otel/app/controllers/JController.java index 53624416ab7..32f3e57577e 100644 --- a/dd-smoke-tests/play-2.8-otel/app/controllers/JController.java +++ b/dd-smoke-tests/play-2.8-otel/app/controllers/JController.java @@ -25,10 +25,9 @@ public class JController extends Controller { @Inject public JController(WSClient ws, Configuration configuration, ControllerComponents c) { this.ws = ws; - this.clientRequestBase = - configuration - .getOptional("client.request.base", ConfigLoader.stringLoader()) - .getOrElse(() -> "http://localhost:0/broken/"); + this.clientRequestBase = configuration + .getOptional("client.request.base", ConfigLoader.stringLoader()) + .getOrElse(() -> "http://localhost:0/broken/"); } @With({Action1.class, Action2.class}) diff --git a/dd-smoke-tests/play-2.8/app/controllers/JController.java b/dd-smoke-tests/play-2.8/app/controllers/JController.java index 7bfbae6af64..51b849da3d2 100644 --- a/dd-smoke-tests/play-2.8/app/controllers/JController.java +++ b/dd-smoke-tests/play-2.8/app/controllers/JController.java @@ -25,10 +25,9 @@ public class JController extends Controller { @Inject public JController(WSClient ws, Configuration configuration, ControllerComponents c) { this.ws = ws; - this.clientRequestBase = - configuration - .getOptional("client.request.base", ConfigLoader.stringLoader()) - .getOrElse(() -> "http://localhost:0/broken/"); + this.clientRequestBase = configuration + .getOptional("client.request.base", ConfigLoader.stringLoader()) + .getOrElse(() -> "http://localhost:0/broken/"); } @With({Action1.class, Action2.class}) diff --git a/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ParallelProcessing.java b/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ParallelProcessing.java index ec696b8d4d1..2e0a37cd03e 100644 --- a/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ParallelProcessing.java +++ b/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ParallelProcessing.java @@ -8,18 +8,17 @@ final class ParallelProcessing { void run(int workers, long meanServiceTimeNs, int runTimeSecs, Consumer workTask) { Thread[] threads = new Thread[workers]; for (int i = 0; i < workers; i++) { - threads[i] = - new Thread( - () -> { - long endTs = System.nanoTime() + TimeUnit.SECONDS.toNanos(runTimeSecs); + threads[i] = new Thread( + () -> { + long endTs = System.nanoTime() + TimeUnit.SECONDS.toNanos(runTimeSecs); - NormalDistribution distribution = - new NormalDistribution(meanServiceTimeNs, meanServiceTimeNs / 1000d); - while (!Thread.currentThread().isInterrupted() && System.nanoTime() < endTs) { - workTask.accept((long) distribution.sample()); - } - }, - "Worker " + i); + NormalDistribution distribution = + new NormalDistribution(meanServiceTimeNs, meanServiceTimeNs / 1000d); + while (!Thread.currentThread().isInterrupted() && System.nanoTime() < endTs) { + workTask.accept((long) distribution.sample()); + } + }, + "Worker " + i); threads[i].setDaemon(true); threads[i].start(); } diff --git a/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ProfilingTestApplication.java b/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ProfilingTestApplication.java index 5db03d485a2..f5ff067abe4 100644 --- a/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ProfilingTestApplication.java +++ b/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/ProfilingTestApplication.java @@ -95,29 +95,24 @@ private static void submitWorkToExecutor(ExecutorService executorService) AtomicInteger it = new AtomicInteger(); for (int i = 0; i < 100; i++) { executorService - .submit( - () -> { - try { - Thread.sleep(10); - it.incrementAndGet(); - } catch (InterruptedException e) { - } - }) + .submit(() -> { + try { + Thread.sleep(10); + it.incrementAndGet(); + } catch (InterruptedException e) { + } + }) .get(); } - List> runnables = - IntStream.range(0, 100) - .mapToObj( - i -> - (Callable) - () -> { - try { - Thread.sleep(10); - } catch (InterruptedException e) { - } - return it.getAndIncrement(); - }) - .collect(Collectors.toList()); + List> runnables = IntStream.range(0, 100) + .mapToObj(i -> (Callable) () -> { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + } + return it.getAndIncrement(); + }) + .collect(Collectors.toList()); for (Future f : executorService.invokeAll(runnables)) { f.get(); } @@ -129,42 +124,39 @@ private static void setupDeadlock() { final Object lockA = new Object(); final Object lockB = new Object(); - final Thread threadA = - new Thread( - () -> { - synchronized (lockA) { - phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked - synchronized (lockB) { - phaser.arriveAndDeregister(); // virtually unreachable - } - } - }, - "monitor-thread-A"); - final Thread threadB = - new Thread( - () -> { - synchronized (lockB) { - phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked - synchronized (lockA) { - phaser.arriveAndDeregister(); // virtually unreachable - } - } - }, - "monitor-thread-B"); + final Thread threadA = new Thread( + () -> { + synchronized (lockA) { + phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked + synchronized (lockB) { + phaser.arriveAndDeregister(); // virtually unreachable + } + } + }, + "monitor-thread-A"); + final Thread threadB = new Thread( + () -> { + synchronized (lockB) { + phaser.arriveAndAwaitAdvance(); // sync such as cross-order locking is provoked + synchronized (lockA) { + phaser.arriveAndDeregister(); // virtually unreachable + } + } + }, + "monitor-thread-B"); threadA.setDaemon(true); threadB.setDaemon(true); final CountDownLatch latch = new CountDownLatch(1); - Thread main = - new Thread( - () -> { - threadA.start(); - threadB.start(); - phaser.arriveAndAwaitAdvance(); // enter deadlock - phaser.arriveAndAwaitAdvance(); // unreachable if deadlock is present - latch.countDown(); - }, - "main-monitor-thread"); + Thread main = new Thread( + () -> { + threadA.start(); + threadB.start(); + phaser.arriveAndAwaitAdvance(); // enter deadlock + phaser.arriveAndAwaitAdvance(); // unreachable if deadlock is present + latch.countDown(); + }, + "main-monitor-thread"); main.setDaemon(true); main.start(); diff --git a/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/QueueProcessing.java b/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/QueueProcessing.java index 4efc4ffd29e..e99d1f10412 100644 --- a/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/QueueProcessing.java +++ b/dd-smoke-tests/profiling-integration-tests/src/main/java/datadog/smoketest/profiling/QueueProcessing.java @@ -13,30 +13,26 @@ final class QueueProcessing { QueueProcessing(int queueCapacity, int workers, long meanServiceTimeNs) { workQueue = new ArrayBlockingQueue<>(queueCapacity); - executor = - Executors.newFixedThreadPool( - workers, - r -> { - Thread t = new Thread(r, "Worker"); - t.setDaemon(true); - return t; - }); + executor = Executors.newFixedThreadPool(workers, r -> { + Thread t = new Thread(r, "Worker"); + t.setDaemon(true); + return t; + }); for (int i = 0; i < workers; i++) { - executor.submit( - () -> { - ExponentialDistribution distribution = new ExponentialDistribution(meanServiceTimeNs); - while (!Thread.currentThread().isInterrupted()) { - try { - Consumer item = workQueue.take(); - long sample = (long) distribution.sample(); - System.out.println("=== service time: " + sample + "ns"); - item.accept(sample); - System.out.println("=== submitted"); - } catch (InterruptedException ignored) { - Thread.currentThread().interrupt(); - } - } - }); + executor.submit(() -> { + ExponentialDistribution distribution = new ExponentialDistribution(meanServiceTimeNs); + while (!Thread.currentThread().isInterrupted()) { + try { + Consumer item = workQueue.take(); + long sample = (long) distribution.sample(); + System.out.println("=== service time: " + sample + "ns"); + item.accept(sample); + System.out.println("=== submitted"); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + } + }); } } diff --git a/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/CodeHotspotsTest.java b/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/CodeHotspotsTest.java index e74c92847ad..a1917270c1a 100644 --- a/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/CodeHotspotsTest.java +++ b/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/CodeHotspotsTest.java @@ -87,16 +87,15 @@ void setup(final TestInfo testInfo) throws Exception { timeout = (int) (TEST_CASE_TIMEOUT * timeoutQuotient); if (timeoutQuotient > 1) { - System.out.println( - "===> Timeout scaled by " - + timeoutQuotient - + " to " - + timeout - + "s (load = " - + load - + ", cores = " - + cores - + ")"); + System.out.println("===> Timeout scaled by " + + timeoutQuotient + + " to " + + timeout + + "s (load = " + + load + + ", cores = " + + cores + + ")"); } } @@ -113,29 +112,27 @@ void tearDown() throws Exception { @Disabled void testReactive(Duration meanServiceTime, int arrivalRate, double minCoverage) throws Exception { - System.out.println( - "=== Test reactive app (mean service time = " - + meanServiceTime - + ", arrival rate = " - + arrivalRate - + " tasks/s)"); + System.out.println("=== Test reactive app (mean service time = " + + meanServiceTime + + ", arrival rate = " + + arrivalRate + + " tasks/s)"); int interval = 10; // milliseconds int workers = 2; - Process targetProcess = - createProcessBuilder( - CodeHotspotsApplication.class.getName(), - 0, - timeout * 2, - interval, - interval, - dumpDir, - logFilePath, - "reactive", - Integer.toString(workers), - Long.toString(meanServiceTime.toNanos()), - Long.toString(arrivalRate), - Integer.toString(timeout)) - .start(); + Process targetProcess = createProcessBuilder( + CodeHotspotsApplication.class.getName(), + 0, + timeout * 2, + interval, + interval, + dumpDir, + logFilePath, + "reactive", + Integer.toString(workers), + Long.toString(meanServiceTime.toNanos()), + Long.toString(arrivalRate), + Integer.toString(timeout)) + .start(); checkProcessSuccessfullyEnd(targetProcess, logFilePath); long serviceRate = (long) (workers * 1_000_000_000d) / meanServiceTime.toNanos(); @@ -165,19 +162,18 @@ void testBatch() throws Exception { int meanServiceTimeSecs = 1; // seconds long meanServiceTimeNs = TimeUnit.SECONDS.toNanos(meanServiceTimeSecs); int interval = 10; // milliseconds - Process targetProcess = - createProcessBuilder( - CodeHotspotsApplication.class.getName(), - 0, - timeout * 2, - interval, - interval, - dumpDir, - logFilePath, - "batch", - Long.toString(meanServiceTimeNs), - Integer.toString(timeout)) - .start(); + Process targetProcess = createProcessBuilder( + CodeHotspotsApplication.class.getName(), + 0, + timeout * 2, + interval, + interval, + dumpDir, + logFilePath, + "batch", + Long.toString(meanServiceTimeNs), + Integer.toString(timeout)) + .start(); checkProcessSuccessfullyEnd(targetProcess, logFilePath); Files.walk(dumpDir) @@ -196,20 +192,19 @@ void testSaturatedFanout() throws Exception { int interval = 10; // milliseconds int workers = Runtime.getRuntime().availableProcessors() * 2; // more workers than available cores - Process targetProcess = - createProcessBuilder( - CodeHotspotsApplication.class.getName(), - 0, - timeout * 2, - interval, - interval, - dumpDir, - logFilePath, - "fanout", - Integer.toString(workers), - Long.toString(meanServiceTimeNs), - Integer.toString(timeout)) - .start(); + Process targetProcess = createProcessBuilder( + CodeHotspotsApplication.class.getName(), + 0, + timeout * 2, + interval, + interval, + dumpDir, + logFilePath, + "fanout", + Integer.toString(workers), + Long.toString(meanServiceTimeNs), + Integer.toString(timeout)) + .start(); checkProcessSuccessfullyEnd(targetProcess, logFilePath); Files.walk(dumpDir) @@ -224,17 +219,16 @@ void testSaturatedFanout() throws Exception { void testNativeLibrary(String libraryName) throws Exception { System.out.println("Test " + libraryName); int interval = 10; // milliseconds - Process targetProcess = - createProcessBuilder( - NativeLibrariesApplication.class.getName(), - 0, - timeout * 2, - interval, - interval, - dumpDir, - logFilePath, - libraryName) - .start(); + Process targetProcess = createProcessBuilder( + NativeLibrariesApplication.class.getName(), + 0, + timeout * 2, + interval, + interval, + dumpDir, + logFilePath, + libraryName) + .start(); checkProcessSuccessfullyEnd(targetProcess, logFilePath); Files.walk(dumpDir) @@ -267,19 +261,18 @@ void testGenerativeStackTracesWithCapturingLambdas(int depth) throws Exception { private void runTestGenerativeStackTraces(String mode, int depth) throws Exception { System.out.println("Test depth=" + depth + " with mode: " + mode); int interval = 10; // milliseconds - Process targetProcess = - createProcessBuilder( - GenerativeStackTraces.class.getName(), - 0, - timeout * 2, - interval, - interval, - dumpDir, - logFilePath, - String.valueOf(depth), - "1000", - mode) - .start(); + Process targetProcess = createProcessBuilder( + GenerativeStackTraces.class.getName(), + 0, + timeout * 2, + interval, + interval, + dumpDir, + logFilePath, + String.valueOf(depth), + "1000", + mode) + .start(); checkProcessSuccessfullyEnd(targetProcess, logFilePath); Files.walk(dumpDir) @@ -355,14 +348,11 @@ private static void validateStats(IItemCollection events, double idleness, doubl } } } - spanSampleCnt.values().stream() - .map(AtomicLong::get) - .forEach( - v -> { - summaryStats.addValue(v); - p99.increment(v); - p50.increment(v); - }); + spanSampleCnt.values().stream().map(AtomicLong::get).forEach(v -> { + summaryStats.addValue(v); + p99.increment(v); + p50.increment(v); + }); /* Qualified samples are scaled according to 'idleness' - diff --git a/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/JFRBasedProfilingIntegrationTest.java b/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/JFRBasedProfilingIntegrationTest.java index 452cea370d8..eebc478fa8d 100644 --- a/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/JFRBasedProfilingIntegrationTest.java +++ b/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/JFRBasedProfilingIntegrationTest.java @@ -99,11 +99,10 @@ private interface TestBody { private static final int REQUEST_WAIT_TIMEOUT = (PROFILING_START_DELAY_SECONDS + PROFILING_UPLOAD_PERIOD_SECONDS) * SAFETY_MARGIN; - private static final Path LOG_FILE_BASE = - Paths.get( - buildDirectory(), - "reports", - "testProcess." + JFRBasedProfilingIntegrationTest.class.getName()); + private static final Path LOG_FILE_BASE = Paths.get( + buildDirectory(), + "reports", + "testProcess." + JFRBasedProfilingIntegrationTest.class.getName()); public static final IAttribute LOCAL_ROOT_SPAN_ID = attr("localRootSpanId", "localRootSpanId", "localRootSpanId", NUMBER); @@ -130,13 +129,12 @@ static void setupAll() throws Exception { void setup(final TestInfo testInfo) throws Exception { tracingServer = new MockWebServer(); profilingServer = new MockWebServer(); - tracingServer.setDispatcher( - new Dispatcher() { - @Override - public MockResponse dispatch(final RecordedRequest request) throws InterruptedException { - return new MockResponse().setResponseCode(200); - } - }); + tracingServer.setDispatcher(new Dispatcher() { + @Override + public MockResponse dispatch(final RecordedRequest request) throws InterruptedException { + return new MockResponse().setResponseCode(200); + } + }); tracingServer.start(); profilingServer.start(); @@ -177,9 +175,8 @@ public void testContinuousRecording_with_params( // Do not test compressions for Oracle JDK 8 - it will always be GZIP Assumptions.assumeTrue(!JavaVirtualMachine.isOracleJDK8() || "on".equals(mode)); testWithRetry( - () -> - testContinuousRecording( - jmxDelay, ENDPOINT_COLLECTION_ENABLED, "ddprof".equals(mode), compression), + () -> testContinuousRecording( + jmxDelay, ENDPOINT_COLLECTION_ENABLED, "ddprof".equals(mode), compression), testInfo, 5); } @@ -192,14 +189,13 @@ private void testContinuousRecording( throws Exception { final ObjectMapper mapper = new ObjectMapper(); try { - targetProcess = - createDefaultProcessBuilder( - jmxFetchDelay, - endpointCollectionEnabled, - asyncProfilerEnabled, - withCompression, - logFilePath) - .start(); + targetProcess = createDefaultProcessBuilder( + jmxFetchDelay, + endpointCollectionEnabled, + asyncProfilerEnabled, + withCompression, + logFilePath) + .start(); Assumptions.assumeFalse(JavaVirtualMachine.isJ9()); @@ -208,9 +204,8 @@ private void testContinuousRecording( assertNotNull(firstRequest); assertEquals(profilingServer.getPort(), firstRequest.getRequestUrl().url().getPort()); - final List firstRequestMultiPartItems = - FileUpload.parse( - firstRequest.getBody().readByteArray(), firstRequest.getHeader("Content-Type")); + final List firstRequestMultiPartItems = FileUpload.parse( + firstRequest.getBody().readByteArray(), firstRequest.getHeader("Content-Type")); FileItem rawEvent = firstRequestMultiPartItems.get(0); assertEquals("event", rawEvent.getFieldName()); @@ -242,9 +237,8 @@ private void testContinuousRecording( duration < TimeUnit.SECONDS.toMillis(PROFILING_UPLOAD_PERIOD_SECONDS + 4), delta + "ms outside tolerance of upload period"); - final Map requestTags = - ProfilingTestUtils.parseTags( - Arrays.asList(event.get("tags_profiler").asText().split(","))); + final Map requestTags = ProfilingTestUtils.parseTags( + Arrays.asList(event.get("tags_profiler").asText().split(","))); assertEquals("smoke-test-java-app", requestTags.get("service")); assertEquals("jvm", requestTags.get("language")); assertNotNull(requestTags.get("runtime-id")); @@ -262,18 +256,14 @@ private void testContinuousRecording( final Instant firstRangeEnd = rangeStartAndEnd.getRight(); assertTrue( firstStartTime.compareTo(firstRangeStart) <= 0, - () -> - "First range start " - + firstRangeStart - + " is before first start time " - + firstStartTime); + () -> "First range start " + firstRangeStart + " is before first start time " + + firstStartTime); final RecordedRequest nextRequest = retrieveRequest(); assertNotNull(nextRequest); - final List secondRequestMultiPartItems = - FileUpload.parse( - nextRequest.getBody().readByteArray(), nextRequest.getHeader("Content-Type")); + final List secondRequestMultiPartItems = FileUpload.parse( + nextRequest.getBody().readByteArray(), nextRequest.getHeader("Content-Type")); rawEvent = secondRequestMultiPartItems.get(0); assertEquals("event", rawEvent.getFieldName()); @@ -317,18 +307,16 @@ private void testContinuousRecording( || !System.getProperty("java.version").contains("1.8")) { assertTrue( secondStartTime.compareTo(secondRangeStart) <= 0, - () -> - "Second range start " - + secondRangeStart - + " is before second start time " - + secondStartTime); + () -> "Second range start " + + secondRangeStart + + " is before second start time " + + secondStartTime); assertTrue( firstEndTime.isBefore(secondRangeStart), - () -> - "Second range start " - + secondRangeStart - + " is before or equal to first end time " - + firstEndTime); + () -> "Second range start " + + secondRangeStart + + " is before or equal to first end time " + + firstEndTime); } // Only non-Oracle JDK 8+ JVMs support custom DD events if (!System.getProperty("java.vendor").contains("Oracle") @@ -373,15 +361,14 @@ private static void verifyJdkEvents(IItemCollection events) { private static void verifyDatadogEventsNotCorrupt(IItemCollection events) { // if we emit any of these events during the test they mustn't have corrupted context - for (String eventName : - new String[] { - "datadog.ExecutionSample", - "datadog.MethodSample", - "datadog.ObjectAllocationInNewTLAB", - "datadog.ObjectAllocationOutsideTLAB", - "datadog.HeapLiveObject", - "datadog.JavaMonitorEnter" - }) { + for (String eventName : new String[] { + "datadog.ExecutionSample", + "datadog.MethodSample", + "datadog.ObjectAllocationInNewTLAB", + "datadog.ObjectAllocationOutsideTLAB", + "datadog.HeapLiveObject", + "datadog.JavaMonitorEnter" + }) { for (IItemIterable event : events.apply(ItemFilters.type(eventName))) { IMemberAccessor rootSpanIdAccessor = LOCAL_ROOT_SPAN_ID.getAccessor(event.getType()); @@ -411,27 +398,22 @@ private Instant convertFromQuantity(final IQuantity instant) { private Pair getRangeStartAndEnd(final IItemCollection events) { return events.getUnfilteredTimeRanges().stream() - .map( - range -> { - final Instant convertedStart = convertFromQuantity(range.getStart()); - final Instant convertedEnd = convertFromQuantity(range.getEnd()); - return Pair.of(convertedStart, convertedEnd); - }) - .reduce( - Pair.of(null, null), - (send, newSend) -> { - Instant start = send.getLeft(); - Instant end = send.getRight(); - final Instant newStart = newSend.getLeft(); - final Instant newEnd = newSend.getRight(); - start = - null == start - ? newStart - : null == newStart ? start : newStart.isBefore(start) ? newStart : start; - end = - null == end ? newEnd : null == newEnd ? end : newEnd.isAfter(end) ? newEnd : end; - return Pair.of(start, end); - }); + .map(range -> { + final Instant convertedStart = convertFromQuantity(range.getStart()); + final Instant convertedEnd = convertFromQuantity(range.getEnd()); + return Pair.of(convertedStart, convertedEnd); + }) + .reduce(Pair.of(null, null), (send, newSend) -> { + Instant start = send.getLeft(); + Instant end = send.getRight(); + final Instant newStart = newSend.getLeft(); + final Instant newEnd = newSend.getRight(); + start = null == start + ? newStart + : null == newStart ? start : newStart.isBefore(start) ? newStart : start; + end = null == end ? newEnd : null == newEnd ? end : newEnd.isAfter(end) ? newEnd : end; + return Pair.of(start, end); + }); } @Test @@ -443,18 +425,17 @@ void testBogusApiKey(final TestInfo testInfo) throws Exception { PROFILING_START_DELAY_SECONDS + PROFILING_UPLOAD_PERIOD_SECONDS * 2 + 1; try { - targetProcess = - createProcessBuilder( - BOGUS_API_KEY, - 0, - PROFILING_START_DELAY_SECONDS, - PROFILING_UPLOAD_PERIOD_SECONDS, - ENDPOINT_COLLECTION_ENABLED, - true, - "off", - exitDelay, - logFilePath) - .start(); + targetProcess = createProcessBuilder( + BOGUS_API_KEY, + 0, + PROFILING_START_DELAY_SECONDS, + PROFILING_UPLOAD_PERIOD_SECONDS, + ENDPOINT_COLLECTION_ENABLED, + true, + "off", + exitDelay, + logFilePath) + .start(); /* API key of an incorrect format will cause profiling to get disabled. This means no upload requests will be made. We are going to check the log file for @@ -476,10 +457,9 @@ void testBogusApiKey(final TestInfo testInfo) throws Exception { following message would be logged. The test asserts for the presence of the message. */ - assertTrue( - checkLogLines( - logFilePath, - it -> it.contains("Profiling: API key doesn't match expected format"))); + assertTrue(checkLogLines( + logFilePath, + it -> it.contains("Profiling: API key doesn't match expected format"))); assertFalse(logHasErrors(logFilePath)); } finally { if (targetProcess != null) { @@ -505,30 +485,28 @@ public void testWallclockProfilingWithoutTracing(final TestInfo testInfo) throws testWithRetry( () -> { try { - targetProcess = - createProcessBuilder( - profilingServer.getPort(), - tracingServer.getPort(), - VALID_API_KEY, - 0, - PROFILING_START_DELAY_SECONDS, - PROFILING_UPLOAD_PERIOD_SECONDS, - false, - true, - "on", - 0, - logFilePath, - false) - .start(); + targetProcess = createProcessBuilder( + profilingServer.getPort(), + tracingServer.getPort(), + VALID_API_KEY, + 0, + PROFILING_START_DELAY_SECONDS, + PROFILING_UPLOAD_PERIOD_SECONDS, + false, + true, + "on", + 0, + logFilePath, + false) + .start(); Assumptions.assumeFalse(JavaVirtualMachine.isJ9()); final RecordedRequest request = retrieveRequest(); assertNotNull(request); - final List items = - FileUpload.parse( - request.getBody().readByteArray(), request.getHeader("Content-Type")); + final List items = FileUpload.parse( + request.getBody().readByteArray(), request.getHeader("Content-Type")); FileItem rawJfr = items.get(1); assertEquals("main.jfr", rawJfr.getName()); @@ -581,18 +559,17 @@ void testShutdown(final TestInfo testInfo) throws Exception { final int duration = PROFILING_START_DELAY_SECONDS + PROFILING_UPLOAD_PERIOD_SECONDS * 4 + 1; try { - targetProcess = - createProcessBuilder( - VALID_API_KEY, - 0, - PROFILING_START_DELAY_SECONDS, - PROFILING_UPLOAD_PERIOD_SECONDS, - ENDPOINT_COLLECTION_ENABLED, - true, - "off", - duration, - logFilePath) - .start(); + targetProcess = createProcessBuilder( + VALID_API_KEY, + 0, + PROFILING_START_DELAY_SECONDS, + PROFILING_UPLOAD_PERIOD_SECONDS, + ENDPOINT_COLLECTION_ENABLED, + true, + "off", + duration, + logFilePath) + .start(); final RecordedRequest request = retrieveRequest(); assertNotNull(request); @@ -601,9 +578,8 @@ void testShutdown(final TestInfo testInfo) throws Exception { // Wait for the app exit with some extra time to accommodate profile upload on shutdown. // The expectation is that agent doesn't prevent app from exiting. - assertTrue( - targetProcess.waitFor( - duration + PROFILING_UPLOAD_TIMEOUT_SECONDS + 1, TimeUnit.SECONDS)); + assertTrue(targetProcess.waitFor( + duration + PROFILING_UPLOAD_TIMEOUT_SECONDS + 1, TimeUnit.SECONDS)); } finally { if (targetProcess != null) { targetProcess.destroyForcibly(); @@ -739,11 +715,9 @@ private void assertRecordingEvents( assertTrue(availableProcessorsEvents.hasItems()); final IAttribute cpuCountAttr = attr("availableProcessorCores", "availableProcessorCores", NUMBER); - final long val = - ((IQuantity) - availableProcessorsEvents.getAggregate( - Aggregators.min("datadog.AvailableProcessorCores", cpuCountAttr))) - .longValue(); + final long val = ((IQuantity) availableProcessorsEvents.getAggregate( + Aggregators.min("datadog.AvailableProcessorCores", cpuCountAttr))) + .longValue(); assertEquals(Runtime.getRuntime().availableProcessors(), val); assertTrue(events.apply(ItemFilters.type("datadog.ProfilerSetting")).hasItems()); @@ -753,25 +727,20 @@ private void assertRecordingEvents( private static void verifyStackDepthSetting( IItemCollection events, boolean asyncProfilerEnabled) { - assertTrue( - events - .apply( - ItemFilters.and( - ItemFilters.type("datadog.ProfilerSetting"), - ItemFilters.equals( - JdkAttributes.REC_SETTING_NAME, - (asyncProfilerEnabled ? "ddprof" : "JFR") + " Stack Depth"), - ItemFilters.equals( - JdkAttributes.REC_SETTING_VALUE, String.valueOf(STACK_DEPTH_LIMIT)))) - .hasItems()); + assertTrue(events + .apply(ItemFilters.and( + ItemFilters.type("datadog.ProfilerSetting"), + ItemFilters.equals( + JdkAttributes.REC_SETTING_NAME, + (asyncProfilerEnabled ? "ddprof" : "JFR") + " Stack Depth"), + ItemFilters.equals(JdkAttributes.REC_SETTING_VALUE, String.valueOf(STACK_DEPTH_LIMIT)))) + .hasItems()); } private static boolean hasAuxiliaryDdprof(IItemCollection events) { - events = - events.apply( - ItemFilters.and( - ItemFilters.type("datadog.ProfilerSetting"), - ItemFilters.equals(JdkAttributes.REC_SETTING_NAME, "Auxiliary Profiler"))); + events = events.apply(ItemFilters.and( + ItemFilters.type("datadog.ProfilerSetting"), + ItemFilters.equals(JdkAttributes.REC_SETTING_NAME, "Auxiliary Profiler"))); if (!events.hasItems()) { return false; } @@ -878,11 +847,10 @@ private static ProcessBuilder createProcessBuilder( final Path logFilePath, final boolean tracingEnabled, final String... extraProperties) { - final String templateOverride = - JFRBasedProfilingIntegrationTest.class - .getClassLoader() - .getResource("overrides.jfp") - .getFile(); + final String templateOverride = JFRBasedProfilingIntegrationTest.class + .getClassLoader() + .getResource("overrides.jfp") + .getFile(); final List command = new java.util.ArrayList<>(); command.add(javaPath()); @@ -942,7 +910,8 @@ private static ProcessBuilder createProcessBuilder( } private static String javaPath() { - return Paths.get(SystemProperties.getOrDefault("java.home", ""), "bin", "java").toString(); + return Paths.get(SystemProperties.getOrDefault("java.home", ""), "bin", "java") + .toString(); } private static String buildDirectory() { @@ -964,14 +933,12 @@ private static boolean checkLogLines(final Path logFilePath, final Predicate { - if (it.contains("ERROR") || it.contains("ASSERTION FAILED")) { - System.out.println(it); - logHasErrors[0] = true; - } - }); + Files.lines(logFilePath).forEach(it -> { + if (it.contains("ERROR") || it.contains("ASSERTION FAILED")) { + System.out.println(it); + logHasErrors[0] = true; + } + }); if (logHasErrors[0]) { System.out.println( "Test application log is containing errors. See full run logs in " + logFilePath); @@ -993,35 +960,32 @@ void testJfrScrubbing(final TestInfo testInfo) throws Exception { testWithRetry( () -> { try { - targetProcess = - createProcessBuilder( - profilingServer.getPort(), - tracingServer.getPort(), - VALID_API_KEY, - 0, - PROFILING_START_DELAY_SECONDS, - PROFILING_UPLOAD_PERIOD_SECONDS, - ENDPOINT_COLLECTION_ENABLED, - true, - "on", - 0, - logFilePath, - true, - "-Ddd.profiling.scrub.enabled=true") - .start(); + targetProcess = createProcessBuilder( + profilingServer.getPort(), + tracingServer.getPort(), + VALID_API_KEY, + 0, + PROFILING_START_DELAY_SECONDS, + PROFILING_UPLOAD_PERIOD_SECONDS, + ENDPOINT_COLLECTION_ENABLED, + true, + "on", + 0, + logFilePath, + true, + "-Ddd.profiling.scrub.enabled=true") + .start(); final RecordedRequest request = retrieveRequest(); assertNotNull(request); - final List items = - FileUpload.parse( - request.getBody().readByteArray(), request.getHeader("Content-Type")); + final List items = FileUpload.parse( + request.getBody().readByteArray(), request.getHeader("Content-Type")); - FileItem rawJfr = - items.stream() - .filter(i -> "main.jfr".equals(i.getName())) - .findFirst() - .orElseThrow(() -> new AssertionError("main.jfr not found in upload")); + FileItem rawJfr = items.stream() + .filter(i -> "main.jfr".equals(i.getName())) + .findFirst() + .orElseThrow(() -> new AssertionError("main.jfr not found in upload")); assertFalse(logHasErrors(logFilePath)); InputStream eventStream = new ByteArrayInputStream(rawJfr.get()); diff --git a/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/SmokeTestUtils.java b/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/SmokeTestUtils.java index d1a13d80fb5..0a48476b2e2 100644 --- a/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/SmokeTestUtils.java +++ b/dd-smoke-tests/profiling-integration-tests/src/test/java/datadog/smoketest/SmokeTestUtils.java @@ -24,55 +24,43 @@ static ProcessBuilder createProcessBuilder( final String templateOverride = SmokeTestUtils.class.getClassLoader().getResource("overrides.jfp").getFile(); - final List command = - new ArrayList<>( - Arrays.asList( - javaPath(), - "-Xmx" + System.getProperty("datadog.forkedMaxHeapSize", "1024M"), - "-Xms" + System.getProperty("datadog.forkedMinHeapSize", "64M"), - "-javaagent:" + agentShadowJar(), - "-XX:ErrorFile=/tmp/hs_err_pid%p.log", - "-Ddd.service.name=smoke-test-code_hotspots-java-app", - "-Ddd.env=smoketest", - "-Ddd.version=99", - "-Ddd.profiling.enabled=true", - "-Ddd.profiling.ddprof.enabled=true", - "-Ddd." + ProfilingConfig.PROFILING_AUXILIARY_TYPE + "=async", - "-Ddd." - + ProfilingConfig.PROFILING_DATADOG_PROFILER_CPU_INTERVAL - + "=" - + cpuSamplerIntervalMs - + "ms", - "-Ddd." + ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_ENABLED + "=true", - "-Ddd." - + ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_INTERVAL - + "=" - + wallSamplerIntervalMs - + "ms", - "-Ddd.profiling.agentless=false", - "-Ddd.profiling.start-delay=" + profilingStartDelaySecs, - "-Ddd." + ProfilingConfig.PROFILING_START_FORCE_FIRST + "=true", - "-Ddd.profiling.ddprof.alloc.enabled=true", - "-Ddd.profiling.upload.period=" + profilingUploadPeriodSecs, - "-Ddd.profiling.hotspots.enabled=true", - "-Ddd.profiling.legacy.tracing.integration=false", - "-Ddd.profiling.endpoint.collection.enabled=true", - "-Ddd.profiling.debug.dump_path=" + dumpPath, - "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=debug", - "-Dorg.slf4j.simpleLogger.defaultLogLevel=debug", - "-XX:+IgnoreUnrecognizedVMOptions", - "-XX:+UnlockCommercialFeatures", - "-XX:+FlightRecorder", - "-Ddd." - + ProfilingConfig.PROFILING_TEMPLATE_OVERRIDE_FILE - + "=" - + templateOverride)); + final List command = new ArrayList<>(Arrays.asList( + javaPath(), + "-Xmx" + System.getProperty("datadog.forkedMaxHeapSize", "1024M"), + "-Xms" + System.getProperty("datadog.forkedMinHeapSize", "64M"), + "-javaagent:" + agentShadowJar(), + "-XX:ErrorFile=/tmp/hs_err_pid%p.log", + "-Ddd.service.name=smoke-test-code_hotspots-java-app", + "-Ddd.env=smoketest", + "-Ddd.version=99", + "-Ddd.profiling.enabled=true", + "-Ddd.profiling.ddprof.enabled=true", + "-Ddd." + ProfilingConfig.PROFILING_AUXILIARY_TYPE + "=async", + "-Ddd." + ProfilingConfig.PROFILING_DATADOG_PROFILER_CPU_INTERVAL + "=" + + cpuSamplerIntervalMs + "ms", + "-Ddd." + ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_ENABLED + "=true", + "-Ddd." + ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_INTERVAL + "=" + + wallSamplerIntervalMs + "ms", + "-Ddd.profiling.agentless=false", + "-Ddd.profiling.start-delay=" + profilingStartDelaySecs, + "-Ddd." + ProfilingConfig.PROFILING_START_FORCE_FIRST + "=true", + "-Ddd.profiling.ddprof.alloc.enabled=true", + "-Ddd.profiling.upload.period=" + profilingUploadPeriodSecs, + "-Ddd.profiling.hotspots.enabled=true", + "-Ddd.profiling.legacy.tracing.integration=false", + "-Ddd.profiling.endpoint.collection.enabled=true", + "-Ddd.profiling.debug.dump_path=" + dumpPath, + "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=debug", + "-Dorg.slf4j.simpleLogger.defaultLogLevel=debug", + "-XX:+IgnoreUnrecognizedVMOptions", + "-XX:+UnlockCommercialFeatures", + "-XX:+FlightRecorder", + "-Ddd." + ProfilingConfig.PROFILING_TEMPLATE_OVERRIDE_FILE + "=" + templateOverride)); if (System.getenv("TEST_LIBASYNC") != null) { - command.add( - "-Ddd." - + ProfilingConfig.PROFILING_DATADOG_PROFILER_LIBPATH - + "=" - + System.getenv("TEST_LIBASYNC")); + command.add("-Ddd." + + ProfilingConfig.PROFILING_DATADOG_PROFILER_LIBPATH + + "=" + + System.getenv("TEST_LIBASYNC")); } command.addAll(Arrays.asList("-cp", profilingShadowJar(), targetClass)); command.addAll(Arrays.asList(args)); @@ -108,10 +96,9 @@ static void checkProcessSuccessfullyEnd(final Process process, final Path log) int exitCode = process.waitFor(); if (exitCode != 0) { try { - System.out.println( - "=== Profiling application log start ===" - + String.join("\n", Files.readAllLines(log)) - + "=== Profiling application log end ==="); + System.out.println("=== Profiling application log start ===" + + String.join("\n", Files.readAllLines(log)) + + "=== Profiling application log end ==="); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/dd-smoke-tests/ratpack-1.5/src/main/java/datadog/smoketest/ratpack/RatpackApp.java b/dd-smoke-tests/ratpack-1.5/src/main/java/datadog/smoketest/ratpack/RatpackApp.java index c9ca8527a75..7fd3cddd7bd 100644 --- a/dd-smoke-tests/ratpack-1.5/src/main/java/datadog/smoketest/ratpack/RatpackApp.java +++ b/dd-smoke-tests/ratpack-1.5/src/main/java/datadog/smoketest/ratpack/RatpackApp.java @@ -9,33 +9,22 @@ public class RatpackApp { public static void main(String[] args) throws Exception { int port = Integer.parseInt(System.getProperty("ratpack.http.port", "8080")); - RatpackServer.start( - server -> - server - .serverConfig(config -> config.port(port)) - .handlers( - chain -> - chain - .path( - "api_security/sampling/:status_code", - ctx -> { - ctx.getResponse() - .status( - Integer.parseInt(ctx.getPathTokens().get("status_code"))) - .send("EXECUTED"); - }) - .path( - "api_security/response", - ctx -> - ctx.parse(JsonNode.class) - .then( - node -> { - ctx.getResponse().status(200); - ctx.render(json(node)); - })) - .all( - ctx -> { - ctx.getResponse().status(404).send("Not Found"); - }))); + RatpackServer.start(server -> server + .serverConfig(config -> config.port(port)) + .handlers(chain -> chain + .path("api_security/sampling/:status_code", ctx -> { + ctx.getResponse() + .status(Integer.parseInt(ctx.getPathTokens().get("status_code"))) + .send("EXECUTED"); + }) + .path( + "api_security/response", + ctx -> ctx.parse(JsonNode.class).then(node -> { + ctx.getResponse().status(200); + ctx.render(json(node)); + })) + .all(ctx -> { + ctx.getResponse().status(404).send("Not Found"); + }))); } } diff --git a/dd-smoke-tests/resteasy/src/main/java/smoketest/resteasy/Resource.java b/dd-smoke-tests/resteasy/src/main/java/smoketest/resteasy/Resource.java index bc8ff6fcfc0..d1031b56adc 100644 --- a/dd-smoke-tests/resteasy/src/main/java/smoketest/resteasy/Resource.java +++ b/dd-smoke-tests/resteasy/src/main/java/smoketest/resteasy/Resource.java @@ -82,13 +82,17 @@ public String sortedSetByQueryParam(@QueryParam("param") SortedSet param @Path("/setlocationheader") @GET public Response locationHeader(@QueryParam("param") String param) { - return Response.status(Response.Status.TEMPORARY_REDIRECT).header("Location", param).build(); + return Response.status(Response.Status.TEMPORARY_REDIRECT) + .header("Location", param) + .build(); } @Path("/setresponselocation") @GET public Response responseLocation(@QueryParam("param") String param) throws URISyntaxException { - return Response.status(Response.Status.TEMPORARY_REDIRECT).location(new URI(param)).build(); + return Response.status(Response.Status.TEMPORARY_REDIRECT) + .location(new URI(param)) + .build(); } @Path("/insecurecookie") @@ -108,6 +112,9 @@ public Response apiSecurityResponse(RequestBody input) { @GET @Path("/api_security/sampling/{i}") public Response apiSecuritySamplingWithStatus(@PathParam("i") int i) { - return Response.status(i).header("content-type", "text/plain").entity("Hello!\n").build(); + return Response.status(i) + .header("content-type", "text/plain") + .entity("Hello!\n") + .build(); } } diff --git a/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlAsyncServlet.java b/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlAsyncServlet.java index dc568cfc5b9..7aad12c12f1 100644 --- a/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlAsyncServlet.java +++ b/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlAsyncServlet.java @@ -22,19 +22,18 @@ public void run() { asyncContext .getResponse() .getWriter() - .write( - "" - + "" - + "" - + " " - + " " - + " Hello Servlet" - + "" - + "" - + "

Hello from Tomcat 9 Servlet!

" - + "

This is a demo HTML page served by Java servlet.

" - + "" - + ""); + .write("" + + "" + + "" + + " " + + " " + + " Hello Servlet" + + "" + + "" + + "

Hello from Tomcat 9 Servlet!

" + + "

This is a demo HTML page served by Java servlet.

" + + "" + + ""); asyncContext.complete(); } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlServlet.java b/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlServlet.java index 0940634b377..6b73955148d 100644 --- a/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlServlet.java +++ b/dd-smoke-tests/rum/tomcat-10/src/main/java/com/example/HtmlServlet.java @@ -11,18 +11,17 @@ public class HtmlServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { final PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=UTF-8"); - writer.write( - "" - + "" - + "" - + " " - + " " - + " Hello Servlet" - + "" - + "" - + "

Hello from Tomcat 9 Servlet!

" - + "

This is a demo HTML page served by Java servlet.

" - + "" - + ""); + writer.write("" + + "" + + "" + + " " + + " " + + " Hello Servlet" + + "" + + "" + + "

Hello from Tomcat 9 Servlet!

" + + "

This is a demo HTML page served by Java servlet.

" + + "" + + ""); } } diff --git a/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlAsyncServlet.java b/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlAsyncServlet.java index dc568cfc5b9..7aad12c12f1 100644 --- a/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlAsyncServlet.java +++ b/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlAsyncServlet.java @@ -22,19 +22,18 @@ public void run() { asyncContext .getResponse() .getWriter() - .write( - "" - + "" - + "" - + " " - + " " - + " Hello Servlet" - + "" - + "" - + "

Hello from Tomcat 9 Servlet!

" - + "

This is a demo HTML page served by Java servlet.

" - + "" - + ""); + .write("" + + "" + + "" + + " " + + " " + + " Hello Servlet" + + "" + + "" + + "

Hello from Tomcat 9 Servlet!

" + + "

This is a demo HTML page served by Java servlet.

" + + "" + + ""); asyncContext.complete(); } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlServlet.java b/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlServlet.java index 0940634b377..6b73955148d 100644 --- a/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlServlet.java +++ b/dd-smoke-tests/rum/tomcat-11/src/main/java/com/example/HtmlServlet.java @@ -11,18 +11,17 @@ public class HtmlServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { final PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=UTF-8"); - writer.write( - "" - + "" - + "" - + " " - + " " - + " Hello Servlet" - + "" - + "" - + "

Hello from Tomcat 9 Servlet!

" - + "

This is a demo HTML page served by Java servlet.

" - + "" - + ""); + writer.write("" + + "" + + "" + + " " + + " " + + " Hello Servlet" + + "" + + "" + + "

Hello from Tomcat 9 Servlet!

" + + "

This is a demo HTML page served by Java servlet.

" + + "" + + ""); } } diff --git a/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlAsyncServlet.java b/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlAsyncServlet.java index 81406c68ba4..17a3d2982a5 100644 --- a/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlAsyncServlet.java +++ b/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlAsyncServlet.java @@ -22,19 +22,18 @@ public void run() { asyncContext .getResponse() .getWriter() - .write( - "" - + "" - + "" - + " " - + " " - + " Hello Servlet" - + "" - + "" - + "

Hello from Tomcat 9 Servlet!

" - + "

This is a demo HTML page served by Java servlet.

" - + "" - + ""); + .write("" + + "" + + "" + + " " + + " " + + " Hello Servlet" + + "" + + "" + + "

Hello from Tomcat 9 Servlet!

" + + "

This is a demo HTML page served by Java servlet.

" + + "" + + ""); asyncContext.complete(); } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlServlet.java b/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlServlet.java index 90f13e7317f..8e7644164bc 100644 --- a/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlServlet.java +++ b/dd-smoke-tests/rum/tomcat-9/src/main/java/com/example/HtmlServlet.java @@ -9,18 +9,17 @@ public class HtmlServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.getWriter() - .write( - "" - + "" - + "" - + " " - + " " - + " Hello Servlet" - + "" - + "" - + "

Hello from Tomcat 9 Servlet!

" - + "

This is a demo HTML page served by Java servlet.

" - + "" - + ""); + .write("" + + "" + + "" + + " " + + " " + + " Hello Servlet" + + "" + + "" + + "

Hello from Tomcat 9 Servlet!

" + + "

This is a demo HTML page served by Java servlet.

" + + "" + + ""); } } diff --git a/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java b/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java index 11db36448ec..49f7b8e2062 100644 --- a/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java +++ b/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java @@ -17,17 +17,13 @@ public class FruitRouter { RouterFunction routes(final FruitRepository repository) { return route( RequestPredicates.GET("/fruits"), - request -> - ServerResponse.ok() - .body(Mono.fromSupplier(() -> repository.findAll()), Fruit.class)) - .and( - route( - RequestPredicates.GET("/fruits/{name}"), - request -> - ServerResponse.ok() - .body( - Mono.fromSupplier( - () -> repository.findByName(request.pathVariable("name"))), - Fruit.class))); + request -> ServerResponse.ok() + .body(Mono.fromSupplier(() -> repository.findAll()), Fruit.class)) + .and(route( + RequestPredicates.GET("/fruits/{name}"), + request -> ServerResponse.ok() + .body( + Mono.fromSupplier(() -> repository.findByName(request.pathVariable("name"))), + Fruit.class))); } } diff --git a/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/model/Fruit.java b/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/model/Fruit.java index dd812103286..61d886b9c74 100644 --- a/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/model/Fruit.java +++ b/dd-smoke-tests/spring-boot-2.6-webflux/src/main/java/datadog/smoketest/springboot/model/Fruit.java @@ -18,7 +18,9 @@ public Fruit(@Nonnull String name) { this.name = name; } - @Id @GeneratedValue private Long id; + @Id + @GeneratedValue + private Long id; @Column(nullable = false) private String name; diff --git a/dd-smoke-tests/spring-boot-2.6-webmvc/src/main/java/datadog/smoketest/springboot/model/Fruit.java b/dd-smoke-tests/spring-boot-2.6-webmvc/src/main/java/datadog/smoketest/springboot/model/Fruit.java index dd812103286..61d886b9c74 100644 --- a/dd-smoke-tests/spring-boot-2.6-webmvc/src/main/java/datadog/smoketest/springboot/model/Fruit.java +++ b/dd-smoke-tests/spring-boot-2.6-webmvc/src/main/java/datadog/smoketest/springboot/model/Fruit.java @@ -18,7 +18,9 @@ public Fruit(@Nonnull String name) { this.name = name; } - @Id @GeneratedValue private Long id; + @Id + @GeneratedValue + private Long id; @Column(nullable = false) private String name; diff --git a/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java b/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java index 11db36448ec..49f7b8e2062 100644 --- a/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java +++ b/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java @@ -17,17 +17,13 @@ public class FruitRouter { RouterFunction routes(final FruitRepository repository) { return route( RequestPredicates.GET("/fruits"), - request -> - ServerResponse.ok() - .body(Mono.fromSupplier(() -> repository.findAll()), Fruit.class)) - .and( - route( - RequestPredicates.GET("/fruits/{name}"), - request -> - ServerResponse.ok() - .body( - Mono.fromSupplier( - () -> repository.findByName(request.pathVariable("name"))), - Fruit.class))); + request -> ServerResponse.ok() + .body(Mono.fromSupplier(() -> repository.findAll()), Fruit.class)) + .and(route( + RequestPredicates.GET("/fruits/{name}"), + request -> ServerResponse.ok() + .body( + Mono.fromSupplier(() -> repository.findByName(request.pathVariable("name"))), + Fruit.class))); } } diff --git a/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java b/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java index dd812103286..61d886b9c74 100644 --- a/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java +++ b/dd-smoke-tests/spring-boot-2.7-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java @@ -18,7 +18,9 @@ public Fruit(@Nonnull String name) { this.name = name; } - @Id @GeneratedValue private Long id; + @Id + @GeneratedValue + private Long id; @Column(nullable = false) private String name; diff --git a/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java b/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java index 11db36448ec..49f7b8e2062 100644 --- a/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java +++ b/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/controller/FruitRouter.java @@ -17,17 +17,13 @@ public class FruitRouter { RouterFunction routes(final FruitRepository repository) { return route( RequestPredicates.GET("/fruits"), - request -> - ServerResponse.ok() - .body(Mono.fromSupplier(() -> repository.findAll()), Fruit.class)) - .and( - route( - RequestPredicates.GET("/fruits/{name}"), - request -> - ServerResponse.ok() - .body( - Mono.fromSupplier( - () -> repository.findByName(request.pathVariable("name"))), - Fruit.class))); + request -> ServerResponse.ok() + .body(Mono.fromSupplier(() -> repository.findAll()), Fruit.class)) + .and(route( + RequestPredicates.GET("/fruits/{name}"), + request -> ServerResponse.ok() + .body( + Mono.fromSupplier(() -> repository.findByName(request.pathVariable("name"))), + Fruit.class))); } } diff --git a/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java b/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java index 32cae6ce653..8a706245612 100644 --- a/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java +++ b/dd-smoke-tests/spring-boot-3.0-webflux/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java @@ -18,7 +18,9 @@ public Fruit(@Nonnull String name) { this.name = name; } - @Id @GeneratedValue private Long id; + @Id + @GeneratedValue + private Long id; @Column(nullable = false) private String name; diff --git a/dd-smoke-tests/spring-boot-3.0-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java b/dd-smoke-tests/spring-boot-3.0-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java index 32cae6ce653..8a706245612 100644 --- a/dd-smoke-tests/spring-boot-3.0-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java +++ b/dd-smoke-tests/spring-boot-3.0-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java @@ -18,7 +18,9 @@ public Fruit(@Nonnull String name) { this.name = name; } - @Id @GeneratedValue private Long id; + @Id + @GeneratedValue + private Long id; @Column(nullable = false) private String name; diff --git a/dd-smoke-tests/spring-boot-3.3-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java b/dd-smoke-tests/spring-boot-3.3-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java index 32cae6ce653..8a706245612 100644 --- a/dd-smoke-tests/spring-boot-3.3-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java +++ b/dd-smoke-tests/spring-boot-3.3-webmvc/application/src/main/java/datadog/smoketest/springboot/model/Fruit.java @@ -18,7 +18,9 @@ public Fruit(@Nonnull String name) { this.name = name; } - @Id @GeneratedValue private Long id; + @Id + @GeneratedValue + private Long id; @Column(nullable = false) private String name; diff --git a/dd-smoke-tests/spring-boot-rabbit/src/test/java/datadog/smoketest/SpringBootRabbitSmokeTest.java b/dd-smoke-tests/spring-boot-rabbit/src/test/java/datadog/smoketest/SpringBootRabbitSmokeTest.java index ed8d42c7c2b..f02c28cd307 100644 --- a/dd-smoke-tests/spring-boot-rabbit/src/test/java/datadog/smoketest/SpringBootRabbitSmokeTest.java +++ b/dd-smoke-tests/spring-boot-rabbit/src/test/java/datadog/smoketest/SpringBootRabbitSmokeTest.java @@ -89,7 +89,8 @@ class SpringBootRabbitSmokeTest { @Order(1) @RegisterExtension - static final TestAgentBackend agent = AgentBackend.testAgentBuilder().retainAcrossTests().build(); + static final TestAgentBackend agent = + AgentBackend.testAgentBuilder().retainAcrossTests().build(); @Order(2) @RegisterExtension @@ -98,10 +99,9 @@ class SpringBootRabbitSmokeTest { @Order(3) @RegisterExtension - static final SmokeServerApp receiver = - rabbitApp(1) - .args("--rabbit.receiver.queue=otherqueue", "--rabbit.receiver.forward=true") - .build(); + static final SmokeServerApp receiver = rabbitApp(1) + .args("--rabbit.receiver.queue=otherqueue", "--rabbit.receiver.forward=true") + .build(); @Test void roundTripsProduceFullAmqpTraceStructure() throws IOException { @@ -109,8 +109,10 @@ void roundTripsProduceFullAmqpTraceStructure() throws IOException { // sender -> otherqueue -> receiver -> queue -> sender. String[] messages = {"foo", "bar", "baz"}; for (String message : messages) { - Request request = - new Request.Builder().url(sender.url() + "/roundtrip/" + message).get().build(); + Request request = new Request.Builder() + .url(sender.url() + "/roundtrip/" + message) + .get() + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertEquals(200, response.code(), "round-trip " + message); ResponseBody body = response.body(); @@ -151,7 +153,8 @@ private static TraceMatcher roundTrip() { sp("spring-rabbit-1", "amqp.command", "basic.deliver otherqueue").childOfPrevious(), sp("spring-rabbit-1", "amqp.consume", "amqp.consume otherqueue").childOfPrevious(), sp("spring-rabbit-1", "spring.consume", "Receiver.receiveMessage").childOfPrevious(), - sp("spring-rabbit-1", "amqp.command", "basic.publish -> queue").childOfPrevious(), + sp("spring-rabbit-1", "amqp.command", "basic.publish -> queue") + .childOfPrevious(), sp("rabbitmq", "amqp.deliver", "amqp.deliver queue").childOfPrevious(), sp("spring-rabbit-0", "amqp.command", "basic.deliver queue").childOfPrevious(), sp("spring-rabbit-0", "amqp.consume", "amqp.consume queue").childOfPrevious(), diff --git a/dd-smoke-tests/spring-security/src/main/java/com/example/jwt/SecurityConfig.java b/dd-smoke-tests/spring-security/src/main/java/com/example/jwt/SecurityConfig.java index 240daddf529..d6fb14b3d42 100644 --- a/dd-smoke-tests/spring-security/src/main/java/com/example/jwt/SecurityConfig.java +++ b/dd-smoke-tests/spring-security/src/main/java/com/example/jwt/SecurityConfig.java @@ -32,13 +32,11 @@ public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { return httpSecurity - .authorizeHttpRequests( - authorize -> - authorize - .mvcMatchers("/read/**") - .hasAuthority("SCOPE_read") - .anyRequest() - .authenticated()) + .authorizeHttpRequests(authorize -> authorize + .mvcMatchers("/read/**") + .hasAuthority("SCOPE_read") + .anyRequest() + .authenticated()) .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt) .build(); } diff --git a/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/controller/WebController.java b/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/controller/WebController.java index 242f61d2892..39214b9fb34 100644 --- a/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/controller/WebController.java +++ b/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/controller/WebController.java @@ -42,9 +42,8 @@ public String asyncCompleteableFutureGreeting( final String decodedMsg = decodeBase64(message); CompletableFuture[] cfs = new CompletableFuture[20]; for (int i = 0; i < cfs.length; ++i) { - cfs[i] = - CompletableFuture.supplyAsync(() -> "something", pool) - .thenApplyAsync(x -> asyncGreeter.greet(decodedMsg), pool); + cfs[i] = CompletableFuture.supplyAsync(() -> "something", pool) + .thenApplyAsync(x -> asyncGreeter.greet(decodedMsg), pool); } return CompletableFuture.allOf(cfs).thenApply(x -> "bye").join(); } diff --git a/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/grpc/AsynchronousGreeter.java b/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/grpc/AsynchronousGreeter.java index bc6471f1005..c2ddfdb662f 100644 --- a/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/grpc/AsynchronousGreeter.java +++ b/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/grpc/AsynchronousGreeter.java @@ -13,30 +13,30 @@ public class AsynchronousGreeter implements AutoCloseable { private final GreeterGrpc.GreeterStub impl; public AsynchronousGreeter(int port) { - this.channel = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext().build(); + this.channel = + ManagedChannelBuilder.forAddress("localhost", port).usePlaintext().build(); this.impl = GreeterGrpc.newStub(channel); } public String greet(String message) { final AtomicReference response = new AtomicReference<>(); final CountDownLatch latch = new CountDownLatch(1); - StreamObserver observer = - new StreamObserver() { - @Override - public void onNext(Response value) { - response.set(value.getMessage()); - } - - @Override - public void onError(Throwable t) { - throw new AssertionError(t); - } - - @Override - public void onCompleted() { - latch.countDown(); - } - }; + StreamObserver observer = new StreamObserver() { + @Override + public void onNext(Response value) { + response.set(value.getMessage()); + } + + @Override + public void onError(Throwable t) { + throw new AssertionError(t); + } + + @Override + public void onCompleted() { + latch.countDown(); + } + }; impl.hello(Request.newBuilder().setMessage(message).build(), observer); try { latch.await(30, TimeUnit.SECONDS); diff --git a/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/spanner/SpannerTask.java b/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/spanner/SpannerTask.java index c7a57464888..fb2b77ae035 100644 --- a/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/spanner/SpannerTask.java +++ b/dd-smoke-tests/springboot-grpc/src/main/java/datadog/smoketest/springboot/spanner/SpannerTask.java @@ -22,10 +22,9 @@ public CompletableFuture getSpannerResultSet() { DatabaseId db = DatabaseId.of(options.getProjectId(), "", ""); DatabaseClient dbClient = spanner.getDatabaseClient(db); - Statement sql = - Statement.newBuilder( - "SELECT table_name FROM information_schema.tables WHERE table_catalog = '' and table_schema = ''") - .build(); + Statement sql = Statement.newBuilder( + "SELECT table_name FROM information_schema.tables WHERE table_catalog = '' and table_schema = ''") + .build(); return CompletableFuture.completedFuture(dbClient.singleUse().executeQuery(sql)); } diff --git a/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/controller/LibraryController.java b/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/controller/LibraryController.java index e8a6891ff32..e38e30f16c1 100644 --- a/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/controller/LibraryController.java +++ b/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/controller/LibraryController.java @@ -40,27 +40,23 @@ public ResponseEntity hasIssue(@PathVariable final int id) { @GetMapping public ResponseEntity create() { - final Library library = - Library.builder() - .books( - asList( - Book.builder() - .title("The Lord of the Rings") - .owner(Owner.builder().name("Peter Jackson").build()) - .authors( - asList( - Author.builder().name("J.R.R Tolkien").build(), - Author.builder().name("Peter Jackson").build())) - .build(), - Book.builder() - .title("The Hobbit") - .owner(Owner.builder().name("Edith Tolkien").build()) - .authors( - asList( - Author.builder().name("J.R.R Tolkien").build(), - Author.builder().name("Edith Tolkien").build())) - .build())) - .build(); + final Library library = Library.builder() + .books(asList( + Book.builder() + .title("The Lord of the Rings") + .owner(Owner.builder().name("Peter Jackson").build()) + .authors(asList( + Author.builder().name("J.R.R Tolkien").build(), + Author.builder().name("Peter Jackson").build())) + .build(), + Book.builder() + .title("The Hobbit") + .owner(Owner.builder().name("Edith Tolkien").build()) + .authors(asList( + Author.builder().name("J.R.R Tolkien").build(), + Author.builder().name("Edith Tolkien").build())) + .build())) + .build(); libraryService.save(library); return ResponseEntity.ok(library.getId()); } diff --git a/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/filter/SessionVisitorFilter.java b/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/filter/SessionVisitorFilter.java index 421d5ff041b..5285a6b99e6 100644 --- a/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/filter/SessionVisitorFilter.java +++ b/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/filter/SessionVisitorFilter.java @@ -57,7 +57,8 @@ private HttpSession wrapSession(final HttpSession session) { private static class SessionWrapper implements HttpSession { - @Delegate private final HttpSession delegate; + @Delegate + private final HttpSession delegate; private SessionWrapper(final HttpSession delegate) { this.delegate = delegate; diff --git a/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/service/LibraryService.java b/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/service/LibraryService.java index 1f211db1753..1048bc3b63f 100644 --- a/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/service/LibraryService.java +++ b/dd-smoke-tests/springboot-jpa/application/src/main/java/datadog/smoketest/springboot/service/LibraryService.java @@ -11,7 +11,8 @@ @Service public class LibraryService { - @PersistenceContext private EntityManager em; + @PersistenceContext + private EntityManager em; @Transactional public void save(final Library library) { @@ -22,14 +23,10 @@ public void save(final Library library) { public Library update(Library library) { library.increaseUpdateCount(); library.getBooks().forEach(Book::increaseUpdateCount); - library.getBooks().stream() - .map(Book::getId) - .map(this::findBookById) - .forEach( - book -> { - book.getAuthors().forEach(Author::increaseUpdateCount); - book.getOwner().increaseUpdateCount(); - }); + library.getBooks().stream().map(Book::getId).map(this::findBookById).forEach(book -> { + book.getAuthors().forEach(Author::increaseUpdateCount); + book.getOwner().increaseUpdateCount(); + }); return em.merge(library); } diff --git a/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/controller/WebController.java b/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/controller/WebController.java index 25400410e47..1f469b94538 100644 --- a/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/controller/WebController.java +++ b/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/controller/WebController.java @@ -13,7 +13,8 @@ @RestController public class WebController { - @Autowired DocRepository docRepository; + @Autowired + DocRepository docRepository; @RequestMapping("/docs") public List getDocs() { diff --git a/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/mongo/Doc.java b/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/mongo/Doc.java index cdfc501e6e0..3b5b6d23fb5 100644 --- a/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/mongo/Doc.java +++ b/dd-smoke-tests/springboot-mongo/src/main/java/datadog/smoketest/springboot/mongo/Doc.java @@ -4,7 +4,8 @@ public class Doc { - @Id public String id; + @Id + public String id; public String name; diff --git a/dd-smoke-tests/springboot/src/main/java/datadog/smoketest/springboot/jwt/JwtSecurityConfigurerAdapter.java b/dd-smoke-tests/springboot/src/main/java/datadog/smoketest/springboot/jwt/JwtSecurityConfigurerAdapter.java index 4e442b1507e..8896f9b3b4f 100644 --- a/dd-smoke-tests/springboot/src/main/java/datadog/smoketest/springboot/jwt/JwtSecurityConfigurerAdapter.java +++ b/dd-smoke-tests/springboot/src/main/java/datadog/smoketest/springboot/jwt/JwtSecurityConfigurerAdapter.java @@ -31,14 +31,12 @@ protected void configure(HttpSecurity http) throws Exception { .httpBasic() .disable() .exceptionHandling() - .authenticationEntryPoint( - (request, response, authException) -> { - response.sendError(401, authException.getMessage()); - }) - .accessDeniedHandler( - (request, response, accessDeniedException) -> { - response.sendError(403, "Access Denied."); - }) + .authenticationEntryPoint((request, response, authException) -> { + response.sendError(401, authException.getMessage()); + }) + .accessDeniedHandler((request, response, accessDeniedException) -> { + response.sendError(403, "Access Denied."); + }) .and() .headers() .disable(); diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/AbstractSmokeApp.java b/dd-smoke-tests/src/main/java/datadog/smoketest/AbstractSmokeApp.java index 508d8d7e8b3..c34e7a67987 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/AbstractSmokeApp.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/AbstractSmokeApp.java @@ -123,10 +123,9 @@ protected AbstractSmokeApp(Builder builder) { this.checkTelemetry = builder.checkTelemetry; this.applyMemoryTuning = builder.applyMemoryTuning; this.debugLogs = builder.debugLogs; - this.errorLogFilter = - builder.errorLogFilter != null - ? builder.errorLogFilter - : defaultErrorLogFilter(builder.allowedErrorLogs); + this.errorLogFilter = builder.errorLogFilter != null + ? builder.errorLogFilter + : defaultErrorLogFilter(builder.allowedErrorLogs); } // --- Handle API (field access) --- @@ -392,11 +391,10 @@ private void stopProcess() { if (!this.process.waitFor(5, SECONDS)) { this.process.destroyForcibly(); if (!this.process.waitFor(10, SECONDS)) { - throw new IllegalStateException( - "App '" - + name() - + "' did not terminate after destroy. A lingering process may retain" - + " its port and files and interfere with later tests."); + throw new IllegalStateException("App '" + + name() + + "' did not terminate after destroy. A lingering process may retain" + + " its port and files and interfere with later tests."); } } } catch (InterruptedException e) { @@ -418,10 +416,9 @@ private String substitute(String value) { private File resolveLogFile() { String buildDir = System.getProperty(BUILD_DIR_PROPERTY); - File dir = - buildDir != null - ? new File(buildDir, "reports") - : new File(System.getProperty("java.io.tmpdir")); + File dir = buildDir != null + ? new File(buildDir, "reports") + : new File(System.getProperty("java.io.tmpdir")); dir.mkdirs(); return new File(dir, logFileName(this.name, Instant.now())); } @@ -812,11 +809,10 @@ protected void validate() { throw new IllegalStateException("Exactly one of jar(...) or mainClass(...) must be set"); } if (!this.noAgent && resolveAgentJar() == null) { - throw new IllegalStateException( - "Agent jar not found: system property '" - + AGENT_JAR_PROPERTY - + "' is not set. Gradle sets it automatically; on other runners call javaAgent(path)" - + " to point at an agent jar, or noAgent() to run without the tracer."); + throw new IllegalStateException("Agent jar not found: system property '" + + AGENT_JAR_PROPERTY + + "' is not set. Gradle sets it automatically; on other runners call javaAgent(path)" + + " to point at an agent jar, or noAgent() to run without the tracer."); } } } diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/KnownLogExclusion.java b/dd-smoke-tests/src/main/java/datadog/smoketest/KnownLogExclusion.java index 597f0d8be97..be4fbcbd52e 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/KnownLogExclusion.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/KnownLogExclusion.java @@ -10,19 +10,18 @@ */ final class KnownLogExclusion { // Repository-wide known-flaky log lines excluded from the default error-log check. - private static final List FLAKY_TEST_LOG_EXCLUSION = - asList( - // FIXME: Flaky profiler exception. See PROF-11068. - "ERROR com.datadog.profiling.controller.ProfilingSystem - Fatal exception in profiling" - + " thread, trying to continue", - // FIXME: Flaky profiler exception. See PROF-11072. - "ERROR com.datadog.profiling.controller.ProfilingSystem - Fatal exception during" - + " profiling startup", - // FIXME: Flaky on Spring Boot (e.g. IastSpringBootSmokeTest) and other HTTP-client - // suites. - "I/O reactor terminated abnormally", - // FIXME: Observed in WildflySmokeTest (semeru8): a successful JMX collector exit. - "ERROR datadog.trace.agent.jmxfetch.JMXFetch - jmx collector exited with result: 0"); + private static final List FLAKY_TEST_LOG_EXCLUSION = asList( + // FIXME: Flaky profiler exception. See PROF-11068. + "ERROR com.datadog.profiling.controller.ProfilingSystem - Fatal exception in profiling" + + " thread, trying to continue", + // FIXME: Flaky profiler exception. See PROF-11072. + "ERROR com.datadog.profiling.controller.ProfilingSystem - Fatal exception during" + + " profiling startup", + // FIXME: Flaky on Spring Boot (e.g. IastSpringBootSmokeTest) and other HTTP-client + // suites. + "I/O reactor terminated abnormally", + // FIXME: Observed in WildflySmokeTest (semeru8): a successful JMX collector exit. + "ERROR datadog.trace.agent.jmxfetch.JMXFetch - jmx collector exited with result: 0"); private KnownLogExclusion() {} diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java b/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java index 0166663bc26..553247edf2d 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java @@ -97,7 +97,10 @@ public void run() { consumed += subBuff.position(); String line = null; try { - line = decoder.decode((ByteBuffer) subBuff.duplicate().flip()).toString().trim(); + line = decoder + .decode((ByteBuffer) subBuff.duplicate().flip()) + .toString() + .trim(); } catch (CharacterCodingException e) { throw new RuntimeException(e); } diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/MockAgentBackend.java b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/MockAgentBackend.java index 72b415ad789..7e25ea03abd 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/MockAgentBackend.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/MockAgentBackend.java @@ -25,12 +25,11 @@ public final class MockAgentBackend extends AgentBackend { * Agent-info payload advertising the endpoints and capabilities the tracer negotiates from, * mirroring the real agent. */ - private static final String INFO_BODY = - "{\"version\":\"7.77.0\"," - + "\"endpoints\":[\"/v0.4/traces\",\"/v0.5/traces\",\"/v1.0/traces\",\"/telemetry/proxy/\"]," - + "\"client_drop_p0s\":true," - + "\"span_meta_structs\":true," - + "\"long_running_spans\":true}"; + private static final String INFO_BODY = "{\"version\":\"7.77.0\"," + + "\"endpoints\":[\"/v0.4/traces\",\"/v0.5/traces\",\"/v1.0/traces\",\"/telemetry/proxy/\"]," + + "\"client_drop_p0s\":true," + + "\"span_meta_structs\":true," + + "\"long_running_spans\":true}"; /** JSON mime type. */ private static final String JSON = "application/json"; @@ -59,19 +58,18 @@ public void start() { } private void serverSpecs(JavaTestHttpServer server) { - server.handlers( - h -> { - // Trace endpoints are method-agnostic prefix handlers: the tracer submits - // traces with PUT (DDAgentApi), not POST. - h.prefix("/info", this::sendInfo); - h.prefix("/v1.0/traces", api -> collectTraces(api, TraceFormat.V1)); - h.prefix("/v0.5/traces", api -> collectTraces(api, TraceFormat.V05)); - h.prefix("/v0.4/traces", api -> collectTraces(api, TraceFormat.V04)); - h.prefix("/v0.7/config", this::serveRemoteConfig); - h.prefix("/telemetry/proxy", this::collectTelemetry); - // Everything else just succeeds. - h.all(api -> api.getResponse().status(200).send()); - }); + server.handlers(h -> { + // Trace endpoints are method-agnostic prefix handlers: the tracer submits + // traces with PUT (DDAgentApi), not POST. + h.prefix("/info", this::sendInfo); + h.prefix("/v1.0/traces", api -> collectTraces(api, TraceFormat.V1)); + h.prefix("/v0.5/traces", api -> collectTraces(api, TraceFormat.V05)); + h.prefix("/v0.4/traces", api -> collectTraces(api, TraceFormat.V04)); + h.prefix("/v0.7/config", this::serveRemoteConfig); + h.prefix("/telemetry/proxy", this::collectTelemetry); + // Everything else just succeeds. + h.all(api -> api.getResponse().status(200).send()); + }); } private void sendInfo(HandlerApi api) { diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/RemoteConfig.java b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/RemoteConfig.java index 55a54fb516b..d61b19aea4f 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/RemoteConfig.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/RemoteConfig.java @@ -70,17 +70,15 @@ public Map waitForRequest(Predicate> predica public Map waitForRequest( Predicate> predicate, double timeoutSeconds) { AtomicReference> match = new AtomicReference<>(); - new PollingConditions(timeoutSeconds) - .eventually( - () -> { - for (Map request : requests()) { - if (predicate.test(request)) { - match.set(request); - return; - } - } - throw new AssertionError("No remote-config poll request matched yet"); - }); + new PollingConditions(timeoutSeconds).eventually(() -> { + for (Map request : requests()) { + if (predicate.test(request)) { + match.set(request); + return; + } + } + throw new AssertionError("No remote-config poll request matched yet"); + }); return match.get(); } diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Telemetry.java b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Telemetry.java index 6d9c9529f57..944b6fe0c25 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Telemetry.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Telemetry.java @@ -71,15 +71,13 @@ public void waitForCount(int count) { * @throws AssertionError If no flattened telemetry event could not match the predicate. */ public void waitForCount(int count, double timeoutSeconds) { - new PollingConditions(timeoutSeconds) - .eventually( - () -> { - int actual = getMessages().size(); - if (actual < count) { - throw new AssertionError( - "Expected at least " + count + " telemetry message(s) but got " + actual); - } - }); + new PollingConditions(timeoutSeconds).eventually(() -> { + int actual = getMessages().size(); + if (actual < count) { + throw new AssertionError( + "Expected at least " + count + " telemetry message(s) but got " + actual); + } + }); } /** @@ -101,12 +99,10 @@ public void waitForFlat(Predicate> predicate) { * @throws AssertionError If no flattened telemetry event could not match the predicate. */ public void waitForFlat(Predicate> predicate, double timeoutSeconds) { - new PollingConditions(timeoutSeconds) - .eventually( - () -> { - if (getFlatMessages().stream().noneMatch(predicate)) { - throw new AssertionError("No telemetry event matched; received: " + getMessages()); - } - }); + new PollingConditions(timeoutSeconds).eventually(() -> { + if (getFlatMessages().stream().noneMatch(predicate)) { + throw new AssertionError("No telemetry event matched; received: " + getMessages()); + } + }); } } diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/TestAgentBackend.java b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/TestAgentBackend.java index c694095dc8c..79da2132a6c 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/TestAgentBackend.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/TestAgentBackend.java @@ -71,9 +71,8 @@ public final class TestAgentBackend extends AgentBackend { private static final JsonAdapter> MAP_ADAPTER = MOSHI.adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); private static final JsonAdapter>> REQUEST_LIST_ADAPTER = - MOSHI.adapter( - Types.newParameterizedType( - List.class, Types.newParameterizedType(Map.class, String.class, Object.class))); + MOSHI.adapter(Types.newParameterizedType( + List.class, Types.newParameterizedType(Map.class, String.class, Object.class))); private final String image; private final String externalHost; // null => Testcontainers-managed container @@ -126,12 +125,11 @@ public void start() { return; } if (this.externalHost != null && this.externalPort > 0) { - this.baseUrl = - new HttpUrl.Builder() - .scheme("http") - .host(this.externalHost) - .port(this.externalPort) - .build(); + this.baseUrl = new HttpUrl.Builder() + .scheme("http") + .host(this.externalHost) + .port(this.externalPort) + .build(); } else { GenericContainer started = new GenericContainer<>(DockerImageName.parse(this.image)); started.withExposedPorts(AGENT_PORT); @@ -142,12 +140,11 @@ public void start() { started.setWaitStrategy(Wait.forHttp("/test/traces")); started.start(); this.container = started; - this.baseUrl = - new HttpUrl.Builder() - .scheme("http") - .host(started.getHost()) - .port(started.getMappedPort(AGENT_PORT)) - .build(); + this.baseUrl = new HttpUrl.Builder() + .scheme("http") + .host(started.getHost()) + .port(started.getMappedPort(AGENT_PORT)) + .build(); } // Normalize the external URI this.baseUri = cleanBaseUri(this.baseUrl); @@ -187,12 +184,11 @@ public void clear() { resetRemoteConfig(); // GET /test/session/start begins (and clears) a session identified by the token. The // dd-apm-test-agent session endpoints are GET (verified against v1.44.0: POST returns 405). - HttpUrl url = - requireStarted() - .newBuilder() - .addPathSegments("test/session/start") - .addQueryParameter("test_session_token", this.sessionToken) - .build(); + HttpUrl url = requireStarted() + .newBuilder() + .addPathSegments("test/session/start") + .addQueryParameter("test_session_token", this.sessionToken) + .build(); Request request = new Request.Builder().url(url).get().build(); execute(request, "start test-agent session"); } @@ -228,12 +224,11 @@ public void close() { * @throws AssertionError If the agent recorded one or more trace-invariant check failures. */ public void assertNoInvariantFailures() { - HttpUrl url = - requireStarted() - .newBuilder() - .addPathSegments("test/trace_check/failures") - .addQueryParameter("test_session_token", this.sessionToken) - .build(); + HttpUrl url = requireStarted() + .newBuilder() + .addPathSegments("test/trace_check/failures") + .addQueryParameter("test_session_token", this.sessionToken) + .build(); Request request = new Request.Builder().url(url).get().build(); try (Response response = this.client.newCall(request).execute()) { int code = response.code(); @@ -251,23 +246,22 @@ public void assertNoInvariantFailures() { } private List fetchTraces() { - HttpUrl url = - requireStarted() - .newBuilder() - .addPathSegments("test/session/traces") - .addQueryParameter("test_session_token", this.sessionToken) - .build(); + HttpUrl url = requireStarted() + .newBuilder() + .addPathSegments("test/session/traces") + .addQueryParameter("test_session_token", this.sessionToken) + .build(); Request request = new Request.Builder().url(url).get().build(); - return Decoder.decodeJson(execute(request, "read test-agent session traces")).getTraces(); + return Decoder.decodeJson(execute(request, "read test-agent session traces")) + .getTraces(); } private List> fetchTelemetry() { - HttpUrl url = - requireStarted() - .newBuilder() - .addPathSegments("test/session/apmtelemetry") - .addQueryParameter("test_session_token", this.sessionToken) - .build(); + HttpUrl url = requireStarted() + .newBuilder() + .addPathSegments("test/session/apmtelemetry") + .addQueryParameter("test_session_token", this.sessionToken) + .build(); Request request = new Request.Builder().url(url).get().build(); return decodeMessages(execute(request, "read test-agent session telemetry")); } @@ -276,31 +270,26 @@ private void pushRemoteConfig(String path, String config) { // POST {"path": ..., "msg": } to /test/session/responses/config/path; the agent builds // the signed RC envelope from it, so callers don't hand-build it (mirrors the Groovy base's // setRemoteConfig). - HttpUrl url = - requireStarted() - .newBuilder() - .addPathSegments("test/session/responses/config/path") - .addQueryParameter("test_session_token", this.sessionToken) - .build(); - String body = - "{\"path\":\"" - + path.replace("\\", "\\\\").replace("\"", "\\\"") - + "\",\"msg\":" - + config - + "}"; - Request request = new Request.Builder().url(url).post(RequestBody.create(JSON, body)).build(); + HttpUrl url = requireStarted() + .newBuilder() + .addPathSegments("test/session/responses/config/path") + .addQueryParameter("test_session_token", this.sessionToken) + .build(); + String body = "{\"path\":\"" + path.replace("\\", "\\\\").replace("\"", "\\\"") + "\",\"msg\":" + + config + "}"; + Request request = + new Request.Builder().url(url).post(RequestBody.create(JSON, body)).build(); execute(request, "set remote-config response"); } private List> fetchRemoteConfigRequests() { // The test agent records every request the tracer made in this session; select the /v0.7/config // polls and decode their base64-encoded bodies into JSON maps. - HttpUrl url = - requireStarted() - .newBuilder() - .addPathSegments("test/session/requests") - .addQueryParameter("test_session_token", this.sessionToken) - .build(); + HttpUrl url = requireStarted() + .newBuilder() + .addPathSegments("test/session/requests") + .addQueryParameter("test_session_token", this.sessionToken) + .build(); Request request = new Request.Builder().url(url).get().build(); String json = execute(request, "read test-agent session requests"); List> requests; @@ -339,13 +328,13 @@ private void resetRemoteConfig() { // stored under the (stable) session token. Replace it with an empty payload — the // tracer's "no configs" default — so each test method starts with a clean RC slate, // matching the per-test trace and telemetry isolation. - HttpUrl url = - requireStarted() - .newBuilder() - .addPathSegments("test/session/responses/config") - .addQueryParameter("test_session_token", this.sessionToken) - .build(); - Request request = new Request.Builder().url(url).post(RequestBody.create(JSON, "{}")).build(); + HttpUrl url = requireStarted() + .newBuilder() + .addPathSegments("test/session/responses/config") + .addQueryParameter("test_session_token", this.sessionToken) + .build(); + Request request = + new Request.Builder().url(url).post(RequestBody.create(JSON, "{}")).build(); execute(request, "reset remote-config response"); } diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Traces.java b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Traces.java index 57ebcdabdfe..af716ffd7a7 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Traces.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/backend/Traces.java @@ -49,15 +49,12 @@ public void waitForTraceCount(int count) { * @throws AssertionError If less than {@code count} traces have been received. */ public void waitForTraceCount(int count, double timeoutSeconds) { - new PollingConditions(timeoutSeconds) - .eventually( - () -> { - int actual = getTraces().size(); - if (actual < count) { - throw new AssertionError( - "Expected at least " + count + " trace(s) but got " + actual); - } - }); + new PollingConditions(timeoutSeconds).eventually(() -> { + int actual = getTraces().size(); + if (actual < count) { + throw new AssertionError("Expected at least " + count + " trace(s) but got " + actual); + } + }); } /** diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/trace/SpanLinkMatcher.java b/dd-smoke-tests/src/main/java/datadog/smoketest/trace/SpanLinkMatcher.java index cbf5f14ab8a..acf53445e21 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/trace/SpanLinkMatcher.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/trace/SpanLinkMatcher.java @@ -182,12 +182,11 @@ private Matcher spanIdMatcher(List trace) { private DecodedSpan targetSpan(List trace) { if (this.targetSpanIndex >= trace.size()) { - throw new IllegalStateException( - "Cannot link to span #" - + this.targetSpanIndex - + ": the trace holds only " - + trace.size() - + " span(s)"); + throw new IllegalStateException("Cannot link to span #" + + this.targetSpanIndex + + ": the trace holds only " + + trace.size() + + " span(s)"); } return trace.get(this.targetSpanIndex); } diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/ErrorLogSmokeTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/ErrorLogSmokeTest.java index b68116bf37c..fcff7390d5c 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/ErrorLogSmokeTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/ErrorLogSmokeTest.java @@ -16,14 +16,13 @@ class ErrorLogSmokeTest { @RegisterExtension - static final SmokeServerApp app = - SmokeServerApp.named("error-logger") - .mainClass("datadog.smoketest.TestServerApp") - .args("--server.port=${app.httpPort}") - .backend(AgentBackend.mockAgent()) - .noAgent() - .skipErrorLogCheck() - .build(); + static final SmokeServerApp app = SmokeServerApp.named("error-logger") + .mainClass("datadog.smoketest.TestServerApp") + .args("--server.port=${app.httpPort}") + .backend(AgentBackend.mockAgent()) + .noAgent() + .skipErrorLogCheck() + .build(); @Test void detectsErrorLinesInTheLog() { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/SharedBackendMultiAppTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/SharedBackendMultiAppTest.java index 58fd7b96c80..e0d7ceab2ab 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/SharedBackendMultiAppTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/SharedBackendMultiAppTest.java @@ -32,23 +32,21 @@ class SharedBackendMultiAppTest { @Order(2) @RegisterExtension - static final SmokeServerApp producer = - SmokeServerApp.named("producer") - .mainClass("datadog.smoketest.TestServerApp") - .args("--server.port=${app.httpPort}") - .backend(agent) - .noAgent() - .build(); + static final SmokeServerApp producer = SmokeServerApp.named("producer") + .mainClass("datadog.smoketest.TestServerApp") + .args("--server.port=${app.httpPort}") + .backend(agent) + .noAgent() + .build(); @Order(3) @RegisterExtension - static final SmokeServerApp consumer = - SmokeServerApp.named("consumer") - .mainClass("datadog.smoketest.TestServerApp") - .args("--server.port=${app.httpPort}") - .backend(agent) - .noAgent() - .build(); + static final SmokeServerApp consumer = SmokeServerApp.named("consumer") + .mainClass("datadog.smoketest.TestServerApp") + .args("--server.port=${app.httpPort}") + .backend(agent) + .noAgent() + .build(); @Test void bothAppsRunOnDistinctPorts() { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppBuilderValidationTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppBuilderValidationTest.java index 8baa76a9ad5..0f52ce9cd87 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppBuilderValidationTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppBuilderValidationTest.java @@ -19,34 +19,30 @@ void buildRequiresAnAgentJarUnlessNoAgentOrExplicitAgent() { // No noAgent()/javaAgent() and no agent-jar property: fail loudly rather than silently launch // without the tracer (which would also skip the telemetry check and pass app-only // assertions). - IllegalStateException error = - assertThrows( - IllegalStateException.class, - () -> - SmokeServerApp.named("no-agent-jar") - .mainClass("datadog.smoketest.TestServerApp") - .backend(AgentBackend.mockAgent()) - .build()); + IllegalStateException error = assertThrows( + IllegalStateException.class, + () -> SmokeServerApp.named("no-agent-jar") + .mainClass("datadog.smoketest.TestServerApp") + .backend(AgentBackend.mockAgent()) + .build()); assertTrue(error.getMessage().contains("Agent jar not found"), error.getMessage()); // noAgent() is a valid way to build without an agent jar. assertDoesNotThrow( - () -> - SmokeServerApp.named("no-agent") - .mainClass("datadog.smoketest.TestServerApp") - .backend(AgentBackend.mockAgent()) - .noAgent() - .build(), + () -> SmokeServerApp.named("no-agent") + .mainClass("datadog.smoketest.TestServerApp") + .backend(AgentBackend.mockAgent()) + .noAgent() + .build(), "noAgent() should build without an agent jar"); // An explicit javaAgent(path) is also valid without the property. assertDoesNotThrow( - () -> - SmokeServerApp.named("explicit-agent") - .mainClass("datadog.smoketest.TestServerApp") - .backend(AgentBackend.mockAgent()) - .javaAgent("/tmp/some-agent.jar") - .build(), + () -> SmokeServerApp.named("explicit-agent") + .mainClass("datadog.smoketest.TestServerApp") + .backend(AgentBackend.mockAgent()) + .javaAgent("/tmp/some-agent.jar") + .build(), "an explicit agent jar should build without the property"); } finally { if (saved != null) { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppErrorLogFilterTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppErrorLogFilterTest.java index 6c78d32b804..ac059dad642 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppErrorLogFilterTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppErrorLogFilterTest.java @@ -58,9 +58,8 @@ void excludesRepositoryWideKnownFlakyLines() { // A genuine profiling/agent ERROR that is NOT in the exclusion list is still flagged. assertTrue( - isError.test( - "ERROR datadog.trace.agent.jmxfetch.JMXFetch - jmx collector exited with" - + " result: 1"), + isError.test("ERROR datadog.trace.agent.jmxfetch.JMXFetch - jmx collector exited with" + + " result: 1"), "a real (non-zero) JMX collector failure is still an error"); } } diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppLogLevelTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppLogLevelTest.java index c8099588f65..0af95ed8a35 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppLogLevelTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeAppLogLevelTest.java @@ -14,21 +14,19 @@ class SmokeAppLogLevelTest { @RegisterExtension - static final SmokeCliApp defaultLevel = - SmokeCliApp.named("log-level-default") - .mainClass("datadog.smoketest.TestCliApp") - .backend(AgentBackend.mockAgent()) - .noAgent() - .build(); + static final SmokeCliApp defaultLevel = SmokeCliApp.named("log-level-default") + .mainClass("datadog.smoketest.TestCliApp") + .backend(AgentBackend.mockAgent()) + .noAgent() + .build(); @RegisterExtension - static final SmokeCliApp debugLevel = - SmokeCliApp.named("log-level-debug") - .mainClass("datadog.smoketest.TestCliApp") - .backend(AgentBackend.mockAgent()) - .noAgent() - .debugLogs() - .build(); + static final SmokeCliApp debugLevel = SmokeCliApp.named("log-level-debug") + .mainClass("datadog.smoketest.TestCliApp") + .backend(AgentBackend.mockAgent()) + .noAgent() + .debugLogs() + .build(); @Test void launchesWithInfoLevelByDefault() { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeCliAppTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeCliAppTest.java index 1454ffd2bb5..ca97e73cdd0 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeCliAppTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeCliAppTest.java @@ -15,12 +15,11 @@ class SmokeCliAppTest { @RegisterExtension - static final SmokeCliApp app = - SmokeCliApp.named("test-cli") - .mainClass("datadog.smoketest.TestCliApp") - .backend(AgentBackend.mockAgent()) - .noAgent() - .build(); + static final SmokeCliApp app = SmokeCliApp.named("test-cli") + .mainClass("datadog.smoketest.TestCliApp") + .backend(AgentBackend.mockAgent()) + .noAgent() + .build(); @Test void retainsStartupLogsForAssertion() { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppLivenessTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppLivenessTest.java index 19e4bd2bae9..2d015ee6996 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppLivenessTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppLivenessTest.java @@ -16,13 +16,12 @@ class SmokeServerAppLivenessTest { @Test void failsWhenTheServerDiesDuringATest() throws Exception { - SmokeServerApp app = - SmokeServerApp.named("dying-server") - .mainClass("datadog.smoketest.TestServerApp") - .args("--server.port=${app.httpPort}") - .backend(AgentBackend.mockAgent()) - .noAgent() - .build(); + SmokeServerApp app = SmokeServerApp.named("dying-server") + .mainClass("datadog.smoketest.TestServerApp") + .args("--server.port=${app.httpPort}") + .backend(AgentBackend.mockAgent()) + .noAgent() + .build(); app.beforeAll(null); try { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppTest.java index b4db8092048..c80014568d0 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/SmokeServerAppTest.java @@ -17,14 +17,13 @@ class SmokeServerAppTest { @RegisterExtension - static final SmokeServerApp app = - SmokeServerApp.named("test-server") - .mainClass("datadog.smoketest.TestServerApp") - .placeholder("marker", () -> "resolved-at-launch") - .args("--server.port=${app.httpPort}", "--marker=${marker}") - .backend(AgentBackend.mockAgent()) - .noAgent() - .build(); + static final SmokeServerApp app = SmokeServerApp.named("test-server") + .mainClass("datadog.smoketest.TestServerApp") + .placeholder("marker", () -> "resolved-at-launch") + .args("--server.port=${app.httpPort}", "--marker=${marker}") + .backend(AgentBackend.mockAgent()) + .noAgent() + .build(); @Test void respondsOnTheAllocatedPort() { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/TestServerApp.java b/dd-smoke-tests/src/test/java/datadog/smoketest/TestServerApp.java index 5d58d280d09..37c67c338e6 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/TestServerApp.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/TestServerApp.java @@ -30,21 +30,19 @@ public static void main(String[] args) throws Exception { final String markerSuffix = marker.isEmpty() ? "" : " marker=" + marker; HttpServer server = HttpServer.create(new InetSocketAddress("localhost", port), 0); - server.createContext( - "/", - exchange -> { - String path = exchange.getRequestURI().getPath(); - System.out.println("REQUEST " + exchange.getRequestMethod() + " " + path + markerSuffix); - if ("/error".equals(path)) { - // Emit an error line so tests can exercise the no-error-logs check. - System.out.println("ERROR simulated application error"); - } - byte[] body = "ok".getBytes(StandardCharsets.UTF_8); - exchange.sendResponseHeaders(200, body.length); - try (OutputStream os = exchange.getResponseBody()) { - os.write(body); - } - }); + server.createContext("/", exchange -> { + String path = exchange.getRequestURI().getPath(); + System.out.println("REQUEST " + exchange.getRequestMethod() + " " + path + markerSuffix); + if ("/error".equals(path)) { + // Emit an error line so tests can exercise the no-error-logs check. + System.out.println("ERROR simulated application error"); + } + byte[] body = "ok".getBytes(StandardCharsets.UTF_8); + exchange.sendResponseHeaders(200, body.length); + try (OutputStream os = exchange.getResponseBody()) { + os.write(body); + } + }); server.start(); System.out.println("TestServerApp listening on " + port); diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/MockAgentBackendTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/MockAgentBackendTest.java index 0b9d06e9c33..6f7ff973c7a 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/MockAgentBackendTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/MockAgentBackendTest.java @@ -107,10 +107,9 @@ void assertTracesFacadeMatchesDecodedTraces() throws IOException { // spans share the service and web type, so this holds regardless of the received span order. backend .traces() - .waitForTraces( - trace( - span().service("smoke-test-java-app").type("web"), - span().service("smoke-test-java-app").type("web"))); + .waitForTraces(trace( + span().service("smoke-test-java-app").type("web"), + span().service("smoke-test-java-app").type("web"))); } @Test @@ -135,10 +134,9 @@ void clearDiscardsReceivedTraces() throws IOException { @Test void capturesTelemetry() throws IOException { postTelemetry("{\"request_type\":\"app-started\",\"api_version\":\"v2\"}"); - postTelemetry( - "{\"request_type\":\"message-batch\",\"payload\":[" - + "{\"request_type\":\"app-dependencies-loaded\"}," - + "{\"request_type\":\"generate-metrics\"}]}"); + postTelemetry("{\"request_type\":\"message-batch\",\"payload\":[" + + "{\"request_type\":\"app-dependencies-loaded\"}," + + "{\"request_type\":\"generate-metrics\"}]}"); Telemetry telemetry = backend.telemetry(); telemetry.waitForCount(2); @@ -167,10 +165,9 @@ void waitForFlatMatchesTelemetryEvents() throws IOException { // …and times out (short timeout) when nothing matches. assertThrows( AssertionError.class, - () -> - backend - .telemetry() - .waitForFlat(message -> "never-sent".equals(message.get("request_type")), 0.2)); + () -> backend + .telemetry() + .waitForFlat(message -> "never-sent".equals(message.get("request_type")), 0.2)); } @Test @@ -208,14 +205,12 @@ void servesPushedRemoteConfigAndCapturesPolls() throws IOException { // The served payload must satisfy the tracer's own parser, which checks each target file // against the sha256 and byte length declared in "targets". - RemoteConfigResponse parsed = - new RemoteConfigResponse.Factory( - new Moshi.Builder() - .add(Instant.class, new InstantJsonAdapter()) - .add(ByteString.class, new RawJsonAdapter()) - .build()) - .fromInputStream(new ByteArrayInputStream(served.getBytes(UTF_8))) - .orElseThrow(() -> new AssertionError("remote-config payload not parsed: " + served)); + RemoteConfigResponse parsed = new RemoteConfigResponse.Factory(new Moshi.Builder() + .add(Instant.class, new InstantJsonAdapter()) + .add(ByteString.class, new RawJsonAdapter()) + .build()) + .fromInputStream(new ByteArrayInputStream(served.getBytes(UTF_8))) + .orElseThrow(() -> new AssertionError("remote-config payload not parsed: " + served)); assertEquals(config, new String(parsed.getFileContents(path), UTF_8), "config content"); List> polls = backend.remoteConfig().requests(); @@ -236,11 +231,10 @@ void clearResetsRemoteConfig() throws IOException { } private static String pollRemoteConfig(String clientBody) throws IOException { - Request request = - new Request.Builder() - .url(backend.url() + "/v0.7/config") - .post(RequestBody.create(JSON, clientBody)) - .build(); + Request request = new Request.Builder() + .url(backend.url() + "/v0.7/config") + .post(RequestBody.create(JSON, clientBody)) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertEquals(200, response.code(), "mock agent should serve remote config"); return response.body().string(); @@ -248,11 +242,10 @@ private static String pollRemoteConfig(String clientBody) throws IOException { } private static void postTelemetry(String json) throws IOException { - Request request = - new Request.Builder() - .url(backend.url() + "/telemetry/proxy/api/v2/apmtelemetry") - .post(RequestBody.create(JSON, json)) - .build(); + Request request = new Request.Builder() + .url(backend.url() + "/telemetry/proxy/api/v2/apmtelemetry") + .post(RequestBody.create(JSON, json)) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertTrue(response.isSuccessful(), "mock agent should accept telemetry: " + response.code()); } @@ -262,11 +255,10 @@ private static void postTelemetry(String json) throws IOException { void surfacesDecodingFailures() throws IOException { // Decoding runs on the server thread, where JavaTestHttpServer turns the exception into a 500; // without capture the test would only see an empty trace collection and time out. - Request request = - new Request.Builder() - .url(backend.url() + "/v0.4/traces") - .put(RequestBody.create(MSGPACK, "not msgpack".getBytes(UTF_8))) - .build(); + Request request = new Request.Builder() + .url(backend.url() + "/v0.4/traces") + .put(RequestBody.create(MSGPACK, "not msgpack".getBytes(UTF_8))) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertEquals(500, response.code(), "malformed payload is rejected"); } @@ -285,11 +277,10 @@ void surfacesDecodingFailures() throws IOException { } private static void putTraces(String path, byte[] payload) throws IOException { - Request request = - new Request.Builder() - .url(backend.url() + path) - .put(RequestBody.create(MSGPACK, payload)) - .build(); + Request request = new Request.Builder() + .url(backend.url() + path) + .put(RequestBody.create(MSGPACK, payload)) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertEquals(200, response.code(), "mock agent should accept trace submissions"); } diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/SmokeServerAppRetainBackendTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/SmokeServerAppRetainBackendTest.java index de63aabb219..01fb08f9203 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/SmokeServerAppRetainBackendTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/SmokeServerAppRetainBackendTest.java @@ -23,13 +23,12 @@ class SmokeServerAppRetainBackendTest { private static final CountingBackend BACKEND = new CountingBackend(); @RegisterExtension - static final SmokeServerApp app = - SmokeServerApp.named("retain-server") - .mainClass("datadog.smoketest.TestServerApp") - .args("--server.port=${app.httpPort}") - .backend(BACKEND) - .noAgent() - .build(); + static final SmokeServerApp app = SmokeServerApp.named("retain-server") + .mainClass("datadog.smoketest.TestServerApp") + .args("--server.port=${app.httpPort}") + .backend(BACKEND) + .noAgent() + .build(); @Test void ownedRetainingBackendIsNotClearedBeforeTests() { diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendContainerTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendContainerTest.java index 2a437bafb71..4d6cc23d693 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendContainerTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendContainerTest.java @@ -112,8 +112,9 @@ void clearResetsRemoteConfig() throws IOException { void externalBackendReadsFromRunningAgent() throws IOException { // Point an .external() backend at the same running container: exercises the external code path // (no container of its own) and, via its own fresh token, that sessions are isolated. - TestAgentBackend external = - AgentBackend.testAgentBuilder().external(backend.url().getHost(), backend.port()).build(); + TestAgentBackend external = AgentBackend.testAgentBuilder() + .external(backend.url().getHost(), backend.port()) + .build(); external.start(); try { submitAppTraces(external.url(), external.sessionToken(), v04Payload); @@ -129,20 +130,23 @@ void externalBackendReadsFromRunningAgent() throws IOException { void reportsTraceInvariantFailures() throws IOException { // Its own session token keeps the failure out of the class backend's session, whose teardown // asserts there are none (the agent only drops pooled failures on an explicit clear). - TestAgentBackend external = - AgentBackend.testAgentBuilder().external(backend.url().getHost(), backend.port()).build(); + TestAgentBackend external = AgentBackend.testAgentBuilder() + .external(backend.url().getHost(), backend.port()) + .build(); external.start(); try { // A trace-count header that disagrees with the payload violates trace_count_header. - HttpUrl url = HttpUrl.get(external.url()).newBuilder().addPathSegments("v0.4/traces").build(); - Request request = - new Request.Builder() - .url(url) - .header("X-Datadog-Trace-Count", "5") - .header("Datadog-Meta-Tracer-Version", "0.0.0-smoke-test") - .header("X-Datadog-Test-Session-Token", external.sessionToken()) - .put(RequestBody.create(MSGPACK, v04Payload)) - .build(); + HttpUrl url = HttpUrl.get(external.url()) + .newBuilder() + .addPathSegments("v0.4/traces") + .build(); + Request request = new Request.Builder() + .url(url) + .header("X-Datadog-Trace-Count", "5") + .header("Datadog-Meta-Tracer-Version", "0.0.0-smoke-test") + .header("X-Datadog-Test-Session-Token", external.sessionToken()) + .put(RequestBody.create(MSGPACK, v04Payload)) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertTrue(response.isSuccessful(), "submission still succeeds: HTTP " + response.code()); } @@ -158,23 +162,20 @@ void reportsTraceInvariantFailures() throws IOException { @Test void capturesTelemetry() throws IOException { // Post a telemetry app-started message; the backend reads it back from /test/apmtelemetry. - HttpUrl url = - HttpUrl.get(backend.url()) - .newBuilder() - .addPathSegments("telemetry/proxy/api/v2/apmtelemetry") - .build(); - Request request = - new Request.Builder() - .url(url) - .header("DD-Telemetry-API-Version", "v2") - .header("DD-Telemetry-Request-Type", "app-started") - .header("X-Datadog-Test-Session-Token", backend.sessionToken()) - .post( - RequestBody.create( - MediaType.parse("application/json"), - "{\"request_type\":\"app-started\",\"api_version\":\"v2\"," - + "\"runtime_id\":\"r1\",\"seq_id\":1,\"payload\":{}}")) - .build(); + HttpUrl url = HttpUrl.get(backend.url()) + .newBuilder() + .addPathSegments("telemetry/proxy/api/v2/apmtelemetry") + .build(); + Request request = new Request.Builder() + .url(url) + .header("DD-Telemetry-API-Version", "v2") + .header("DD-Telemetry-Request-Type", "app-started") + .header("X-Datadog-Test-Session-Token", backend.sessionToken()) + .post(RequestBody.create( + MediaType.parse("application/json"), + "{\"request_type\":\"app-started\",\"api_version\":\"v2\"," + + "\"runtime_id\":\"r1\",\"seq_id\":1,\"payload\":{}}")) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertTrue(response.isSuccessful(), "telemetry accepted: HTTP " + response.code()); } @@ -189,13 +190,13 @@ void capturesTelemetry() throws IOException { private static String pollRemoteConfig(URI agentUrl, String token) throws IOException { // Poll /v0.7/config the way a tracer does; the agent returns the session's stored RC response. - HttpUrl url = HttpUrl.get(agentUrl).newBuilder().addPathSegments("v0.7/config").build(); - Request request = - new Request.Builder() - .url(url) - .header("X-Datadog-Test-Session-Token", token) - .post(RequestBody.create(JSON, "{}")) - .build(); + HttpUrl url = + HttpUrl.get(agentUrl).newBuilder().addPathSegments("v0.7/config").build(); + Request request = new Request.Builder() + .url(url) + .header("X-Datadog-Test-Session-Token", token) + .post(RequestBody.create(JSON, "{}")) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertTrue(response.isSuccessful(), "poll /v0.7/config: HTTP " + response.code()); return response.body().string(); @@ -204,15 +205,15 @@ private static String pollRemoteConfig(URI agentUrl, String token) throws IOExce private static void submitAppTraces(URI agentUrl, String token, byte[] payload) throws IOException { - HttpUrl url = HttpUrl.get(agentUrl).newBuilder().addPathSegments("v0.4/traces").build(); - Request request = - new Request.Builder() - .url(url) - .header("X-Datadog-Trace-Count", "1") - .header("Datadog-Meta-Tracer-Version", "0.0.0-smoke-test") - .header("X-Datadog-Test-Session-Token", token) - .put(RequestBody.create(MSGPACK, payload)) - .build(); + HttpUrl url = + HttpUrl.get(agentUrl).newBuilder().addPathSegments("v0.4/traces").build(); + Request request = new Request.Builder() + .url(url) + .header("X-Datadog-Trace-Count", "1") + .header("Datadog-Meta-Tracer-Version", "0.0.0-smoke-test") + .header("X-Datadog-Test-Session-Token", token) + .put(RequestBody.create(MSGPACK, payload)) + .build(); try (Response response = CLIENT.newCall(request).execute()) { assertTrue( response.isSuccessful(), "test agent accepts trace submission: HTTP " + response.code()); diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendTest.java index d3b52e4ba76..0a4ff293ddc 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/backend/TestAgentBackendTest.java @@ -47,10 +47,9 @@ void isSharedInferredFromExtensionRegistration() { // drive the external lifecycle without Docker; beforeAll(...) is what JUnit calls for a // registered extension. try (JavaTestHttpServer agent = stubAgent(200, "")) { - TestAgentBackend backend = - AgentBackend.testAgentBuilder() - .external(agent.getAddress().getHost(), agent.getAddress().getPort()) - .build(); + TestAgentBackend backend = AgentBackend.testAgentBuilder() + .external(agent.getAddress().getHost(), agent.getAddress().getPort()) + .build(); assertFalse(backend.isShared(), "not shared until registered as an extension"); backend.beforeAll(null); try { @@ -73,10 +72,9 @@ void assertNoInvariantFailuresPassesWhenAgentReportsNoFailures() { // A stub agent for /test/session/* and /test/trace_check/failures verifies the check logic // without Docker; HTTP 200 from the failures endpoint means all checks passed. try (JavaTestHttpServer agent = stubAgent(200, "")) { - TestAgentBackend backend = - AgentBackend.testAgentBuilder() - .external(agent.getAddress().getHost(), agent.getAddress().getPort()) - .build(); + TestAgentBackend backend = AgentBackend.testAgentBuilder() + .external(agent.getAddress().getHost(), agent.getAddress().getPort()) + .build(); backend.start(); try { backend.assertNoInvariantFailures(); // HTTP 200 => no failures => no throw @@ -89,10 +87,9 @@ void assertNoInvariantFailuresPassesWhenAgentReportsNoFailures() { @Test void assertNoInvariantFailuresThrowsWhenAgentReportsFailures() { try (JavaTestHttpServer agent = stubAgent(400, "span_count check failed")) { - TestAgentBackend backend = - AgentBackend.testAgentBuilder() - .external(agent.getAddress().getHost(), agent.getAddress().getPort()) - .build(); + TestAgentBackend backend = AgentBackend.testAgentBuilder() + .external(agent.getAddress().getHost(), agent.getAddress().getPort()) + .build(); backend.start(); try { AssertionError error = @@ -110,22 +107,16 @@ void setRemoteConfigPostsPathAndConfigToTheSession() { // the agent builds the signed RC envelope; capture that request against a stub agent. AtomicReference captured = new AtomicReference<>(); try (JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - handlers -> { - handlers.prefix( - "/test/session/responses/config/path", - api -> { - captured.set(new String(api.getRequest().getBody(), UTF_8)); - api.getResponse().status(202).send(); - }); - handlers.all(api -> api.getResponse().status(200).send()); - }))) { - TestAgentBackend backend = - AgentBackend.testAgentBuilder() - .external(agent.getAddress().getHost(), agent.getAddress().getPort()) - .build(); + JavaTestHttpServer.httpServer(server -> server.handlers(handlers -> { + handlers.prefix("/test/session/responses/config/path", api -> { + captured.set(new String(api.getRequest().getBody(), UTF_8)); + api.getResponse().status(202).send(); + }); + handlers.all(api -> api.getResponse().status(200).send()); + }))) { + TestAgentBackend backend = AgentBackend.testAgentBuilder() + .external(agent.getAddress().getHost(), agent.getAddress().getPort()) + .build(); backend.start(); try { backend @@ -150,24 +141,18 @@ void readsAndDecodesRemoteConfigPollRequests() { String pollBody = "{\"client\":{\"products\":[\"APM_TRACING\",\"ASM_FEATURES\"],\"capabilities\":[2]}}"; String encoded = Base64.getEncoder().encodeToString(pollBody.getBytes(UTF_8)); - String requestsJson = - "[{\"url\":\"http://agent/v0.7/config\",\"method\":\"POST\",\"body\":\"" - + encoded - + "\"},{\"url\":\"http://agent/v0.6/stats\",\"method\":\"POST\",\"body\":\"\"}]"; + String requestsJson = "[{\"url\":\"http://agent/v0.7/config\",\"method\":\"POST\",\"body\":\"" + + encoded + + "\"},{\"url\":\"http://agent/v0.6/stats\",\"method\":\"POST\",\"body\":\"\"}]"; try (JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - handlers -> { - handlers.prefix( - "/test/session/requests", - api -> api.getResponse().status(200).send(requestsJson)); - handlers.all(api -> api.getResponse().status(200).send()); - }))) { - TestAgentBackend backend = - AgentBackend.testAgentBuilder() - .external(agent.getAddress().getHost(), agent.getAddress().getPort()) - .build(); + JavaTestHttpServer.httpServer(server -> server.handlers(handlers -> { + handlers.prefix( + "/test/session/requests", api -> api.getResponse().status(200).send(requestsJson)); + handlers.all(api -> api.getResponse().status(200).send()); + }))) { + TestAgentBackend backend = AgentBackend.testAgentBuilder() + .external(agent.getAddress().getHost(), agent.getAddress().getPort()) + .build(); backend.start(); try { List> polls = backend.remoteConfig().requests(); @@ -191,29 +176,21 @@ void clearResetsRemoteConfigBeforeOpeningTheSession() { AtomicReference captured = new AtomicReference<>(); List calls = new CopyOnWriteArrayList<>(); try (JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - handlers -> { - handlers.prefix( - "/test/session/responses/config", - api -> { - captured.set(new String(api.getRequest().getBody(), UTF_8)); - calls.add("reset"); - api.getResponse().status(202).send(); - }); - handlers.prefix( - "/test/session/start", - api -> { - calls.add("start"); - api.getResponse().status(200).send(); - }); - handlers.all(api -> api.getResponse().status(200).send()); - }))) { - TestAgentBackend backend = - AgentBackend.testAgentBuilder() - .external(agent.getAddress().getHost(), agent.getAddress().getPort()) - .build(); + JavaTestHttpServer.httpServer(server -> server.handlers(handlers -> { + handlers.prefix("/test/session/responses/config", api -> { + captured.set(new String(api.getRequest().getBody(), UTF_8)); + calls.add("reset"); + api.getResponse().status(202).send(); + }); + handlers.prefix("/test/session/start", api -> { + calls.add("start"); + api.getResponse().status(200).send(); + }); + handlers.all(api -> api.getResponse().status(200).send()); + }))) { + TestAgentBackend backend = AgentBackend.testAgentBuilder() + .external(agent.getAddress().getHost(), agent.getAddress().getPort()) + .build(); backend.start(); // start() opens the first session via clear() try { assertEquals("{}", captured.get(), "clear() resets the RC response to the empty default"); @@ -226,22 +203,17 @@ void clearResetsRemoteConfigBeforeOpeningTheSession() { /** A stub test agent: 200 on {@code /test/session/start}, {@code failuresStatus} on failures. */ private static JavaTestHttpServer stubAgent(int failuresStatus, String failuresBody) { - return JavaTestHttpServer.httpServer( - server -> - server.handlers( - handlers -> { - handlers.prefix( - "/test/session/start", api -> api.getResponse().status(200).send()); - handlers.prefix( - "/test/trace_check/failures", - api -> { - if (failuresBody.isEmpty()) { - api.getResponse().status(failuresStatus).send(); - } else { - api.getResponse().status(failuresStatus).send(failuresBody); - } - }); - handlers.all(api -> api.getResponse().status(200).send()); - })); + return JavaTestHttpServer.httpServer(server -> server.handlers(handlers -> { + handlers.prefix( + "/test/session/start", api -> api.getResponse().status(200).send()); + handlers.prefix("/test/trace_check/failures", api -> { + if (failuresBody.isEmpty()) { + api.getResponse().status(failuresStatus).send(); + } else { + api.getResponse().status(failuresStatus).send(failuresBody); + } + }); + handlers.all(api -> api.getResponse().status(200).send()); + })); } } diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/trace/SmokeMatcherTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/trace/SmokeMatcherTest.java index d02a5dd7fb0..f76b37e69b1 100644 --- a/dd-smoke-tests/src/test/java/datadog/smoketest/trace/SmokeMatcherTest.java +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/trace/SmokeMatcherTest.java @@ -28,39 +28,36 @@ class SmokeMatcherTest { // One trace, three spans forming root -> child -> grandchild, but delivered out of start order. - private static final String CHAIN_TRACE = - "[[" - + spanJson("grandchild", 300, 200, 30) - + "," - + spanJson("root", 100, 0, 10) - + "," - + spanJson("child", 200, 100, 20) - + "]]"; + private static final String CHAIN_TRACE = "[[" + + spanJson("grandchild", 300, 200, 30) + + "," + + spanJson("root", 100, 0, 10) + + "," + + spanJson("child", 200, 100, 20) + + "]]"; // Two single-span traces; root-b (id 400) has a smaller root span id than root-a (id 500). private static final String TWO_TRACES = "[[" + spanJson("root-a", 500, 0, 10) + "],[" + spanJson("root-b", 400, 0, 20) + "]]"; // One trace whose root has two children (not a linear chain). - private static final String BRANCHING_TRACE = - "[[" - + spanJson("root", 100, 0, 10) - + "," - + spanJson("a", 200, 100, 20) - + "," - + spanJson("b", 300, 100, 30) - + "]]"; + private static final String BRANCHING_TRACE = "[[" + + spanJson("root", 100, 0, 10) + + "," + + spanJson("a", 200, 100, 20) + + "," + + spanJson("b", 300, 100, 30) + + "]]"; // One span carrying meta_struct: an IAST-style nested "_dd.stack" plus a request-body entry. - private static final String META_STRUCT_TRACE = - "[[{" - + "\"service\":\"s\",\"name\":\"servlet.request\",\"resource\":\"r\"," - + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," - + "\"meta\":{},\"metrics\":{}," - + "\"meta_struct\":{" - + "\"_dd.stack\":{\"vulnerability\":[{\"type\":\"SQL_INJECTION\"},{\"type\":\"XSS\"}]}," - + "\"http.request.body\":{\"foo\":\"bar\"}" - + "}}]]"; + private static final String META_STRUCT_TRACE = "[[{" + + "\"service\":\"s\",\"name\":\"servlet.request\",\"resource\":\"r\"," + + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," + + "\"meta\":{},\"metrics\":{}," + + "\"meta_struct\":{" + + "\"_dd.stack\":{\"vulnerability\":[{\"type\":\"SQL_INJECTION\"},{\"type\":\"XSS\"}]}," + + "\"http.request.body\":{\"foo\":\"bar\"}" + + "}}]]"; @Test void sortsSpansByStartTimeThenMatchesParentByPrevious() { @@ -92,21 +89,21 @@ void wrongParentLinkFails() { // grandchild's parent is child (index 1), not root (index 0). assertThrows( AssertionError.class, - () -> - assertTraces( - traces, - trace( - SORT_BY_START_TIME, - span().operationName("root").root(), - span().operationName("child").childOfIndex(0), - span().operationName("grandchild").childOfIndex(0)))); + () -> assertTraces( + traces, + trace( + SORT_BY_START_TIME, + span().operationName("root").root(), + span().operationName("child").childOfIndex(0), + span().operationName("grandchild").childOfIndex(0)))); } @Test void ignoresAdditionalTraces() { List traces = Decoder.decodeJson(TWO_TRACES).getTraces(); // Assert just the first received trace, ignoring the other. - assertTraces(traces, IGNORE_ADDITIONAL_TRACES, trace(span().operationName("root-a").root())); + assertTraces( + traces, IGNORE_ADDITIONAL_TRACES, trace(span().operationName("root-a").root())); } @Test @@ -153,12 +150,11 @@ void unorderedRequiresDistinctTraces() { // Two matchers for the same trace can't both match: only one root-a trace exists. assertThrows( AssertionError.class, - () -> - assertTraces( - traces, - options -> options.unorder().ignoreAdditionalTraces(), - trace(span().operationName("root-a").root()), - trace(span().operationName("root-a").root()))); + () -> assertTraces( + traces, + options -> options.unorder().ignoreAdditionalTraces(), + trace(span().operationName("root-a").root()), + trace(span().operationName("root-a").root()))); } @Test @@ -166,16 +162,15 @@ void matchesMetaStructByMatcherAndPredicate() { List traces = Decoder.decodeJson(META_STRUCT_TRACE).getTraces(); assertTraces( traces, - trace( - span() - .operationName("servlet.request") - .root() - // plain matcher: the entry is present (any nested value) - .metaStruct("http.request.body", isNonNull()) - // predicate via validates(): navigate the nested structure - .metaStruct( - "_dd.stack", - validates(v -> ((List) ((Map) v).get("vulnerability")).size() == 2)))); + trace(span() + .operationName("servlet.request") + .root() + // plain matcher: the entry is present (any nested value) + .metaStruct("http.request.body", isNonNull()) + // predicate via validates(): navigate the nested structure + .metaStruct( + "_dd.stack", + validates(v -> ((List) ((Map) v).get("vulnerability")).size() == 2)))); } @Test @@ -188,18 +183,14 @@ void metaStructMismatchFails() { // Present entry but the predicate over its nested value is not satisfied. assertThrows( AssertionError.class, - () -> - assertTraces( - traces, - trace( - span() - .root() - .metaStruct( - "_dd.stack", - validates( - v -> - ((List) ((Map) v).get("vulnerability")).size() - == 99))))); + () -> assertTraces( + traces, + trace(span() + .root() + .metaStruct( + "_dd.stack", + validates(v -> + ((List) ((Map) v).get("vulnerability")).size() == 99))))); } @Test @@ -210,12 +201,11 @@ void ignoreAdditionalConsumesMatchedTrace() { List traces = Decoder.decodeJson(TWO_TRACES).getTraces(); assertThrows( AssertionError.class, - () -> - assertTraces( - traces, - IGNORE_ADDITIONAL_TRACES, - trace(span().operationName("root-a").root()), - trace(span().operationName("root-a").root()))); + () -> assertTraces( + traces, + IGNORE_ADDITIONAL_TRACES, + trace(span().operationName("root-a").root()), + trace(span().operationName("root-a").root()))); } @Test @@ -226,7 +216,8 @@ void childOfPreviousDoesNotLeakAcrossCandidates() { // the matcher must not carry the first candidate's ids over to the next. String broken = "[" + spanJson("root", 10, 0, 10) + "," + spanJson("child", 11, 999, 20) + "]"; String valid = "[" + spanJson("root", 20, 0, 10) + "," + spanJson("child", 21, 20, 20) + "]"; - List traces = Decoder.decodeJson("[" + broken + "," + valid + "]").getTraces(); + List traces = + Decoder.decodeJson("[" + broken + "," + valid + "]").getTraces(); assertTraces( traces, options -> options.unorder().ignoreAdditionalTraces(), @@ -252,8 +243,10 @@ void defaultConstraintsRequireDefinedServiceNoTypeAndNoError() { assertTraces(errored, trace(span().root().error(true))); // An undefined (empty) service fails the default. - List noService = Decoder.decodeJson(spanTraceJson("", null, 0)).getTraces(); - assertThrows(AssertionError.class, () -> assertTraces(noService, trace(span().root()))); + List noService = + Decoder.decodeJson(spanTraceJson("", null, 0)).getTraces(); + assertThrows( + AssertionError.class, () -> assertTraces(noService, trace(span().root()))); } /** A single-span trace with a configurable service, span type (nullable), and error flag. */ @@ -298,14 +291,13 @@ void wrongLinkOrderFails() { List traces = Decoder.decodeJson(linkedTraceJson(20, 30)).getTraces(); assertThrows( AssertionError.class, - () -> - assertTraces( - traces, - trace( - span().operationName("root").root(), - span().operationName("shard-a").childOfIndex(0), - span().operationName("shard-b").childOfIndex(0), - span().operationName("merge").childOfIndex(0).links(toIndex(2), toIndex(1)))), + () -> assertTraces( + traces, + trace( + span().operationName("root").root(), + span().operationName("shard-a").childOfIndex(0), + span().operationName("shard-b").childOfIndex(0), + span().operationName("merge").childOfIndex(0).links(toIndex(2), toIndex(1)))), "links are matched positionally"); } @@ -320,9 +312,8 @@ void wrongLinkCountFails() { "too few matchers"); assertThrows( AssertionError.class, - () -> - assertTraces( - traces, trace(span().operationName("merge").root().links(any(), any(), any()))), + () -> assertTraces( + traces, trace(span().operationName("merge").root().links(any(), any(), any()))), "too many matchers"); } @@ -346,35 +337,29 @@ void matchesLinkFlagsStateAndAttributes() { List traces = Decoder.decodeJson(refinedLinkTraceJson()).getTraces(); assertTraces( traces, - trace( - span() - .operationName("merge") - .root() - .links( - to(99L, 99L) - .traceFlags((byte) 1) - .traceState("dd=s:1") - .attributes(singletonMap("link.kind", "span-pointer"))))); + trace(span() + .operationName("merge") + .root() + .links(to(99L, 99L) + .traceFlags((byte) 1) + .traceState("dd=s:1") + .attributes(singletonMap("link.kind", "span-pointer"))))); assertThrows( AssertionError.class, - () -> - assertTraces( - traces, - trace( - span().operationName("merge").root().links(to(99L, 99L).traceFlags((byte) 0)))), + () -> assertTraces( + traces, + trace(span().operationName("merge").root().links(to(99L, 99L).traceFlags((byte) 0)))), "wrong trace flags"); // The matcher form covers a value that depends on whether the target had been sampled. assertTraces( traces, - trace( - span() - .operationName("merge") - .root() - .links( - to(99L, 99L) - .traceFlags(isNonNull()) - .traceState(isNonNull()) - .attributes(isNonNull())))); + trace(span() + .operationName("merge") + .root() + .links(to(99L, 99L) + .traceFlags(isNonNull()) + .traceState(isNonNull()) + .attributes(isNonNull())))); } @Test @@ -384,10 +369,8 @@ void anyLinkIgnoresFlagsStateAndAttributes() { // A constraint applied on top of any() is still asserted. assertThrows( AssertionError.class, - () -> - assertTraces( - traces, - trace(span().operationName("merge").root().links(any().traceFlags((byte) 0)))), + () -> assertTraces( + traces, trace(span().operationName("merge").root().links(any().traceFlags((byte) 0)))), "wrong trace flags"); } @@ -402,7 +385,8 @@ void linkTargetsDoNotLeakAcrossCandidates() { // ids. The valid trace that follows uses different ids and must still match. String broken = "[" + spanJson("root", 10, 0, 10) + "," + linkingSpanJson(11, 10, 777) + "]"; String valid = "[" + spanJson("root", 40, 0, 10) + "," + linkingSpanJson(41, 40, 40) + "]"; - List traces = Decoder.decodeJson("[" + broken + "," + valid + "]").getTraces(); + List traces = + Decoder.decodeJson("[" + broken + "," + valid + "]").getTraces(); assertTraces( traces, options -> options.unorder().ignoreAdditionalTraces(), diff --git a/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/smoketest/vertx_3_4/IastHandler.java b/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/smoketest/vertx_3_4/IastHandler.java index 51f7696bae0..bbbb28d95e8 100644 --- a/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/smoketest/vertx_3_4/IastHandler.java +++ b/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/smoketest/vertx_3_4/IastHandler.java @@ -140,32 +140,23 @@ public void handle(final RoutingContext rc) { @Override public void init(final Vertx vertx) { - vertx - .eventBus() - .consumer( - name(), - message -> { - final JsonObject payload = (JsonObject) message.body(); - final String response = payload.getString("name").toUpperCase(); - message.reply(response); - }); + vertx.eventBus().consumer(name(), message -> { + final JsonObject payload = (JsonObject) message.body(); + final String response = payload.getString("name").toUpperCase(); + message.reply(response); + }); } @Override public void handle(final RoutingContext rc) { final JsonObject target = rc.getBodyAsJson(); - rc.vertx() - .eventBus() - .send( - name(), - target, - reply -> { - if (reply.succeeded()) { - rc.response().end("Received " + reply.result().body()); - } else { - rc.fail(reply.cause()); - } - }); + rc.vertx().eventBus().send(name(), target, reply -> { + if (reply.succeeded()) { + rc.response().end("Received " + reply.result().body()); + } else { + rc.fail(reply.cause()); + } + }); } }; diff --git a/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/IastVerticle.java b/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/IastVerticle.java index 4edfa41a5d0..8bcaa120caa 100644 --- a/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/IastVerticle.java +++ b/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/IastVerticle.java @@ -14,11 +14,10 @@ public class IastVerticle extends AbstractVerticle { public static void main(String[] args) { - final VertxOptions options = - new VertxOptions() - .setEventLoopPoolSize(1) - .setWorkerPoolSize(2) - .setInternalBlockingPoolSize(1); + final VertxOptions options = new VertxOptions() + .setEventLoopPoolSize(1) + .setWorkerPoolSize(2) + .setInternalBlockingPoolSize(1); final Vertx vertx = Vertx.vertx(options); vertx.deployVerticle(new IastVerticle()); } @@ -28,24 +27,20 @@ public void start(final Future startPromise) { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); router.route().handler(CookieHandler.create()); - Arrays.stream(IastHandler.values()) - .forEach( - handler -> { - handler.init(vertx); - router.route(handler.path).handler(handler); - }); + Arrays.stream(IastHandler.values()).forEach(handler -> { + handler.init(vertx); + router.route(handler.path).handler(handler); + }); vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) .requestHandler(router::accept) - .listen( - Integer.getInteger("vertx.http.port", 8080), - http -> { - if (http.succeeded()) { - startPromise.complete(); - System.out.println("HTTP server started"); - } else { - startPromise.fail(http.cause()); - } - }); + .listen(Integer.getInteger("vertx.http.port", 8080), http -> { + if (http.succeeded()) { + startPromise.complete(); + System.out.println("HTTP server started"); + } else { + startPromise.fail(http.cause()); + } + }); } } diff --git a/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/MainVerticle.java b/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/MainVerticle.java index 3b0b4d04761..9685e7461ce 100644 --- a/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/MainVerticle.java +++ b/dd-smoke-tests/vertx-3.4/application/src/main/java/datadog/vertx_3_4/MainVerticle.java @@ -36,41 +36,34 @@ public void start(Future startPromise) throws Exception { Router router = Router.router(vertx); router .route("/routes") - .handler( - ctx -> - ctx.response() - .setStatusCode(200) - .putHeader("content-type", "text/plain") - .end(randomFactorial().toString())); + .handler(ctx -> ctx.response() + .setStatusCode(200) + .putHeader("content-type", "text/plain") + .end(randomFactorial().toString())); router .route("/api_security/sampling/:status_code") - .handler( - ctx -> - ctx.response() - .setStatusCode(Integer.parseInt(ctx.request().getParam("status_code"))) - .end("EXECUTED")); + .handler(ctx -> ctx.response() + .setStatusCode(Integer.parseInt(ctx.request().getParam("status_code"))) + .end("EXECUTED")); vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) - .requestHandler( - req -> { - if (req.path().startsWith("/routes") || req.path().startsWith("/api_security")) { - router.accept(req); - } else { - req.response() - .putHeader("content-type", "text/plain") - .end(randomFactorial().toString()); - } - }) - .listen( - Integer.getInteger("vertx.http.port", 8080), - http -> { - if (http.succeeded()) { - startPromise.complete(); - System.out.println("HTTP server started"); - } else { - startPromise.fail(http.cause()); - } - }); + .requestHandler(req -> { + if (req.path().startsWith("/routes") || req.path().startsWith("/api_security")) { + router.accept(req); + } else { + req.response() + .putHeader("content-type", "text/plain") + .end(randomFactorial().toString()); + } + }) + .listen(Integer.getInteger("vertx.http.port", 8080), http -> { + if (http.succeeded()) { + startPromise.complete(); + System.out.println("HTTP server started"); + } else { + startPromise.fail(http.cause()); + } + }); } } diff --git a/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/smoketest/vertx_3_9/IastHandler.java b/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/smoketest/vertx_3_9/IastHandler.java index afd0bca7075..409b9bf6d6c 100644 --- a/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/smoketest/vertx_3_9/IastHandler.java +++ b/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/smoketest/vertx_3_9/IastHandler.java @@ -146,32 +146,23 @@ public void handle(final RoutingContext rc) { EVENT_BUS("/eventBus") { @Override public void init(final Vertx vertx) { - vertx - .eventBus() - .consumer( - name(), - message -> { - final JsonObject payload = (JsonObject) message.body(); - final String response = payload.getString("name").toUpperCase(); - message.reply(response); - }); + vertx.eventBus().consumer(name(), message -> { + final JsonObject payload = (JsonObject) message.body(); + final String response = payload.getString("name").toUpperCase(); + message.reply(response); + }); } @Override public void handle(final RoutingContext rc) { final JsonObject target = rc.getBodyAsJson(); - rc.vertx() - .eventBus() - .request( - name(), - target, - reply -> { - if (reply.succeeded()) { - rc.response().end("Received " + reply.result().body()); - } else { - rc.fail(reply.cause()); - } - }); + rc.vertx().eventBus().request(name(), target, reply -> { + if (reply.succeeded()) { + rc.response().end("Received " + reply.result().body()); + } else { + rc.fail(reply.cause()); + } + }); } }; diff --git a/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/IastVerticle.java b/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/IastVerticle.java index 2942c43e07d..ed7143d88d6 100644 --- a/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/IastVerticle.java +++ b/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/IastVerticle.java @@ -13,11 +13,10 @@ public class IastVerticle extends AbstractVerticle { public static void main(String[] args) { - final VertxOptions options = - new VertxOptions() - .setEventLoopPoolSize(1) - .setWorkerPoolSize(2) - .setInternalBlockingPoolSize(1); + final VertxOptions options = new VertxOptions() + .setEventLoopPoolSize(1) + .setWorkerPoolSize(2) + .setInternalBlockingPoolSize(1); final Vertx vertx = Vertx.vertx(options); vertx.deployVerticle(new IastVerticle()); } @@ -26,24 +25,20 @@ public static void main(String[] args) { public void start(final Promise startPromise) { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - Arrays.stream(IastHandler.values()) - .forEach( - handler -> { - handler.init(vertx); - router.route(handler.path).handler(handler); - }); + Arrays.stream(IastHandler.values()).forEach(handler -> { + handler.init(vertx); + router.route(handler.path).handler(handler); + }); vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) .requestHandler(router) - .listen( - Integer.getInteger("vertx.http.port", 8080), - http -> { - if (http.succeeded()) { - startPromise.complete(); - System.out.println("HTTP server started"); - } else { - startPromise.fail(http.cause()); - } - }); + .listen(Integer.getInteger("vertx.http.port", 8080), http -> { + if (http.succeeded()) { + startPromise.complete(); + System.out.println("HTTP server started"); + } else { + startPromise.fail(http.cause()); + } + }); } } diff --git a/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/MainVerticle.java b/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/MainVerticle.java index fcc3ca02653..2294a67e31f 100644 --- a/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/MainVerticle.java +++ b/dd-smoke-tests/vertx-3.9/application/src/main/java/datadog/vertx_3_9/MainVerticle.java @@ -36,34 +36,29 @@ public void start(Promise startPromise) throws Exception { Router router = Router.router(vertx); router .route("/routes") - .handler( - ctx -> - ctx.response() - .setStatusCode(200) - .putHeader("content-type", "text/plain") - .end(randomFactorial().toString())); + .handler(ctx -> ctx.response() + .setStatusCode(200) + .putHeader("content-type", "text/plain") + .end(randomFactorial().toString())); vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) - .requestHandler( - req -> { - if (req.path().startsWith("/routes")) { - router.handle(req); - } else { - req.response() - .putHeader("content-type", "text/plain") - .end(randomFactorial().toString()); - } - }) - .listen( - Integer.getInteger("vertx.http.port", 8080), - http -> { - if (http.succeeded()) { - startPromise.complete(); - System.out.println("HTTP server started"); - } else { - startPromise.fail(http.cause()); - } - }); + .requestHandler(req -> { + if (req.path().startsWith("/routes")) { + router.handle(req); + } else { + req.response() + .putHeader("content-type", "text/plain") + .end(randomFactorial().toString()); + } + }) + .listen(Integer.getInteger("vertx.http.port", 8080), http -> { + if (http.succeeded()) { + startPromise.complete(); + System.out.println("HTTP server started"); + } else { + startPromise.fail(http.cause()); + } + }); } } diff --git a/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/smoketest/vertx_4_2/IastHandler.java b/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/smoketest/vertx_4_2/IastHandler.java index 13ef2a064ea..727c4374eb6 100644 --- a/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/smoketest/vertx_4_2/IastHandler.java +++ b/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/smoketest/vertx_4_2/IastHandler.java @@ -155,44 +155,33 @@ public void handle(final RoutingContext rc) { @Override public void handle(final RoutingContext rc) { final String path = rc.request().getParam("path"); - rc.redirect( - path, - new Handler>() { - public void handle(AsyncResult ar) { - // Nothing to do - } - }); + rc.redirect(path, new Handler>() { + public void handle(AsyncResult ar) { + // Nothing to do + } + }); } }, EVENT_BUS("/eventBus") { @Override public void init(final Vertx vertx) { - vertx - .eventBus() - .consumer( - name(), - message -> { - final JsonObject payload = (JsonObject) message.body(); - final String response = payload.getString("name").toUpperCase(); - message.reply(response); - }); + vertx.eventBus().consumer(name(), message -> { + final JsonObject payload = (JsonObject) message.body(); + final String response = payload.getString("name").toUpperCase(); + message.reply(response); + }); } @Override public void handle(final RoutingContext rc) { final JsonObject target = rc.getBodyAsJson(); - rc.vertx() - .eventBus() - .request( - name(), - target, - reply -> { - if (reply.succeeded()) { - rc.response().end("Received " + reply.result().body()); - } else { - rc.fail(reply.cause()); - } - }); + rc.vertx().eventBus().request(name(), target, reply -> { + if (reply.succeeded()) { + rc.response().end("Received " + reply.result().body()); + } else { + rc.fail(reply.cause()); + } + }); } }; diff --git a/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/IastVerticle.java b/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/IastVerticle.java index 1527bd08f67..e885416fe67 100644 --- a/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/IastVerticle.java +++ b/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/IastVerticle.java @@ -13,11 +13,10 @@ public class IastVerticle extends AbstractVerticle { public static void main(String[] args) { - final VertxOptions options = - new VertxOptions() - .setEventLoopPoolSize(1) - .setWorkerPoolSize(2) - .setInternalBlockingPoolSize(1); + final VertxOptions options = new VertxOptions() + .setEventLoopPoolSize(1) + .setWorkerPoolSize(2) + .setInternalBlockingPoolSize(1); final Vertx vertx = Vertx.vertx(options); vertx.deployVerticle(new IastVerticle()); } @@ -26,24 +25,20 @@ public static void main(String[] args) { public void start(final Promise startPromise) { final Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); - Arrays.stream(IastHandler.values()) - .forEach( - handler -> { - handler.init(vertx); - router.route(handler.path).handler(handler); - }); + Arrays.stream(IastHandler.values()).forEach(handler -> { + handler.init(vertx); + router.route(handler.path).handler(handler); + }); vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) .requestHandler(router) - .listen( - Integer.getInteger("vertx.http.port", 8080), - http -> { - if (http.succeeded()) { - startPromise.complete(); - System.out.println("HTTP server started"); - } else { - startPromise.fail(http.cause()); - } - }); + .listen(Integer.getInteger("vertx.http.port", 8080), http -> { + if (http.succeeded()) { + startPromise.complete(); + System.out.println("HTTP server started"); + } else { + startPromise.fail(http.cause()); + } + }); } } diff --git a/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/MainVerticle.java b/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/MainVerticle.java index 391a743f08f..77ce9719630 100644 --- a/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/MainVerticle.java +++ b/dd-smoke-tests/vertx-4.2/application/src/main/java/datadog/vertx_4_2/MainVerticle.java @@ -37,51 +37,41 @@ public void start(Promise startPromise) throws Exception { Router router = Router.router(vertx); router .route("/routes") - .handler( - ctx -> - ctx.response() - .setStatusCode(200) - .putHeader("content-type", "text/plain") - .end(randomFactorial().toString())); + .handler(ctx -> ctx.response() + .setStatusCode(200) + .putHeader("content-type", "text/plain") + .end(randomFactorial().toString())); router .route("/api_security/sampling/:status_code") - .handler( - ctx -> - ctx.response() - .setStatusCode(Integer.parseInt(ctx.request().getParam("status_code"))) - .end("EXECUTED")); + .handler(ctx -> ctx.response() + .setStatusCode(Integer.parseInt(ctx.request().getParam("status_code"))) + .end("EXECUTED")); router.route("/api_security/response").handler(BodyHandler.create()); - router - .route("/api_security/response") - .handler( - ctx -> { - ctx.response().setStatusCode(200); - ctx.json(ctx.getBodyAsJson()); - }); + router.route("/api_security/response").handler(ctx -> { + ctx.response().setStatusCode(200); + ctx.json(ctx.getBodyAsJson()); + }); vertx .createHttpServer(new HttpServerOptions().setHandle100ContinueAutomatically(true)) - .requestHandler( - req -> { - if (req.path().startsWith("/routes") || req.path().startsWith("/api_security")) { - router.handle(req); - } else { - req.response() - .putHeader("content-type", "text/plain") - .end(randomFactorial().toString()); - } - }) - .listen( - Integer.getInteger("vertx.http.port", 8080), - http -> { - if (http.succeeded()) { - startPromise.complete(); - System.out.println("HTTP server started"); - } else { - startPromise.fail(http.cause()); - } - }); + .requestHandler(req -> { + if (req.path().startsWith("/routes") || req.path().startsWith("/api_security")) { + router.handle(req); + } else { + req.response() + .putHeader("content-type", "text/plain") + .end(randomFactorial().toString()); + } + }) + .listen(Integer.getInteger("vertx.http.port", 8080), http -> { + if (http.succeeded()) { + startPromise.complete(); + System.out.println("HTTP server started"); + } else { + startPromise.fail(http.cause()); + } + }); } } diff --git a/dd-smoke-tests/wildfly/spring-ear/war/src/main/java/com/example/hello/HelloController.java b/dd-smoke-tests/wildfly/spring-ear/war/src/main/java/com/example/hello/HelloController.java index e10f9a39982..2b0f7b5ce31 100644 --- a/dd-smoke-tests/wildfly/spring-ear/war/src/main/java/com/example/hello/HelloController.java +++ b/dd-smoke-tests/wildfly/spring-ear/war/src/main/java/com/example/hello/HelloController.java @@ -18,18 +18,17 @@ public String hello() { @RequestMapping("/enableScheduling") public CompletableFuture> enableScheduling() { TRACE_REQUEST_PENDING.set(true); - return CompletableFuture.supplyAsync( - () -> { - // Wait until the scheduled task picks up the request. - while (TRACE_REQUEST_PENDING.get()) { - try { - Thread.sleep(200); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - break; - } - } - return ResponseEntity.ok().build(); - }); + return CompletableFuture.supplyAsync(() -> { + // Wait until the scheduled task picks up the request. + while (TRACE_REQUEST_PENDING.get()) { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + return ResponseEntity.ok().build(); + }); } } diff --git a/dd-trace-api/src/main/java/datadog/appsec/api/blocking/Blocking.java b/dd-trace-api/src/main/java/datadog/appsec/api/blocking/Blocking.java index c902ce83582..e89abfbef2b 100644 --- a/dd-trace-api/src/main/java/datadog/appsec/api/blocking/Blocking.java +++ b/dd-trace-api/src/main/java/datadog/appsec/api/blocking/Blocking.java @@ -70,9 +70,8 @@ public static boolean tryCommitBlockingResponse( */ public static boolean tryCommitBlockingResponse(int statusCode, BlockingContentType contentType) { try { - boolean committedBlockingResponse = - SERVICE.tryCommitBlockingResponse( - statusCode, BlockingContentType.NONE, Collections.emptyMap()); + boolean committedBlockingResponse = SERVICE.tryCommitBlockingResponse( + statusCode, BlockingContentType.NONE, Collections.emptyMap()); return committedBlockingResponse; } catch (Exception e) { return false; diff --git a/dd-trace-api/src/main/java/datadog/appsec/api/login/EventTrackerService.java b/dd-trace-api/src/main/java/datadog/appsec/api/login/EventTrackerService.java index 25a2f376bd4..1e9c41c136b 100644 --- a/dd-trace-api/src/main/java/datadog/appsec/api/login/EventTrackerService.java +++ b/dd-trace-api/src/main/java/datadog/appsec/api/login/EventTrackerService.java @@ -4,19 +4,18 @@ public interface EventTrackerService { - EventTrackerService NO_OP = - new EventTrackerService() { - @Override - public void trackUserLoginSuccess( - final String login, final String userId, final Map metadata) {} - - @Override - public void trackUserLoginFailure( - final String login, final boolean exists, final Map metadata) {} - - @Override - public void trackCustomEvent(final String eventName, final Map metadata) {} - }; + EventTrackerService NO_OP = new EventTrackerService() { + @Override + public void trackUserLoginSuccess( + final String login, final String userId, final Map metadata) {} + + @Override + public void trackUserLoginFailure( + final String login, final boolean exists, final Map metadata) {} + + @Override + public void trackCustomEvent(final String eventName, final Map metadata) {} + }; void trackUserLoginSuccess(String login, String userId, Map metadata); diff --git a/dd-trace-api/src/main/java/datadog/appsec/api/user/UserService.java b/dd-trace-api/src/main/java/datadog/appsec/api/user/UserService.java index da95a76bc34..63e7d3fa72e 100644 --- a/dd-trace-api/src/main/java/datadog/appsec/api/user/UserService.java +++ b/dd-trace-api/src/main/java/datadog/appsec/api/user/UserService.java @@ -4,11 +4,10 @@ public interface UserService { - UserService NO_OP = - new UserService() { - @Override - public void trackUserEvent(final String userId, final Map metadata) {} - }; + UserService NO_OP = new UserService() { + @Override + public void trackUserEvent(final String userId, final Map metadata) {} + }; void trackUserEvent(String userId, Map metadata); } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java index eb4cd99ae44..d00e5057abf 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java @@ -303,13 +303,11 @@ public final class ConfigDefaults { static final boolean DEFAULT_SSI_INJECTION_FORCE = false; static final String DEFAULT_INSTRUMENTATION_SOURCE = "manual"; - static final Set DEFAULT_TRACE_EXPERIMENTAL_FEATURES_ENABLED = - new HashSet<>( - asList( - "DD_TAGS", - "DD_LOGS_INJECTION", - "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", - "DD_TRACE_STATS_ADDITIONAL_TAGS")); + static final Set DEFAULT_TRACE_EXPERIMENTAL_FEATURES_ENABLED = new HashSet<>(asList( + "DD_TAGS", + "DD_LOGS_INJECTION", + "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", + "DD_TRACE_STATS_ADDITIONAL_TAGS")); static final boolean DEFAULT_TRACE_128_BIT_TRACEID_GENERATION_ENABLED = true; static final boolean DEFAULT_TRACE_128_BIT_TRACEID_LOGGING_ENABLED = true; @@ -342,76 +340,65 @@ public final class ConfigDefaults { static final boolean DEFAULT_WEBSOCKET_TAG_SESSION_ID = false; static final Set DEFAULT_TRACE_CLOUD_PAYLOAD_TAGGING_SERVICES = - new HashSet<>( - Arrays.asList( - "ApiGateway", - "ApiGatewayV2", - "EventBridge", - "Sqs", - "Sns", - "S3", - "Kinesis", - "DynamoDB")); + new HashSet<>(Arrays.asList( + "ApiGateway", "ApiGatewayV2", "EventBridge", "Sqs", "Sns", "S3", "Kinesis", "DynamoDB")); public static final String DEFAULT_TRACE_CLOUD_PAYLOAD_REQUEST_TAG = "aws.request.body"; public static final String DEFAULT_TRACE_CLOUD_PAYLOAD_RESPONSE_TAG = "aws.response.body"; - public static final List DEFAULT_CLOUD_COMMON_PAYLOAD_TAGGING = - asList( - // Sns - "$.Attributes.KmsMasterKeyId", - "$.Attributes.Token", - // EventBridge (RedactionRulesExtractor.java for eventbridge-2015-10-07) - "$.AuthParameters.OAuthParameters.OAuthHttpParameters.HeaderParameters[*].Value", - "$.AuthParameters.OAuthParameters.OAuthHttpParameters.QueryStringParameters[*].Value", - "$.AuthParameters.OAuthParameters.OAuthHttpParameters.BodyParameters[*].Value", - "$.AuthParameters.InvocationHttpParameters.HeaderParameters[*].Value", - "$.AuthParameters.InvocationHttpParameters.QueryStringParameters[*].Value", - "$.AuthParameters.InvocationHttpParameters.BodyParameters[*].Value", - "$.Targets[*].RedshiftDataParameters.Sql", - "$.Targets[*].RedshiftDataParameters.Sqls", - "$.Targets[*].AppSyncParameters.GraphQLOperation", - // S3 (RedactionRulesExtractor.java for s3-2006-03-01) - "$.SSEKMSKeyId", - "$.SSEKMSEncryptionContext", - "$.ServerSideEncryptionConfiguration.Rules[*].ApplyServerSideEncryptionByDefault.KMSMasterKeyID", - "$.InventoryConfiguration.Destination.S3BucketDestination.Encryption.SSEKMS.KeyId"); - - public static final List DEFAULT_CLOUD_REQUEST_PAYLOAD_TAGGING = - asList( - // Sns - "$.Attributes.PlatformCredential", - "$.Attributes.PlatformPrincipal", - "$.AWSAccountId", - "$.Endpoint", - "$.Token", - "$.OneTimePassword", - // Sns (RedactionRulesExtractor.java for sns-2010-03-31) - "$.phoneNumber", - "$.PhoneNumber", - // EventBridge (RedactionRulesExtractor.java for eventbridge-2015-10-07) - "$.AuthParameters.BasicAuthParameters.Password", - "$.AuthParameters.OAuthParameters.ClientParameters.ClientSecret", - "$.AuthParameters.ApiKeyAuthParameters.ApiKeyValue", - // S3 (RedactionRulesExtractor.java for s3-2006-03-01) - "$.SSECustomerKey", - "$.CopySourceSSECustomerKey", - "$.RestoreRequest.OutputLocation.S3.Encryption.KMSKeyId"); - - public static final List DEFAULT_CLOUD_RESPONSE_PAYLOAD_TAGGING = - asList( - // Sns - "$.Endpoints.*.Token", - "$.PlatformApplication.*.PlatformCredential", - "$.PlatformApplication.*.PlatformPrincipal", - "$.Subscriptions.*.Endpoint", - // Sns (Generated by RedactionRulesExtractor.java for sns-2010-03-31) - "$.PhoneNumbers[*].PhoneNumber", - "$.phoneNumbers[*]", - // S3 (RedactionRulesExtractor.java for s3-2006-03-01) - "$.Credentials.SecretAccessKey", - "$.Credentials.SessionToken", - "$.InventoryConfigurationList[*].Destination.S3BucketDestination.Encryption.SSEKMS.KeyId"); + public static final List DEFAULT_CLOUD_COMMON_PAYLOAD_TAGGING = asList( + // Sns + "$.Attributes.KmsMasterKeyId", + "$.Attributes.Token", + // EventBridge (RedactionRulesExtractor.java for eventbridge-2015-10-07) + "$.AuthParameters.OAuthParameters.OAuthHttpParameters.HeaderParameters[*].Value", + "$.AuthParameters.OAuthParameters.OAuthHttpParameters.QueryStringParameters[*].Value", + "$.AuthParameters.OAuthParameters.OAuthHttpParameters.BodyParameters[*].Value", + "$.AuthParameters.InvocationHttpParameters.HeaderParameters[*].Value", + "$.AuthParameters.InvocationHttpParameters.QueryStringParameters[*].Value", + "$.AuthParameters.InvocationHttpParameters.BodyParameters[*].Value", + "$.Targets[*].RedshiftDataParameters.Sql", + "$.Targets[*].RedshiftDataParameters.Sqls", + "$.Targets[*].AppSyncParameters.GraphQLOperation", + // S3 (RedactionRulesExtractor.java for s3-2006-03-01) + "$.SSEKMSKeyId", + "$.SSEKMSEncryptionContext", + "$.ServerSideEncryptionConfiguration.Rules[*].ApplyServerSideEncryptionByDefault.KMSMasterKeyID", + "$.InventoryConfiguration.Destination.S3BucketDestination.Encryption.SSEKMS.KeyId"); + + public static final List DEFAULT_CLOUD_REQUEST_PAYLOAD_TAGGING = asList( + // Sns + "$.Attributes.PlatformCredential", + "$.Attributes.PlatformPrincipal", + "$.AWSAccountId", + "$.Endpoint", + "$.Token", + "$.OneTimePassword", + // Sns (RedactionRulesExtractor.java for sns-2010-03-31) + "$.phoneNumber", + "$.PhoneNumber", + // EventBridge (RedactionRulesExtractor.java for eventbridge-2015-10-07) + "$.AuthParameters.BasicAuthParameters.Password", + "$.AuthParameters.OAuthParameters.ClientParameters.ClientSecret", + "$.AuthParameters.ApiKeyAuthParameters.ApiKeyValue", + // S3 (RedactionRulesExtractor.java for s3-2006-03-01) + "$.SSECustomerKey", + "$.CopySourceSSECustomerKey", + "$.RestoreRequest.OutputLocation.S3.Encryption.KMSKeyId"); + + public static final List DEFAULT_CLOUD_RESPONSE_PAYLOAD_TAGGING = asList( + // Sns + "$.Endpoints.*.Token", + "$.PlatformApplication.*.PlatformCredential", + "$.PlatformApplication.*.PlatformPrincipal", + "$.Subscriptions.*.Endpoint", + // Sns (Generated by RedactionRulesExtractor.java for sns-2010-03-31) + "$.PhoneNumbers[*].PhoneNumber", + "$.phoneNumbers[*]", + // S3 (RedactionRulesExtractor.java for s3-2006-03-01) + "$.Credentials.SecretAccessKey", + "$.Credentials.SessionToken", + "$.InventoryConfigurationList[*].Destination.S3BucketDestination.Encryption.SSEKMS.KeyId"); private ConfigDefaults() {} } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/DD128bTraceId.java b/dd-trace-api/src/main/java/datadog/trace/api/DD128bTraceId.java index a08073659c0..7f24603817b 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/DD128bTraceId.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/DD128bTraceId.java @@ -161,11 +161,10 @@ public boolean equals(Object o) { @Override public int hashCode() { - return (int) - (this.highOrderBits - ^ (this.highOrderBits >>> 32) - ^ this.lowOrderBits - ^ (this.lowOrderBits >>> 32)); + return (int) (this.highOrderBits + ^ (this.highOrderBits >>> 32) + ^ this.lowOrderBits + ^ (this.lowOrderBits >>> 32)); } @Override diff --git a/dd-trace-api/src/main/java/datadog/trace/api/DDSpanTypes.java b/dd-trace-api/src/main/java/datadog/trace/api/DDSpanTypes.java index 4e41df93738..b2554540439 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/DDSpanTypes.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/DDSpanTypes.java @@ -3,7 +3,10 @@ public class DDSpanTypes { public static final String HTTP_CLIENT = "http"; public static final String HTTP_SERVER = "web"; - @Deprecated public static final String WEB_SERVLET = HTTP_SERVER; + + @Deprecated + public static final String WEB_SERVLET = HTTP_SERVER; + public static final String RPC = "rpc"; public static final String CACHE = "cache"; public static final String SOAP = "soap"; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java index b7ca19232c6..d369e9caba4 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java @@ -16,15 +16,14 @@ public class DDTags { public static final String DD_CODE_ORIGIN_FRAME_SNAPSHOT_ID = DD_CODE_ORIGIN_PREFIX + "frames.0.snapshot_id"; - public static final String[] REQUIRED_CODE_ORIGIN_TAGS = - new String[] { - DD_CODE_ORIGIN_TYPE, - DD_CODE_ORIGIN_FRAME_FILE, - DD_CODE_ORIGIN_FRAME_METHOD, - DD_CODE_ORIGIN_FRAME_LINE, - DD_CODE_ORIGIN_FRAME_TYPE, - DD_CODE_ORIGIN_FRAME_SIGNATURE, - }; + public static final String[] REQUIRED_CODE_ORIGIN_TAGS = new String[] { + DD_CODE_ORIGIN_TYPE, + DD_CODE_ORIGIN_FRAME_FILE, + DD_CODE_ORIGIN_FRAME_METHOD, + DD_CODE_ORIGIN_FRAME_LINE, + DD_CODE_ORIGIN_FRAME_TYPE, + DD_CODE_ORIGIN_FRAME_SIGNATURE, + }; public static final String SPAN_TYPE = "span.type"; public static final String SERVICE_NAME = "service.name"; @@ -44,7 +43,9 @@ public class DDTags { public static final String ERROR_STACK = "error.stack"; // human-readable version of the stack public static final String ANALYTICS_SAMPLE_RATE = "_dd1.sr.eausr"; - @Deprecated public static final String EVENT_SAMPLE_RATE = ANALYTICS_SAMPLE_RATE; + + @Deprecated + public static final String EVENT_SAMPLE_RATE = ANALYTICS_SAMPLE_RATE; /** Manually force tracer to keep the trace */ public static final String MANUAL_KEEP = "manual.keep"; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/DDTraceApiInfo.java b/dd-trace-api/src/main/java/datadog/trace/api/DDTraceApiInfo.java index 6aaeb6416ee..3488a74a5a6 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/DDTraceApiInfo.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/DDTraceApiInfo.java @@ -10,10 +10,8 @@ public class DDTraceApiInfo { static { String v; - try (final BufferedReader br = - new BufferedReader( - new InputStreamReader( - DDTraceApiInfo.class.getResourceAsStream("/dd-trace-api.version"), UTF_8))) { + try (final BufferedReader br = new BufferedReader(new InputStreamReader( + DDTraceApiInfo.class.getResourceAsStream("/dd-trace-api.version"), UTF_8))) { final StringBuilder sb = new StringBuilder(); for (int c = br.read(); c != -1; c = br.read()) { diff --git a/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java b/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java index b3f73c18fba..b33ae26d1c6 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java @@ -13,41 +13,40 @@ * to provide a global window to datadog-specific features. */ public class GlobalTracer { - private static final Tracer NO_OP = - new Tracer() { - @Override - public String getTraceId() { - return "0"; - } + private static final Tracer NO_OP = new Tracer() { + @Override + public String getTraceId() { + return "0"; + } - @Override - public String getSpanId() { - return "0"; - } + @Override + public String getSpanId() { + return "0"; + } - @Override - public boolean addTraceInterceptor(TraceInterceptor traceInterceptor) { - return false; - } + @Override + public boolean addTraceInterceptor(TraceInterceptor traceInterceptor) { + return false; + } - @Override - public TraceScope muteTracing() { - return NoopTraceScope.INSTANCE; - } + @Override + public TraceScope muteTracing() { + return NoopTraceScope.INSTANCE; + } - @Override - public TraceScope.Continuation captureActiveSpan() { - return NoopTraceScope.NoopContinuation.INSTANCE; - } + @Override + public TraceScope.Continuation captureActiveSpan() { + return NoopTraceScope.NoopContinuation.INSTANCE; + } - @Override - public boolean isAsyncPropagationEnabled() { - return false; - } + @Override + public boolean isAsyncPropagationEnabled() { + return false; + } - @Override - public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) {} - }; + @Override + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) {} + }; private static final Collection installationCallbacks = new ArrayList<>(); private static Tracer provider = NO_OP; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/aiguard/AIGuard.java b/dd-trace-api/src/main/java/datadog/trace/api/aiguard/AIGuard.java index f8111224ed7..cbfb37bf0e2 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/aiguard/AIGuard.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/aiguard/AIGuard.java @@ -309,8 +309,12 @@ public String toString() { } private final Type type; - @Nullable private final String text; - @Nullable private final ImageURL imageUrl; + + @Nullable + private final String text; + + @Nullable + private final ImageURL imageUrl; /** * Private constructor to enforce use of factory methods. @@ -420,8 +424,13 @@ public static ContentPart imageUrl(@Nonnull final String url) { public static class Message { private final String role; - @Nullable private final String content; - @Nullable private final List contentParts; + + @Nullable + private final String content; + + @Nullable + private final List contentParts; + private final List toolCalls; private final String toolCallId; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java index a32f997cebe..f0592944a9a 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java @@ -28,6 +28,7 @@ public final class GeneralConfig { public static final String PRIMARY_TAG = "primary.tag"; public static final String TRACE_TAGS = "trace.tags"; public static final String TAGS = "tags"; + @Deprecated // Use dd.tags instead public static final String GLOBAL_TAGS = "trace.global.tags"; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/JmxFetchConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/JmxFetchConfig.java index 6d2642f6db5..3fe4ffdf729 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/JmxFetchConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/JmxFetchConfig.java @@ -12,7 +12,10 @@ public final class JmxFetchConfig { public static final String JMX_FETCH_START_DELAY = "jmxfetch.start-delay"; public static final String JMX_FETCH_CONFIG_DIR = "jmxfetch.config.dir"; public static final String JMX_FETCH_CONFIG = "jmxfetch.config"; - @Deprecated public static final String JMX_FETCH_METRICS_CONFIGS = "jmxfetch.metrics-configs"; + + @Deprecated + public static final String JMX_FETCH_METRICS_CONFIGS = "jmxfetch.metrics-configs"; + public static final String JMX_FETCH_CHECK_PERIOD = "jmxfetch.check-period"; public static final String JMX_FETCH_INITIAL_REFRESH_BEANS_PERIOD = "jmxfetch.initial-refresh-beans-period"; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java index 37dc6c3c500..a1eabbbeba8 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/ProfilingConfig.java @@ -12,16 +12,22 @@ public final class ProfilingConfig { public static final String PROFILING_ALLOCATION_ENABLED = "profiling.allocation.enabled"; public static final String PROFILING_HEAP_ENABLED = "profiling.heap.enabled"; public static final boolean PROFILING_HEAP_ENABLED_DEFAULT = false; + @Deprecated // Use dd.site instead public static final String PROFILING_URL = "profiling.url"; + @Deprecated // Use dd.api-key instead public static final String PROFILING_API_KEY_OLD = "profiling.api-key"; + @Deprecated // Use dd.api-key-file instead public static final String PROFILING_API_KEY_FILE_OLD = "profiling.api-key-file"; + @Deprecated // Use dd.api-key instead public static final String PROFILING_API_KEY_VERY_OLD = "profiling.apikey"; + @Deprecated // Use dd.api-key-file instead public static final String PROFILING_API_KEY_FILE_VERY_OLD = "profiling.apikey.file"; + public static final String PROFILING_TAGS = "profiling.tags"; public static final String PROFILING_START_DELAY = "profiling.start-delay"; public static final int PROFILING_START_DELAY_DEFAULT = 10; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/RemoteConfigConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/RemoteConfigConfig.java index 578a556bf9e..c59d11ba906 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/RemoteConfigConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/RemoteConfigConfig.java @@ -2,7 +2,8 @@ public class RemoteConfigConfig { /** Replaced by {@link #REMOTE_CONFIGURATION_ENABLED} according the RFC. */ - @Deprecated public static final String REMOTE_CONFIG_ENABLED = "remote_config.enabled"; + @Deprecated + public static final String REMOTE_CONFIG_ENABLED = "remote_config.enabled"; public static final String REMOTE_CONFIGURATION_ENABLED = "remote_configuration.enabled"; public static final String REMOTE_CONFIG_INTEGRITY_CHECK_ENABLED = diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java index 860abb4c87b..a773764fcef 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/TracerConfig.java @@ -35,7 +35,10 @@ public final class TracerConfig { public static final String TEST_AGENT_SESSION_TOKEN = "test.agent.session.token"; public static final String PRIORITY_SAMPLING = "priority.sampling"; public static final String PRIORITY_SAMPLING_FORCE = "priority.sampling.force"; - @Deprecated public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled"; + + @Deprecated + public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled"; + public static final String SERVICE_MAPPING = "service.mapping"; public static final String TRACE_EXPERIMENTAL_FEATURES_ENABLED = @@ -74,10 +77,14 @@ public final class TracerConfig { public static final String TRACE_HTTP_CLIENT_PATH_RESOURCE_NAME_MAPPING = "trace.http.client.path-resource-name-mapping"; // Use TRACE_HTTP_SERVER_ERROR_STATUSES instead - @Deprecated public static final String HTTP_SERVER_ERROR_STATUSES = "http.server.error.statuses"; + @Deprecated + public static final String HTTP_SERVER_ERROR_STATUSES = "http.server.error.statuses"; + public static final String TRACE_HTTP_SERVER_ERROR_STATUSES = "trace.http.server.error.statuses"; // Use TRACE_HTTP_CLIENT_ERROR_STATUSES instead - @Deprecated public static final String HTTP_CLIENT_ERROR_STATUSES = "http.client.error.statuses"; + @Deprecated + public static final String HTTP_CLIENT_ERROR_STATUSES = "http.client.error.statuses"; + public static final String TRACE_HTTP_CLIENT_ERROR_STATUSES = "trace.http.client.error.statuses"; public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; diff --git a/dd-trace-api/src/main/java/datadog/trace/api/llmobs/LLMObs.java b/dd-trace-api/src/main/java/datadog/trace/api/llmobs/LLMObs.java index 2f9cfbcb619..6873eff08ab 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/llmobs/LLMObs.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/llmobs/LLMObs.java @@ -20,7 +20,10 @@ protected LLMObs() {} protected static LLMObsSpanFactory SPAN_FACTORY = NoOpLLMObsSpanFactory.INSTANCE; protected static LLMObsEvalProcessor EVAL_PROCESSOR = NoOpLLMObsEvalProcessor.INSTANCE; private static final Object SPAN_PROCESSOR_LOCK = new Object(); - @Nullable protected static volatile LLMObsSpanProcessor SPAN_PROCESSOR; + + @Nullable + protected static volatile LLMObsSpanProcessor SPAN_PROCESSOR; + protected static LLMObsFeedbackProcessor FEEDBACK_PROCESSOR = NoOpLLMObsFeedbackProcessor.INSTANCE; @@ -321,8 +324,11 @@ public String getWireKey() { /** Who submitted a feedback. */ public static class Submitter { - @Nullable private final String id; - @Nullable private final String type; + @Nullable + private final String id; + + @Nullable + private final String type; /** * Creates a submitter. An invalid id is not rejected here but by {@link Feedback#validate()}. @@ -370,18 +376,40 @@ public String getMessage() { } } - @Nullable private final TargetType targetType; - @Nullable private final String targetValue; - @Nullable private final String label; - @Nullable private final MetricType metricType; - @Nullable private final Object value; - @Nullable private final Submitter submitter; - @Nullable private final String mlApp; - @Nullable private final Assessment assessment; - @Nullable private final String reasoning; + @Nullable + private final TargetType targetType; + + @Nullable + private final String targetValue; + + @Nullable + private final String label; + + @Nullable + private final MetricType metricType; + + @Nullable + private final Object value; + + @Nullable + private final Submitter submitter; + + @Nullable + private final String mlApp; + + @Nullable + private final Assessment assessment; + + @Nullable + private final String reasoning; + private final long timestampMs; - @Nullable private final Map tags; - @Nullable private final ValidationError validationError; + + @Nullable + private final Map tags; + + @Nullable + private final ValidationError validationError; private Feedback(Builder builder, long timestampMs, @Nullable ValidationError validationError) { this.validationError = validationError; @@ -1209,14 +1237,12 @@ private AgentManifest(Builder builder) { this.name = builder.name; this.instructions = builder.instructions; this.model = builder.model; - this.modelSettings = - builder.modelSettings == null - ? null - : Collections.unmodifiableMap(new LinkedHashMap<>(builder.modelSettings)); - this.tools = - builder.tools == null - ? null - : Collections.unmodifiableList(new ArrayList<>(builder.tools)); + this.modelSettings = builder.modelSettings == null + ? null + : Collections.unmodifiableMap(new LinkedHashMap<>(builder.modelSettings)); + this.tools = builder.tools == null + ? null + : Collections.unmodifiableList(new ArrayList<>(builder.tools)); } @Nullable diff --git a/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdClinitDeadlockForkedTest.java b/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdClinitDeadlockForkedTest.java index 6878a5fb1fd..8f27b246cb1 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdClinitDeadlockForkedTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdClinitDeadlockForkedTest.java @@ -47,29 +47,27 @@ void traceIdClassPairInitializesConcurrentlyWithoutDeadlock() throws Exception { // One thread enters via the superclass (mirrors blackholeSpan() -> DDTraceId.ZERO), the other // via the subclass (mirrors IdGenerationStrategy.generateTraceId() -> DD64bTraceId.from()). - Thread viaSuper = - new Thread( - () -> { - try { - barrier.await(); - Class.forName("datadog.trace.api.DDTraceId", true, cl); - } catch (Throwable t) { - error.compareAndSet(null, t); - } - }, - "init-DDTraceId"); - Thread viaSub = - new Thread( - () -> { - try { - barrier.await(); - Class.forName("datadog.trace.api.IdGenerationStrategy", true, cl); - Class.forName("datadog.trace.api.DD64bTraceId", true, cl); - } catch (Throwable t) { - error.compareAndSet(null, t); - } - }, - "init-DD64bTraceId"); + Thread viaSuper = new Thread( + () -> { + try { + barrier.await(); + Class.forName("datadog.trace.api.DDTraceId", true, cl); + } catch (Throwable t) { + error.compareAndSet(null, t); + } + }, + "init-DDTraceId"); + Thread viaSub = new Thread( + () -> { + try { + barrier.await(); + Class.forName("datadog.trace.api.IdGenerationStrategy", true, cl); + Class.forName("datadog.trace.api.DD64bTraceId", true, cl); + } catch (Throwable t) { + error.compareAndSet(null, t); + } + }, + "init-DD64bTraceId"); // Daemon so a deadlock cannot block forked-JVM shutdown. viaSuper.setDaemon(true); viaSub.setDaemon(true); @@ -80,13 +78,12 @@ void traceIdClassPairInitializesConcurrentlyWithoutDeadlock() throws Exception { viaSub.join(SECONDS.toMillis(15)); if (viaSuper.isAlive() || viaSub.isAlive()) { - fail( - "DDTraceId/DD64bTraceId class-initialization deadlock: DDTraceId. must not " - + "reference DD64bTraceId (init-DDTraceId.alive=" - + viaSuper.isAlive() - + ", init-DD64bTraceId.alive=" - + viaSub.isAlive() - + ")."); + fail("DDTraceId/DD64bTraceId class-initialization deadlock: DDTraceId. must not " + + "reference DD64bTraceId (init-DDTraceId.alive=" + + viaSuper.isAlive() + + ", init-DD64bTraceId.alive=" + + viaSub.isAlive() + + ")."); } if (error.get() != null) { throw new AssertionError( diff --git a/dd-trace-api/src/test/java/datadog/trace/api/IdGenerationStrategyTest.java b/dd-trace-api/src/test/java/datadog/trace/api/IdGenerationStrategyTest.java index e5b5a8efcf9..0a02d728df0 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/IdGenerationStrategyTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/IdGenerationStrategyTest.java @@ -36,12 +36,10 @@ void generateIdWithStrategyAndBitSize( assertNotEquals("foo", traceId); assertNotEquals(DDTraceId.ZERO, traceId); - int expectedHash = - (int) - (traceId.toHighOrderLong() - ^ (traceId.toHighOrderLong() >>> 32) - ^ traceId.toLong() - ^ (traceId.toLong() >>> 32)); + int expectedHash = (int) (traceId.toHighOrderLong() + ^ (traceId.toHighOrderLong() >>> 32) + ^ traceId.toLong() + ^ (traceId.toLong() >>> 32)); assertEquals(expectedHash, traceId.hashCode()); assertFalse(checked.contains(traceId)); @@ -57,15 +55,11 @@ void returnNullForNonExistingStrategy(String strategyName) { @Test void exceptionCreatedOnSecureRandomStrategy() { - ExceptionInInitializerError error = - assertThrows( - ExceptionInInitializerError.class, - () -> - new IdGenerationStrategy.SRandom( - false, - () -> { - throw new IllegalArgumentException("SecureRandom init exception"); - })); + ExceptionInInitializerError error = assertThrows( + ExceptionInInitializerError.class, + () -> new IdGenerationStrategy.SRandom(false, () -> { + throw new IllegalArgumentException("SecureRandom init exception"); + })); assertNotNull(error.getCause()); assertEquals("SecureRandom init exception", error.getCause().getMessage()); @@ -76,13 +70,10 @@ void secureRandomIdsWillAlwaysBeNonZero() { ScriptedSecureRandom random = new ScriptedSecureRandom(new long[] {0L, 47L, 0L, 11L}); CallCounter providerCallCounter = new CallCounter(); - IdGenerationStrategy strategy = - new IdGenerationStrategy.SRandom( - false, - () -> { - providerCallCounter.count++; - return random; - }); + IdGenerationStrategy strategy = new IdGenerationStrategy.SRandom(false, () -> { + providerCallCounter.count++; + return random; + }); long traceId = strategy.generateTraceId().toLong(); long spanId = strategy.generateSpanId(); diff --git a/dd-trace-api/src/test/java/datadog/trace/api/aiguard/AIGuardTest.java b/dd-trace-api/src/test/java/datadog/trace/api/aiguard/AIGuardTest.java index 0d44d81a975..c82cda27fc1 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/aiguard/AIGuardTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/aiguard/AIGuardTest.java @@ -25,11 +25,9 @@ void testTextMessage() { @Test void testAssistantToolCall() { - AIGuard.Message message = - AIGuard.Message.assistant( - AIGuard.ToolCall.toolCall( - "1", "execute_http_request", "{ \"url\": \"http://localhost\" }"), - AIGuard.ToolCall.toolCall("2", "random_number", "{ \"min\": 0, \"max\": 10 }")); + AIGuard.Message message = AIGuard.Message.assistant( + AIGuard.ToolCall.toolCall("1", "execute_http_request", "{ \"url\": \"http://localhost\" }"), + AIGuard.ToolCall.toolCall("2", "random_number", "{ \"min\": 0, \"max\": 10 }")); assertEquals("assistant", message.getRole()); assertNull(message.getContent()); @@ -60,17 +58,15 @@ void testTool() { @Test void testNoopImplementation() { - List messages = - Arrays.asList( - AIGuard.Message.message("system", "You are a beautiful AI assistant"), - AIGuard.Message.message("user", "What day is today?"), - AIGuard.Message.message("assistant", "Today is monday"), - AIGuard.Message.message("user", "Give me a random number"), - AIGuard.Message.assistant( - AIGuard.ToolCall.toolCall( - "1", "generate_random_number", "{ \"min\": 0, \"max\": 10 }")), - AIGuard.Message.tool("1", "5"), - AIGuard.Message.message("assistant", "Your number is 5")); + List messages = Arrays.asList( + AIGuard.Message.message("system", "You are a beautiful AI assistant"), + AIGuard.Message.message("user", "What day is today?"), + AIGuard.Message.message("assistant", "Today is monday"), + AIGuard.Message.message("user", "Give me a random number"), + AIGuard.Message.assistant(AIGuard.ToolCall.toolCall( + "1", "generate_random_number", "{ \"min\": 0, \"max\": 10 }")), + AIGuard.Message.tool("1", "5"), + AIGuard.Message.message("assistant", "Your number is 5")); AIGuard.Evaluation evaluation = AIGuard.evaluate(messages); @@ -99,12 +95,11 @@ void testContentPartImageUrlFromStringFactory() { @Test void testMessageWithContentParts() { - AIGuard.Message message = - AIGuard.Message.message( - "user", - Arrays.asList( - AIGuard.ContentPart.text("Describe this image:"), - AIGuard.ContentPart.imageUrl("https://example.com/image.jpg"))); + AIGuard.Message message = AIGuard.Message.message( + "user", + Arrays.asList( + AIGuard.ContentPart.text("Describe this image:"), + AIGuard.ContentPart.imageUrl("https://example.com/image.jpg"))); assertEquals("user", message.getRole()); assertNull(message.getContent()); @@ -112,9 +107,11 @@ void testMessageWithContentParts() { assertEquals(2, message.getContentParts().size()); assertEquals(AIGuard.ContentPart.Type.TEXT, message.getContentParts().get(0).getType()); assertEquals("Describe this image:", message.getContentParts().get(0).getText()); - assertEquals(AIGuard.ContentPart.Type.IMAGE_URL, message.getContentParts().get(1).getType()); assertEquals( - "https://example.com/image.jpg", message.getContentParts().get(1).getImageUrl().getUrl()); + AIGuard.ContentPart.Type.IMAGE_URL, message.getContentParts().get(1).getType()); + assertEquals( + "https://example.com/image.jpg", + message.getContentParts().get(1).getImageUrl().getUrl()); } @Test @@ -127,9 +124,8 @@ void testMessageWithPlainContentReturnsNullContentParts() { @Test void testMessageWithContentPartsReturnsNullContent() { - AIGuard.Message message = - AIGuard.Message.message( - "user", Collections.singletonList(AIGuard.ContentPart.text("Hello"))); + AIGuard.Message message = AIGuard.Message.message( + "user", Collections.singletonList(AIGuard.ContentPart.text("Hello"))); assertNull(message.getContent()); assertNotNull(message.getContentParts()); diff --git a/dd-trace-api/src/test/java/datadog/trace/api/interceptor/AbstractTraceInterceptorTest.java b/dd-trace-api/src/test/java/datadog/trace/api/interceptor/AbstractTraceInterceptorTest.java index c3bdf503108..1763937722d 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/interceptor/AbstractTraceInterceptorTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/interceptor/AbstractTraceInterceptorTest.java @@ -10,14 +10,13 @@ class AbstractTraceInterceptorTest { @Test void priorityIndexIsTakenFromEnum() { AbstractTraceInterceptor.Priority priority = AbstractTraceInterceptor.Priority.values()[0]; - AbstractTraceInterceptor interceptor = - new AbstractTraceInterceptor(priority) { - @Override - public Collection onTraceComplete( - Collection trace) { - return null; - } - }; + AbstractTraceInterceptor interceptor = new AbstractTraceInterceptor(priority) { + @Override + public Collection onTraceComplete( + Collection trace) { + return null; + } + }; assertEquals(priority.getIdx(), interceptor.priority()); } diff --git a/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsFeedbackTest.java b/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsFeedbackTest.java index b55cf7abd5f..d1157c72f64 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsFeedbackTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsFeedbackTest.java @@ -82,13 +82,9 @@ void testTheFirstProblemWinsOverLaterOnes() { @Test void testMissingTargetIsRejected() { - LLMObs.Feedback.ValidationError error = - assertRejected( - "invalid_target_count", - LLMObs.Feedback.builder() - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null)); + LLMObs.Feedback.ValidationError error = assertRejected( + "invalid_target_count", + LLMObs.Feedback.builder().label("thumbs").booleanValue(true).submitter("user-123", null)); assertTrue(error.getMessage().contains("feedbackJoinKey"), error.getMessage()); } @@ -99,35 +95,32 @@ void testEachTargetTypeIsCarriedWithItsWireKey() { assertEquals("span_id", bySpanId.getTargetType().getWireKey()); assertEquals("123", bySpanId.getTargetValue()); - LLMObs.Feedback byTraceId = - LLMObs.Feedback.builder() - .traceId("abc") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(); + LLMObs.Feedback byTraceId = LLMObs.Feedback.builder() + .traceId("abc") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.TargetType.TRACE_ID, byTraceId.getTargetType()); assertEquals("trace_id", byTraceId.getTargetType().getWireKey()); assertEquals("abc", byTraceId.getTargetValue()); - LLMObs.Feedback bySessionId = - LLMObs.Feedback.builder() - .sessionId("session-2") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(); + LLMObs.Feedback bySessionId = LLMObs.Feedback.builder() + .sessionId("session-2") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.TargetType.SESSION_ID, bySessionId.getTargetType()); assertEquals("session_id", bySessionId.getTargetType().getWireKey()); assertEquals("session-2", bySessionId.getTargetValue()); - LLMObs.Feedback byJoinKey = - LLMObs.Feedback.builder() - .feedbackJoinKey("incident-123") - .label("user_comment") - .textValue("missed the customer impact") - .submitter("user-123", null) - .build(); + LLMObs.Feedback byJoinKey = LLMObs.Feedback.builder() + .feedbackJoinKey("incident-123") + .label("user_comment") + .textValue("missed the customer impact") + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.TargetType.FEEDBACK_JOIN_KEY, byJoinKey.getTargetType()); assertEquals("feedback_join_key", byJoinKey.getTargetType().getWireKey()); assertEquals("incident-123", byJoinKey.getTargetValue()); @@ -138,13 +131,12 @@ void testSpanTargetsItsSpanId() { LLMObsSpan span = mock(LLMObsSpan.class); when(span.getSpanId()).thenReturn(4242L); - LLMObs.Feedback feedback = - LLMObs.Feedback.builder() - .span(span) - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(); + LLMObs.Feedback feedback = LLMObs.Feedback.builder() + .span(span) + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.TargetType.SPAN_ID, feedback.getTargetType()); assertEquals("4242", feedback.getTargetValue()); @@ -157,15 +149,15 @@ void testNullSpanIsRejected() { @Test void testTwoDifferentTargetsAreRejected() { - LLMObs.Feedback.ValidationError error = - assertRejected( - "invalid_target_count", LLMObs.Feedback.builder().spanId("123").sessionId("session-2")); + LLMObs.Feedback.ValidationError error = assertRejected( + "invalid_target_count", LLMObs.Feedback.builder().spanId("123").sessionId("session-2")); assertTrue(error.getMessage().contains("span_id"), error.getMessage()); } @Test void testSameTargetSetTwiceIsRejected() { - assertRejected("invalid_target_count", LLMObs.Feedback.builder().spanId("123").spanId("456")); + assertRejected( + "invalid_target_count", LLMObs.Feedback.builder().spanId("123").spanId("456")); } @Test @@ -205,33 +197,30 @@ void testDottedLabelIsRejected() { @Test void testMissingValueIsRejected() { - LLMObs.Feedback.ValidationError error = - assertRejected( - "invalid_metric_type", - LLMObs.Feedback.builder().spanId("123").label("thumbs").submitter("user-123", null)); + LLMObs.Feedback.ValidationError error = assertRejected( + "invalid_metric_type", + LLMObs.Feedback.builder().spanId("123").label("thumbs").submitter("user-123", null)); assertTrue(error.getMessage().contains("booleanValue"), error.getMessage()); } @Test void testEachMetricTypeCarriesItsValue() { - LLMObs.Feedback categorical = - LLMObs.Feedback.builder() - .spanId("123") - .label("satisfaction") - .categoricalValue("satisfied") - .submitter("user-123", null) - .build(); + LLMObs.Feedback categorical = LLMObs.Feedback.builder() + .spanId("123") + .label("satisfaction") + .categoricalValue("satisfied") + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.MetricType.CATEGORICAL, categorical.getMetricType()); assertEquals("categorical", categorical.getMetricType().toString()); assertEquals("satisfied", categorical.getValue()); - LLMObs.Feedback score = - LLMObs.Feedback.builder() - .spanId("123") - .label("rating") - .scoreValue(0.75) - .submitter("user-123", null) - .build(); + LLMObs.Feedback score = LLMObs.Feedback.builder() + .spanId("123") + .label("rating") + .scoreValue(0.75) + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.MetricType.SCORE, score.getMetricType()); assertEquals("score", score.getMetricType().toString()); assertEquals(0.75, score.getValue()); @@ -242,24 +231,22 @@ void testEachMetricTypeCarriesItsValue() { assertEquals(true, bool.getValue()); Map details = Collections.singletonMap("missing", "customer impact"); - LLMObs.Feedback json = - LLMObs.Feedback.builder() - .spanId("123") - .label("details") - .jsonValue(details) - .submitter("user-123", null) - .build(); + LLMObs.Feedback json = LLMObs.Feedback.builder() + .spanId("123") + .label("details") + .jsonValue(details) + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.MetricType.JSON, json.getMetricType()); assertEquals("json", json.getMetricType().toString()); assertEquals(details, json.getValue()); - LLMObs.Feedback text = - LLMObs.Feedback.builder() - .spanId("123") - .label("user_comment") - .textValue("missed the customer impact") - .submitter("user-123", null) - .build(); + LLMObs.Feedback text = LLMObs.Feedback.builder() + .spanId("123") + .label("user_comment") + .textValue("missed the customer impact") + .submitter("user-123", null) + .build(); assertEquals(LLMObs.Feedback.MetricType.TEXT, text.getMetricType()); assertEquals("text", text.getMetricType().toString()); assertEquals("missed the customer impact", text.getValue()); @@ -267,10 +254,8 @@ void testEachMetricTypeCarriesItsValue() { @Test void testTwoValuesAreRejected() { - LLMObs.Feedback.ValidationError error = - assertRejected( - "invalid_metric_type", - LLMObs.Feedback.builder().booleanValue(true).textValue("also this")); + LLMObs.Feedback.ValidationError error = assertRejected( + "invalid_metric_type", LLMObs.Feedback.builder().booleanValue(true).textValue("also this")); assertTrue(error.getMessage().contains("boolean"), error.getMessage()); } @@ -287,13 +272,12 @@ void testNonFiniteScoresAreRejected() { "invalid_metric_value", LLMObs.Feedback.builder().scoreValue(Double.POSITIVE_INFINITY)); assertRejected( "invalid_metric_value", LLMObs.Feedback.builder().scoreValue(Double.NEGATIVE_INFINITY)); - LLMObs.Feedback largest = - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .scoreValue(Double.MAX_VALUE) - .submitter("user-123", null) - .build(); + LLMObs.Feedback largest = LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .scoreValue(Double.MAX_VALUE) + .submitter("user-123", null) + .build(); assertNull(largest.validate()); assertEquals(Double.MAX_VALUE, largest.getValue()); } @@ -309,10 +293,9 @@ void testNullValuesAreRejected() { @Test void testMissingSubmitterIsRejected() { - LLMObs.Feedback.ValidationError error = - assertRejected( - "invalid_submitter", - LLMObs.Feedback.builder().spanId("123").label("thumbs").booleanValue(true)); + LLMObs.Feedback.ValidationError error = assertRejected( + "invalid_submitter", + LLMObs.Feedback.builder().spanId("123").label("thumbs").booleanValue(true)); assertTrue(error.getMessage().contains("submitter"), error.getMessage()); } @@ -330,13 +313,12 @@ void testSubmitterTypeIsOptional() { assertEquals("user-123", withType.getSubmitter().getId()); assertEquals("end_user", withType.getSubmitter().getType()); - LLMObs.Feedback withoutType = - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter("user-123", null) - .build(); + LLMObs.Feedback withoutType = LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter("user-123", null) + .build(); assertEquals("user-123", withoutType.getSubmitter().getId()); assertNull(withoutType.getSubmitter().getType()); } @@ -345,13 +327,12 @@ void testSubmitterTypeIsOptional() { void testSubmitterCanBeSuppliedAsAnInstance() { LLMObs.Feedback.Submitter submitter = new LLMObs.Feedback.Submitter("user-123", "end_user"); - LLMObs.Feedback feedback = - LLMObs.Feedback.builder() - .spanId("123") - .label("thumbs") - .booleanValue(true) - .submitter(submitter) - .build(); + LLMObs.Feedback feedback = LLMObs.Feedback.builder() + .spanId("123") + .label("thumbs") + .booleanValue(true) + .submitter(submitter) + .build(); assertEquals("user-123", feedback.getSubmitter().getId()); assertEquals("end_user", feedback.getSubmitter().getType()); @@ -371,12 +352,11 @@ void testAssessmentAndReasoningDefaultToAbsent() { @Test void testAssessmentAndReasoningAreCarried() { - LLMObs.Feedback feedback = - validBuilder() - .assessment(LLMObs.Feedback.Assessment.FAIL) - .reasoning("missed the customer impact") - .mlApp("incident-agent") - .build(); + LLMObs.Feedback feedback = validBuilder() + .assessment(LLMObs.Feedback.Assessment.FAIL) + .reasoning("missed the customer impact") + .mlApp("incident-agent") + .build(); assertEquals(LLMObs.Feedback.Assessment.FAIL, feedback.getAssessment()); assertEquals("fail", feedback.getAssessment().toString()); @@ -435,7 +415,8 @@ void testTagsAreCopiedAndExposedAsUnmodifiable() { @Test void testSingleTagsAccumulate() { - LLMObs.Feedback feedback = validBuilder().tag("source", "web-ui").tag("revision", "2").build(); + LLMObs.Feedback feedback = + validBuilder().tag("source", "web-ui").tag("revision", "2").build(); Map expected = new HashMap<>(); expected.put("source", "web-ui"); @@ -462,11 +443,10 @@ void testNullTagsAreAccepted() { @Test void testDefaultNoOpFeedbackProcessorBehavior() { - assertDoesNotThrow( - () -> { - LLMObs.submitFeedback(validBuilder().build()); - LLMObs.submitFeedback(null); - }); + assertDoesNotThrow(() -> { + LLMObs.submitFeedback(validBuilder().build()); + LLMObs.submitFeedback(null); + }); } @Test @@ -482,14 +462,13 @@ void testSubmitFeedbackDelegatesToTheProcessor() throws Exception { LLMObs.LLMObsFeedbackProcessor mockProcessor = mock(LLMObs.LLMObsFeedbackProcessor.class); setStaticField("FEEDBACK_PROCESSOR", mockProcessor); - LLMObs.Feedback feedback = - LLMObs.Feedback.builder() - .span(NoOpLLMObsSpan.INSTANCE) - .label("thumbs") - .booleanValue(false) - .submitter("user-123", "end_user") - .assessment(LLMObs.Feedback.Assessment.FAIL) - .build(); + LLMObs.Feedback feedback = LLMObs.Feedback.builder() + .span(NoOpLLMObsSpan.INSTANCE) + .label("thumbs") + .booleanValue(false) + .submitter("user-123", "end_user") + .assessment(LLMObs.Feedback.Assessment.FAIL) + .build(); LLMObs.submitFeedback(feedback); diff --git a/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsTest.java b/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsTest.java index 286a5e5c071..57e5e9ef628 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/llmobs/LLMObsTest.java @@ -169,16 +169,15 @@ void testPromptBuilderWithTextTemplate() { List contextVariables = Arrays.asList("forecast", "history"); List queryVariables = Collections.singletonList("city"); - LLMObs.Prompt prompt = - LLMObs.Prompt.builder() - .id("weather-prompt") - .version("1.0.0") - .template("What is the weather in {{city}}?") - .variables(variables) - .tags(tags) - .contextVariables(contextVariables) - .queryVariables(queryVariables) - .build(); + LLMObs.Prompt prompt = LLMObs.Prompt.builder() + .id("weather-prompt") + .version("1.0.0") + .template("What is the weather in {{city}}?") + .variables(variables) + .tags(tags) + .contextVariables(contextVariables) + .queryVariables(queryVariables) + .build(); assertEquals("weather-prompt", prompt.getId()); assertEquals("1.0.0", prompt.getVersion()); @@ -196,10 +195,9 @@ void testPromptBuilderWithTextTemplate() { @Test void testPromptBuilderWithChatTemplate() { - List chatTemplate = - Arrays.asList( - LLMObs.LLMMessage.from("system", "You are a weather assistant."), - LLMObs.LLMMessage.from("user", "What is the weather in {{city}}?")); + List chatTemplate = Arrays.asList( + LLMObs.LLMMessage.from("system", "You are a weather assistant."), + LLMObs.LLMMessage.from("user", "What is the weather in {{city}}?")); LLMObs.Prompt prompt = LLMObs.Prompt.builder().template(chatTemplate).build(); @@ -210,10 +208,9 @@ void testPromptBuilderWithChatTemplate() { @Test void testAnnotateAgentManifestIsCompatibilityPreservingDefaultMethod() throws Exception { - assertTrue( - LLMObsSpan.class - .getMethod("annotateAgentManifest", LLMObs.AgentManifest.class) - .isDefault()); + assertTrue(LLMObsSpan.class + .getMethod("annotateAgentManifest", LLMObs.AgentManifest.class) + .isDefault()); } @Test @@ -222,21 +219,18 @@ void testAgentManifestBuilderWithAllFields() { modelSettings.put("temperature", 0.7); modelSettings.put("max_tokens", 1024); - List tools = - Arrays.asList( - LLMObs.AgentTool.from( - "get_weather", - "Look up the weather", - Collections.singletonMap("city", Collections.singletonMap("type", "string")))); - - LLMObs.AgentManifest manifest = - LLMObs.AgentManifest.builder() - .name("travel_desk") - .instructions("Book travel for the user.") - .model("gpt-4o") - .modelSettings(modelSettings) - .tools(tools) - .build(); + List tools = Arrays.asList(LLMObs.AgentTool.from( + "get_weather", + "Look up the weather", + Collections.singletonMap("city", Collections.singletonMap("type", "string")))); + + LLMObs.AgentManifest manifest = LLMObs.AgentManifest.builder() + .name("travel_desk") + .instructions("Book travel for the user.") + .model("gpt-4o") + .modelSettings(modelSettings) + .tools(tools) + .build(); assertEquals("travel_desk", manifest.getName()); assertEquals("Book travel for the user.", manifest.getInstructions()); @@ -370,14 +364,13 @@ void testSpanCreationWithNullOptionalParameters() { @Test void testDefaultNoOpEvaluationProcessorBehavior() { - assertDoesNotThrow( - () -> { - Map emptyTags = new HashMap<>(); - LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", 0.5, emptyTags); - LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", 0.5, "app", emptyTags); - LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", "value", emptyTags); - LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", "value", "app", emptyTags); - }); + assertDoesNotThrow(() -> { + Map emptyTags = new HashMap<>(); + LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", 0.5, emptyTags); + LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", 0.5, "app", emptyTags); + LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", "value", emptyTags); + LLMObs.SubmitEvaluation(NoOpLLMObsSpan.INSTANCE, "label", "value", "app", emptyTags); + }); } @Test @@ -387,13 +380,12 @@ void testEvaluationSubmissionWithVariousScoreValues() { tags.put("category", "test"); tags.put("version", "1.0"); - assertDoesNotThrow( - () -> { - LLMObs.SubmitEvaluation(span, "accuracy", 0.0, tags); - LLMObs.SubmitEvaluation(span, "precision", 1.0, tags); - LLMObs.SubmitEvaluation(span, "recall", 0.85, tags); - LLMObs.SubmitEvaluation(span, "f1_score", 0.92, "myapp", tags); - }); + assertDoesNotThrow(() -> { + LLMObs.SubmitEvaluation(span, "accuracy", 0.0, tags); + LLMObs.SubmitEvaluation(span, "precision", 1.0, tags); + LLMObs.SubmitEvaluation(span, "recall", 0.85, tags); + LLMObs.SubmitEvaluation(span, "f1_score", 0.92, "myapp", tags); + }); } @Test @@ -403,12 +395,11 @@ void testEvaluationSubmissionWithCategoricalValues() { tags.put("evaluator", "human"); tags.put("context", "production"); - assertDoesNotThrow( - () -> { - LLMObs.SubmitEvaluation(span, "quality", "excellent", tags); - LLMObs.SubmitEvaluation(span, "relevance", "poor", tags); - LLMObs.SubmitEvaluation(span, "toxicity", "safe", "content-app", tags); - }); + assertDoesNotThrow(() -> { + LLMObs.SubmitEvaluation(span, "quality", "excellent", tags); + LLMObs.SubmitEvaluation(span, "relevance", "poor", tags); + LLMObs.SubmitEvaluation(span, "toxicity", "safe", "content-app", tags); + }); } @Test @@ -416,11 +407,10 @@ void testEvaluationSubmissionWithEmptyTags() { LLMObsSpan span = NoOpLLMObsSpan.INSTANCE; Map emptyTags = new HashMap<>(); - assertDoesNotThrow( - () -> { - LLMObs.SubmitEvaluation(span, "score", 0.75, emptyTags); - LLMObs.SubmitEvaluation(span, "category", "good", emptyTags); - }); + assertDoesNotThrow(() -> { + LLMObs.SubmitEvaluation(span, "score", 0.75, emptyTags); + LLMObs.SubmitEvaluation(span, "category", "good", emptyTags); + }); } @Test @@ -458,9 +448,8 @@ void testSpanCreationWithCustomFactoryReturnsActualSpans() throws Exception { LLMObsSpan toolSpan = LLMObs.startToolSpan("weather-tool", "my-app", "session-1"); LLMObsSpan taskSpan = LLMObs.startTaskSpan("summarize-task", "my-app", "session-1"); LLMObsSpan workflowSpan = LLMObs.startWorkflowSpan("data-workflow", "my-app", "session-1"); - LLMObsSpan embeddingSpan = - LLMObs.startEmbeddingSpan( - "text-embed", "my-app", "openai", "text-embedding-ada-002", "session-1"); + LLMObsSpan embeddingSpan = LLMObs.startEmbeddingSpan( + "text-embed", "my-app", "openai", "text-embedding-ada-002", "session-1"); LLMObsSpan retrievalSpan = LLMObs.startRetrievalSpan("document-retrieval", "my-app", "session-1"); diff --git a/dd-trace-core/src/jmh/java/datadog/context/ContextManagerBenchmark.java b/dd-trace-core/src/jmh/java/datadog/context/ContextManagerBenchmark.java index 0128535a9d0..82b15ce62b0 100644 --- a/dd-trace-core/src/jmh/java/datadog/context/ContextManagerBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/context/ContextManagerBenchmark.java @@ -334,14 +334,13 @@ public void captureAndFanOutToVirtualThreads(ThreadState thread) throws Exceptio ContextContinuation cont = manager.capture(ctx).hold(); Semaphore barrier = thread.fanOutBarrier; for (int i = 0; i < FAN_OUT; i++) { - thread.virtualExecutor.execute( - () -> { - try (ContextScope resumed = cont.resume()) { - // each virtual thread sees the same captured context - } finally { - barrier.release(); - } - }); + thread.virtualExecutor.execute(() -> { + try (ContextScope resumed = cont.resume()) { + // each virtual thread sees the same captured context + } finally { + barrier.release(); + } + }); } try { if (!barrier.tryAcquire(FAN_OUT, 10, SECONDS)) { diff --git a/dd-trace-core/src/jmh/java/datadog/trace/api/naming/MessagingNamingBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/api/naming/MessagingNamingBenchmark.java index 36de260f215..9db394bacb9 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/api/naming/MessagingNamingBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/api/naming/MessagingNamingBenchmark.java @@ -45,25 +45,23 @@ public class MessagingNamingBenchmark { private static final Supplier constantSupplier = () -> "constant"; - private final Supplier complexSupplier = - () -> { - String ret = weakCache.get(Thread.currentThread().getContextClassLoader()); - if (ret == null) { - ret = Config.get().getServiceName(); - } - return ret; - }; + private final Supplier complexSupplier = () -> { + String ret = weakCache.get(Thread.currentThread().getContextClassLoader()); + if (ret == null) { + ret = Config.get().getServiceName(); + } + return ret; + }; @Param({"false", "true"}) boolean pinThreadServiceName; @Setup(Level.Iteration) public void init(Blackhole blackhole) { - tracer = - CoreTracer.builder() - .writer(new BlackholeWriter(blackhole, new TraceCounters(), 0)) - .strictTraceWrites(false) - .build(); + tracer = CoreTracer.builder() + .writer(new BlackholeWriter(blackhole, new TraceCounters(), 0)) + .strictTraceWrites(false) + .build(); weakCache = new WeakHashMap<>(); if (pinThreadServiceName) { weakCache.put(Thread.currentThread().getContextClassLoader(), constantSupplier.get()); diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdditionalTagsMetricsBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdditionalTagsMetricsBenchmark.java index a360df0d7a6..0a3c53b31b4 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdditionalTagsMetricsBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdditionalTagsMetricsBenchmark.java @@ -54,23 +54,21 @@ public static class ThreadState { @Setup public void setup() { this.health = new AdversarialMetricsBenchmark.CountingHealthMetrics(); - AdditionalTagsSchema additionalTagsSchema = - AdditionalTagsSchema.from( - new LinkedHashSet<>(Arrays.asList("region", "tenant_id")), - MetricCardinalityLimits.ADDITIONAL_TAG_VALUE, - limitsEnabled); - this.aggregator = - new ClientStatsAggregator( - new WellKnownTags("", "", "", "", "", ""), - Collections.emptySet(), - additionalTagsSchema, - new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( - Collections.singleton("peer.hostname"), Collections.emptySet()), - this.health, - new ClientStatsAggregatorBenchmark.NullSink(), - 2048, - 2048, - false); + AdditionalTagsSchema additionalTagsSchema = AdditionalTagsSchema.from( + new LinkedHashSet<>(Arrays.asList("region", "tenant_id")), + MetricCardinalityLimits.ADDITIONAL_TAG_VALUE, + limitsEnabled); + this.aggregator = new ClientStatsAggregator( + new WellKnownTags("", "", "", "", "", ""), + Collections.emptySet(), + additionalTagsSchema, + new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( + Collections.singleton("peer.hostname"), Collections.emptySet()), + this.health, + new ClientStatsAggregatorBenchmark.NullSink(), + 2048, + 2048, + false); this.aggregator.start(); } diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdversarialMetricsBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdversarialMetricsBenchmark.java index ac677f20a97..0ce88a3f759 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdversarialMetricsBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/AdversarialMetricsBenchmark.java @@ -71,18 +71,17 @@ public static class ThreadState { @Setup public void setup() { this.health = new CountingHealthMetrics(); - this.aggregator = - new ClientStatsAggregator( - new WellKnownTags("", "", "", "", "", ""), - Collections.emptySet(), - AdditionalTagsSchema.EMPTY, - new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( - Collections.singleton("peer.hostname"), Collections.emptySet()), - this.health, - new ClientStatsAggregatorBenchmark.NullSink(), - 2048, - 2048, - false); + this.aggregator = new ClientStatsAggregator( + new WellKnownTags("", "", "", "", "", ""), + Collections.emptySet(), + AdditionalTagsSchema.EMPTY, + new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( + Collections.singleton("peer.hostname"), Collections.emptySet()), + this.health, + new ClientStatsAggregatorBenchmark.NullSink(), + 2048, + 2048, + false); this.aggregator.start(); } @@ -94,14 +93,12 @@ public void tearDown() { // CountingHealthMetrics instance is created once in @Setup and never reset. System.err.println( "[ADVERSARIAL] drops over the trial (8 threads, warmup + measurement combined):"); - System.err.println( - " onStatsInboxFull = " - + health.inboxFull.sum() - + " (snapshots dropped because the MPSC inbox was full)"); - System.err.println( - " onStatsAggregateDropped = " - + health.aggregateDropped.sum() - + " (snapshots dropped because the aggregate cache was full with no stale entry)"); + System.err.println(" onStatsInboxFull = " + + health.inboxFull.sum() + + " (snapshots dropped because the MPSC inbox was full)"); + System.err.println(" onStatsAggregateDropped = " + + health.aggregateDropped.sum() + + " (snapshots dropped because the aggregate cache was full with no stale entry)"); } @Benchmark @@ -122,9 +119,8 @@ public void publish(ThreadState ts, Blackhole blackhole) { // Wide duration spread forces histogram bins to populate broadly. long durationNanos = 1L + (rng.nextLong() & 0x3FFFFFFFL); // 1 ns .. ~1.07 s - SimpleSpan span = - new SimpleSpan( - service, operation, resource, "web", true, topLevel, error, 0, durationNanos, 200); + SimpleSpan span = new SimpleSpan( + service, operation, resource, "web", true, topLevel, error, 0, durationNanos, 200); span.setTag(SPAN_KIND, SPAN_KIND_CLIENT); span.setTag("peer.hostname", hostname); diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorBenchmark.java index 08449d7a9ac..5376da49cf1 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorBenchmark.java @@ -35,20 +35,18 @@ @OutputTimeUnit(MICROSECONDS) @Fork(1) public class ClientStatsAggregatorBenchmark { - private final DDAgentFeaturesDiscovery featuresDiscovery = - new FixedAgentFeaturesDiscovery( - Collections.singleton("peer.hostname"), Collections.emptySet()); - private final ClientStatsAggregator aggregator = - new ClientStatsAggregator( - new WellKnownTags("", "", "", "", "", ""), - Collections.emptySet(), - AdditionalTagsSchema.EMPTY, - featuresDiscovery, - HealthMetrics.NO_OP, - new NullSink(), - 2048, - 2048, - false); + private final DDAgentFeaturesDiscovery featuresDiscovery = new FixedAgentFeaturesDiscovery( + Collections.singleton("peer.hostname"), Collections.emptySet()); + private final ClientStatsAggregator aggregator = new ClientStatsAggregator( + new WellKnownTags("", "", "", "", "", ""), + Collections.emptySet(), + AdditionalTagsSchema.EMPTY, + featuresDiscovery, + HealthMetrics.NO_OP, + new NullSink(), + 2048, + 2048, + false); private final List> spans = generateTrace(64); static List> generateTrace(int len) { diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorDDSpanBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorDDSpanBenchmark.java index 7947ed20a0e..6ec3e722e8e 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorDDSpanBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/ClientStatsAggregatorDDSpanBenchmark.java @@ -58,17 +58,16 @@ public class ClientStatsAggregatorDDSpanBenchmark { private final DDAgentFeaturesDiscovery featuresDiscovery = new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( Collections.singleton("peer.hostname"), Collections.emptySet()); - private final ClientStatsAggregator aggregator = - new ClientStatsAggregator( - new WellKnownTags("", "", "", "", "", ""), - Collections.emptySet(), - AdditionalTagsSchema.EMPTY, - featuresDiscovery, - HealthMetrics.NO_OP, - new ClientStatsAggregatorBenchmark.NullSink(), - 2048, - 2048, - false); + private final ClientStatsAggregator aggregator = new ClientStatsAggregator( + new WellKnownTags("", "", "", "", "", ""), + Collections.emptySet(), + AdditionalTagsSchema.EMPTY, + featuresDiscovery, + HealthMetrics.NO_OP, + new ClientStatsAggregatorBenchmark.NullSink(), + 2048, + 2048, + false); private final List> spans = generateTrace(64); static List> generateTrace(int len) { diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityPeerMetricsBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityPeerMetricsBenchmark.java index 001a56aabeb..f55e5c4cc08 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityPeerMetricsBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityPeerMetricsBenchmark.java @@ -61,18 +61,17 @@ public static class ThreadState { @Setup public void setup() { this.health = new CountingHealthMetrics(); - this.aggregator = - new ClientStatsAggregator( - new WellKnownTags("", "", "", "", "", ""), - Collections.emptySet(), - AdditionalTagsSchema.EMPTY, - new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( - Collections.singleton("peer.hostname"), Collections.emptySet()), - this.health, - new ClientStatsAggregatorBenchmark.NullSink(), - 2048, - 2048, - false); + this.aggregator = new ClientStatsAggregator( + new WellKnownTags("", "", "", "", "", ""), + Collections.emptySet(), + AdditionalTagsSchema.EMPTY, + new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( + Collections.singleton("peer.hostname"), Collections.emptySet()), + this.health, + new ClientStatsAggregatorBenchmark.NullSink(), + 2048, + 2048, + false); this.aggregator.start(); } diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityResourceMetricsBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityResourceMetricsBenchmark.java index e9930eb69e7..580fdf94ab1 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityResourceMetricsBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/metrics/HighCardinalityResourceMetricsBenchmark.java @@ -57,18 +57,17 @@ public static class ThreadState { @Setup public void setup() { this.health = new CountingHealthMetrics(); - this.aggregator = - new ClientStatsAggregator( - new WellKnownTags("", "", "", "", "", ""), - Collections.emptySet(), - AdditionalTagsSchema.EMPTY, - new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( - Collections.singleton("peer.hostname"), Collections.emptySet()), - this.health, - new ClientStatsAggregatorBenchmark.NullSink(), - 2048, - 2048, - false); + this.aggregator = new ClientStatsAggregator( + new WellKnownTags("", "", "", "", "", ""), + Collections.emptySet(), + AdditionalTagsSchema.EMPTY, + new ClientStatsAggregatorBenchmark.FixedAgentFeaturesDiscovery( + Collections.singleton("peer.hostname"), Collections.emptySet()), + this.health, + new ClientStatsAggregatorBenchmark.NullSink(), + 2048, + 2048, + false); this.aggregator.start(); } diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java index 54192804b05..83ce8cbd144 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java @@ -76,11 +76,9 @@ public void init(Blackhole blackhole) { String feature = mapperAndFeatures[i]; switch (feature) { case "x-dth": - propagationTags = - PropagationTags.factory() - .fromHeaderValue( - PropagationTags.HeaderType.DATADOG, - "_dd.p.anytag=value,_dd.p.dm=934086a686-4"); + propagationTags = PropagationTags.factory() + .fromHeaderValue( + PropagationTags.HeaderType.DATADOG, "_dd.p.anytag=value,_dd.p.dm=934086a686-4"); break; default: throw new IllegalArgumentException("Unknown benchmark feature " + feature + "."); @@ -94,35 +92,32 @@ public void init(Blackhole blackhole) { writable = new MsgPackWriter(new BlackholeBuffer(blackhole)); - tracer = - CoreTracer.builder() - .strictTraceWrites( - true) // Avoid any extra bookkeeping for traces since we write directly - .build(); + tracer = CoreTracer.builder() + .strictTraceWrites(true) // Avoid any extra bookkeeping for traces since we write directly + .build(); DDTraceId traceId = DDTraceId.ONE; TraceCollector traceCollector = tracer.createTraceCollector(traceId); - DDSpanContext rootContext = - new DDSpanContext( - traceId, - 2, - DDSpanId.ZERO, - null, - "service", - UTF8BytesString.create("operation"), - UTF8BytesString.create("resource"), - PrioritySampling.SAMPLER_KEEP, - null, - Collections.emptyMap(), - false, - UTF8BytesString.create("type"), - 0, - traceCollector, - null, - null, - NoopPathwayContext.INSTANCE, - false, - propagationTags); + DDSpanContext rootContext = new DDSpanContext( + traceId, + 2, + DDSpanId.ZERO, + null, + "service", + UTF8BytesString.create("operation"), + UTF8BytesString.create("resource"), + PrioritySampling.SAMPLER_KEEP, + null, + Collections.emptyMap(), + false, + UTF8BytesString.create("type"), + 0, + traceCollector, + null, + null, + NoopPathwayContext.INSTANCE, + false, + propagationTags); DDSpanHelper.setAllTags(rootContext, tags); DDSpan root = DDSpanHelper.create("benchmark", System.currentTimeMillis() * 1000, rootContext); root.setResourceName(UTF8BytesString.create("benchmark")); diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/CoreTracerClassloaderNamingBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/core/CoreTracerClassloaderNamingBenchmark.java index cc68ddf847f..3ff77d0e41c 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/CoreTracerClassloaderNamingBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/CoreTracerClassloaderNamingBenchmark.java @@ -40,11 +40,10 @@ public class CoreTracerClassloaderNamingBenchmark { @Setup(Level.Iteration) public void init(Blackhole blackhole) { - tracer = - CoreTracer.builder() - .writer(new BlackholeWriter(blackhole, new TraceCounters(), 0)) - .strictTraceWrites(false) - .build(); + tracer = CoreTracer.builder() + .writer(new BlackholeWriter(blackhole, new TraceCounters(), 0)) + .strictTraceWrites(false) + .build(); weakCache = new WeakHashMap<>(); weakCache.put(Thread.currentThread().getContextClassLoader(), "test"); } diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java b/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java index b0a90c7bffb..90cd26d14c8 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java @@ -31,63 +31,60 @@ public class PendingTraceWrite { @Setup(Level.Trial) public void init(TraceCounters counters, Blackhole blackhole) { - tracer = - CoreTracer.builder() - .writer(new BlackholeWriter(blackhole, counters, tokens)) - .strictTraceWrites(false) - .build(); + tracer = CoreTracer.builder() + .writer(new BlackholeWriter(blackhole, counters, tokens)) + .strictTraceWrites(false) + .build(); DDTraceId traceId = DDTraceId.ONE; traceCollector = tracer.createTraceCollector(traceId); - root = - DDSpan.create( - "benchmark", - System.currentTimeMillis() * 1000, - new DDSpanContext( - traceId, - 2, - DDSpanId.ZERO, - null, - "service", - "operation", - "resource", - PrioritySampling.SAMPLER_KEEP, - null, - Collections.emptyMap(), - false, - "type", - 0, - traceCollector, - null, - null, - NoopPathwayContext.INSTANCE, - false, - null), - null); - span = - DDSpan.create( - "benchmark", - System.currentTimeMillis() * 1000, - new DDSpanContext( - traceId, - 3, - 2, - null, - "service", - "operation", - "resource", - PrioritySampling.SAMPLER_KEEP, - null, - Collections.emptyMap(), - false, - "type", - 0, - traceCollector, - null, - null, - NoopPathwayContext.INSTANCE, - false, - null), - null); + root = DDSpan.create( + "benchmark", + System.currentTimeMillis() * 1000, + new DDSpanContext( + traceId, + 2, + DDSpanId.ZERO, + null, + "service", + "operation", + "resource", + PrioritySampling.SAMPLER_KEEP, + null, + Collections.emptyMap(), + false, + "type", + 0, + traceCollector, + null, + null, + NoopPathwayContext.INSTANCE, + false, + null), + null); + span = DDSpan.create( + "benchmark", + System.currentTimeMillis() * 1000, + new DDSpanContext( + traceId, + 3, + 2, + null, + "service", + "operation", + "resource", + PrioritySampling.SAMPLER_KEEP, + null, + Collections.emptyMap(), + false, + "type", + 0, + traceCollector, + null, + null, + NoopPathwayContext.INSTANCE, + false, + null), + null); } @Threads(4) diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationBenchmark.java index d288463faad..cdcea44cfe6 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationBenchmark.java @@ -154,14 +154,16 @@ public void bareStartSpan() { /** Baseline: create + finish a bare span via the builder path, no tags. */ @Benchmark public void bareBuildSpan() { - AgentSpan span = tracer.buildSpan(INSTRUMENTATION_NAME, SERVER_OPERATION_NAME).start(); + AgentSpan span = + tracer.buildSpan(INSTRUMENTATION_NAME, SERVER_OPERATION_NAME).start(); span.finish(); } /** Web-server-shaped span: create -> set the typical known tags -> finish. */ @Benchmark public void webServerSpan() { - AgentSpan span = tracer.buildSpan(INSTRUMENTATION_NAME, SERVER_OPERATION_NAME).start(); + AgentSpan span = + tracer.buildSpan(INSTRUMENTATION_NAME, SERVER_OPERATION_NAME).start(); span.setTag(Tags.COMPONENT, COMPONENT_VALUE); span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER); span.setTag(Tags.HTTP_METHOD, HTTP_METHOD_VALUE); @@ -182,17 +184,16 @@ public void webServerSpan() { */ @Benchmark public void webServerSpanViaBuilder() { - AgentSpan span = - tracer - .buildSpan(INSTRUMENTATION_NAME, SERVER_OPERATION_NAME) - .withTag(Tags.COMPONENT, COMPONENT_VALUE) - .withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER) - .withTag(Tags.HTTP_METHOD, HTTP_METHOD_VALUE) - .withTag(Tags.HTTP_ROUTE, HTTP_ROUTE_VALUE) - .withTag(Tags.HTTP_URL, HTTP_URL_VALUE) - .withTag(Tags.HTTP_STATUS, HTTP_STATUS_VALUE) - .withTag(Tags.PEER_PORT, PEER_PORT_VALUE) - .start(); + AgentSpan span = tracer + .buildSpan(INSTRUMENTATION_NAME, SERVER_OPERATION_NAME) + .withTag(Tags.COMPONENT, COMPONENT_VALUE) + .withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER) + .withTag(Tags.HTTP_METHOD, HTTP_METHOD_VALUE) + .withTag(Tags.HTTP_ROUTE, HTTP_ROUTE_VALUE) + .withTag(Tags.HTTP_URL, HTTP_URL_VALUE) + .withTag(Tags.HTTP_STATUS, HTTP_STATUS_VALUE) + .withTag(Tags.PEER_PORT, PEER_PORT_VALUE) + .start(); span.finish(); } diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationVirtualThreadBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationVirtualThreadBenchmark.java index 9c7c43fc9d1..a5915bfabae 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationVirtualThreadBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/SpanCreationVirtualThreadBenchmark.java @@ -58,17 +58,15 @@ public class SpanCreationVirtualThreadBenchmark { @Setup public void setup(Blackhole blackhole) throws Throwable { this.tracer = CoreTracer.builder().writer(new DropWriter(blackhole)).build(); - this.startVirtualThread = - MethodHandles.publicLookup() - .findStatic( - Thread.class, - "startVirtualThread", - MethodType.methodType(Thread.class, Runnable.class)); - this.spanTask = - () -> { - AgentSpan span = tracer.startSpan(INSTRUMENTATION_NAME, OPERATION_NAME); - span.finish(); - }; + this.startVirtualThread = MethodHandles.publicLookup() + .findStatic( + Thread.class, + "startVirtualThread", + MethodType.methodType(Thread.class, Runnable.class)); + this.spanTask = () -> { + AgentSpan span = tracer.startSpan(INSTRUMENTATION_NAME, OPERATION_NAME); + span.finish(); + }; } @TearDown diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/TraceAssemblyBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/core/TraceAssemblyBenchmark.java index c49f234dda5..5da873021f9 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/TraceAssemblyBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/TraceAssemblyBenchmark.java @@ -128,8 +128,10 @@ public void webServerTrace() { root.setTag(Tags.HTTP_STATUS, HTTP_STATUS_VALUE); for (int i = 0; i < childCount; i++) { - AgentSpan child = - tracer.buildSpan(INSTRUMENTATION_NAME, CHILD_OPERATION).asChildOf(root).start(); + AgentSpan child = tracer + .buildSpan(INSTRUMENTATION_NAME, CHILD_OPERATION) + .asChildOf(root) + .start(); child.setTag(Tags.COMPONENT, COMPONENT_VALUE); child.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_INTERNAL); child.finish(); diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/ExtractorBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/ExtractorBenchmark.java index a72be08a929..2f8a6661bae 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/ExtractorBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/ExtractorBenchmark.java @@ -74,9 +74,8 @@ public void setUp() { String feature = propagationAndFeatures[i]; switch (feature) { case "x-dth": - headers.add( - Pair.of( - DatadogHttpCodec.DATADOG_TAGS_KEY, "_dd.p.anytag=value,_dd.p.dm=934086a686-4")); + headers.add(Pair.of( + DatadogHttpCodec.DATADOG_TAGS_KEY, "_dd.p.anytag=value,_dd.p.dm=934086a686-4")); break; default: System.out.println("Unknown benchmark feature " + feature + ". Will be ignored!"); @@ -85,11 +84,10 @@ public void setUp() { } System.setProperty("dd.propagation.style.extract", propagations.toString()); - DynamicConfig dynamicConfig = - DynamicConfig.create() - .setHeaderTags(Collections.emptyMap()) - .setBaggageMapping(Collections.emptyMap()) - .apply(); + DynamicConfig dynamicConfig = DynamicConfig.create() + .setHeaderTags(Collections.emptyMap()) + .setBaggageMapping(Collections.emptyMap()) + .apply(); extractor = HttpCodec.createExtractor(Config.get(), dynamicConfig::captureTraceConfig); if (extractPropagationStyles.startsWith("datadog")) { diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java index 1c070167377..add54cc4530 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java @@ -74,18 +74,14 @@ public void setUp(Blackhole blackhole) { String feature = propagationAndFeatures[i]; switch (feature) { case "x-dth": - propagationTags = - PropagationTags.factory() - .fromHeaderValue( - PropagationTags.HeaderType.DATADOG, - "_dd.p.anytag=value,_dd.p.dm=934086a686-4"); + propagationTags = PropagationTags.factory() + .fromHeaderValue( + PropagationTags.HeaderType.DATADOG, "_dd.p.anytag=value,_dd.p.dm=934086a686-4"); break; case "x-dth-mod": - propagationTags = - PropagationTags.factory() - .fromHeaderValue( - PropagationTags.HeaderType.DATADOG, - "_dd.p.anytag=value,_dd.p.dm=934086a686-4"); + propagationTags = PropagationTags.factory() + .fromHeaderValue( + PropagationTags.HeaderType.DATADOG, "_dd.p.anytag=value,_dd.p.dm=934086a686-4"); modifyPropagationTags = true; break; default: @@ -95,40 +91,37 @@ public void setUp(Blackhole blackhole) { } System.setProperty("dd.propagation.style.extract", propagations.toString()); - injector = - HttpCodec.createInjector( - Config.get(), Config.get().getTracePropagationStylesToInject(), Collections.emptyMap()); + injector = HttpCodec.createInjector( + Config.get(), Config.get().getTracePropagationStylesToInject(), Collections.emptyMap()); traceId = DDTraceId.from("12345"); spanId = DDSpanId.from("23456"); - tracer = - CoreTracer.builder() - .writer(new BlackholeWriter(blackhole, new TraceCounters(), 0)) - .strictTraceWrites(false) - .build(); - - spanContext = - new DDSpanContext( - traceId, - spanId, - DDSpanId.ZERO, - "", - "service", - "operation", - "resource", - 0, - "origin", - Collections.emptyMap(), - false, - "type", - 0, - tracer.createTraceCollector(traceId), - null, - null, - null, - false, - propagationTags); + tracer = CoreTracer.builder() + .writer(new BlackholeWriter(blackhole, new TraceCounters(), 0)) + .strictTraceWrites(false) + .build(); + + spanContext = new DDSpanContext( + traceId, + spanId, + DDSpanId.ZERO, + "", + "service", + "operation", + "resource", + 0, + "origin", + Collections.emptyMap(), + false, + "type", + 0, + tracer.createTraceCollector(traceId), + null, + null, + null, + false, + propagationTags); } int mechanism = 0; diff --git a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java index cceca8cb784..0d569149567 100644 --- a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java +++ b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java @@ -249,12 +249,11 @@ public RequestBody toRequest() { } RequestBody coverageBody = msgpackRequestBodyOf(buffers); - MultipartBody multipartBody = - new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart("coverage1", "coverage1.msgpack", coverageBody) - .addFormDataPart("event", "event.json", DUMMY_JSON_BODY) - .build(); + MultipartBody multipartBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("coverage1", "coverage1.msgpack", coverageBody) + .addFormDataPart("event", "event.json", DUMMY_JSON_BODY) + .build(); return compressionEnabled ? gzippedRequestBodyOf(multipartBody) : multipartBody; } diff --git a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java index ac110ca2e15..342458b3a08 100644 --- a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java +++ b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java @@ -66,9 +66,8 @@ public class CiTestCycleMapperV1 implements RemoteMapper { private static final UTF8BytesString SPAN_TYPE = UTF8BytesString.create("span"); - private static final Collection DEFAULT_TOP_LEVEL_TAGS = - Arrays.asList( - Tags.TEST_SESSION_ID, Tags.TEST_MODULE_ID, Tags.TEST_SUITE_ID, Tags.ITR_CORRELATION_ID); + private static final Collection DEFAULT_TOP_LEVEL_TAGS = Arrays.asList( + Tags.TEST_SESSION_ID, Tags.TEST_MODULE_ID, Tags.TEST_SUITE_ID, Tags.ITR_CORRELATION_ID); private final CiVisibilityWellKnownTags wellKnownTags; private final int size; @@ -155,12 +154,11 @@ public void map(List> trace, Writable writable) { version = 1; } - int contentChildrenCount = - 8 - + (traceId != null ? 1 : 0) - + (spanId != null ? 1 : 0) - + (parentId != null ? 1 : 0) - + topLevelTagsCount; + int contentChildrenCount = 8 + + (traceId != null ? 1 : 0) + + (spanId != null ? 1 : 0) + + (parentId != null ? 1 : 0) + + topLevelTagsCount; writable.startMap(3); /* 1 */ @@ -330,10 +328,9 @@ public void accept(Metadata metadata) { tags.remove(ignoredTag); } - int metaSize = - metadata.getBaggage().size() - + tags.size() - + (null == metadata.getHttpStatusCode() ? 0 : 1); + int metaSize = metadata.getBaggage().size() + + tags.size() + + (null == metadata.getHttpStatusCode() ? 0 : 1); int metricsSize = 0; for (Map.Entry tag : tags.entrySet()) { if (tag.getValue() instanceof Number) { diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AdditionalTagsSchema.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AdditionalTagsSchema.java index 1965f06d3ba..871ec584a72 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AdditionalTagsSchema.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AdditionalTagsSchema.java @@ -82,12 +82,11 @@ static AdditionalTagsSchema from(Set configured, int limit, boolean useB String[] namesArr = valid.toArray(new String[0]); TagCardinalityHandler[] handlersArr = new TagCardinalityHandler[namesArr.length]; for (int i = 0; i < namesArr.length; i++) { - handlersArr[i] = - new TagCardinalityHandler( - namesArr[i], - limit, - useBlockedSentinel, - MetricCardinalityLimits.ADDITIONAL_TAG_MAX_VALUE_LENGTH); + handlersArr[i] = new TagCardinalityHandler( + namesArr[i], + limit, + useBlockedSentinel, + MetricCardinalityLimits.ADDITIONAL_TAG_MAX_VALUE_LENGTH); } return new AdditionalTagsSchema(namesArr, handlersArr); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateEntry.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateEntry.java index 1214b246470..79638e7937b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateEntry.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateEntry.java @@ -50,7 +50,8 @@ public final class AggregateEntry extends Hashtable.Entry { // Null until first error; SerializingMetricWriter writes empty histogram form when null. Not // thread-safe as well. - @Nullable private Histogram errorLatencies; + @Nullable + private Histogram errorLatencies; private int errorCount; private int hitCount; @@ -545,10 +546,9 @@ AggregateEntry createEntry() { } else { snapshottedPeerTags = Arrays.asList(Arrays.copyOf(peerTagsBuffer, n)); } - UTF8BytesString[] snapshottedAdditionalTags = - additionalTagsSize == 0 - ? EMPTY_TAGS - : Arrays.copyOf(additionalTagsBuffer, additionalTagsSize); + UTF8BytesString[] snapshottedAdditionalTags = additionalTagsSize == 0 + ? EMPTY_TAGS + : Arrays.copyOf(additionalTagsBuffer, additionalTagsSize); return new AggregateEntry( keyHash, resource, diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java index dde42bd333d..2576668a3b4 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java @@ -185,12 +185,10 @@ private void report(long when, SignalItem signal) { if (!aggregates.isEmpty()) { skipped = false; writer.startBucket(aggregates.size(), when, reportingIntervalNanos); - aggregates.forEach( - writer, - (w, entry) -> { - w.add(entry); - entry.clearAggregate(); - }); + aggregates.forEach(writer, (w, entry) -> { + w.add(entry); + entry.clearAggregate(); + }); // note that this may do IO and block writer.finishBucket(); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/CardinalityLimitReporter.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/CardinalityLimitReporter.java index 215c278bef3..0a60507e8f8 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/CardinalityLimitReporter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/CardinalityLimitReporter.java @@ -81,14 +81,12 @@ void reportIfDue() { private String summarize() { StringBuilder builder = new StringBuilder(blockedByTag.size() * APPROX_CHARS_PER_ENTRY); // Non-capturing: the builder is threaded through as forEach's context argument. - blockedByTag.forEach( - builder, - (into, entry) -> { - if (into.length() > 0) { - into.append(", "); - } - into.append(entry.key()).append('=').append(entry.count); - }); + blockedByTag.forEach(builder, (into, entry) -> { + if (into.length() > 0) { + into.append(", "); + } + into.append(entry.key()).append('=').append(entry.count); + }); return builder.toString(); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/ClientStatsAggregator.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/ClientStatsAggregator.java index 88f6782e04c..48ac23340aa 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/ClientStatsAggregator.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/ClientStatsAggregator.java @@ -52,16 +52,18 @@ public final class ClientStatsAggregator implements MetricsAggregator, EventList private static final String SYNTHETICS_ORIGIN = "synthetics"; - private static final SpanKindFilter METRICS_ELIGIBLE_KINDS = - SpanKindFilter.builder() - .includeServer() - .includeClient() - .includeProducer() - .includeConsumer() - .build(); - - private static final SpanKindFilter PEER_AGGREGATION_KINDS = - SpanKindFilter.builder().includeClient().includeProducer().includeConsumer().build(); + private static final SpanKindFilter METRICS_ELIGIBLE_KINDS = SpanKindFilter.builder() + .includeServer() + .includeClient() + .includeProducer() + .includeConsumer() + .build(); + + private static final SpanKindFilter PEER_AGGREGATION_KINDS = SpanKindFilter.builder() + .includeClient() + .includeProducer() + .includeConsumer() + .build(); private static final SpanKindFilter INTERNAL_KIND = SpanKindFilter.builder().includeInternal().build(); @@ -279,16 +281,15 @@ private static AdditionalTagsSchema additionalTagsSchemaFrom(Config config) { this.healthMetrics = healthMetric; this.sink = sink; this.metricWriter = metricWriter; - this.aggregator = - new Aggregator( - metricWriter, - inbox, - maxAggregates, - reportingInterval, - timeUnit, - healthMetric, - additionalTagsSchema, - this::resetCardinalityHandlers); + this.aggregator = new Aggregator( + metricWriter, + inbox, + maxAggregates, + reportingInterval, + timeUnit, + healthMetric, + additionalTagsSchema, + this::resetCardinalityHandlers); this.thread = newAgentThread(METRICS_AGGREGATOR, aggregator); this.reportingInterval = reportingInterval; this.reportingIntervalTimeUnit = timeUnit; @@ -319,14 +320,13 @@ Aggregator aggregator() { public void start() { sink.register(this); thread.start(); - cancellation = - AgentTaskScheduler.get() - .scheduleAtFixedRate( - new ReportTask(), - this, - reportingInterval, - reportingInterval, - reportingIntervalTimeUnit); + cancellation = AgentTaskScheduler.get() + .scheduleAtFixedRate( + new ReportTask(), + this, + reportingInterval, + reportingInterval, + reportingIntervalTimeUnit); log.debug("started metrics aggregator"); } @@ -486,24 +486,23 @@ private boolean publish(CoreSpan span, boolean isTopLevel, PeerTagSchema peer String[] additionalTagValues = captureAdditionalTagValues(span); - SpanSnapshot snapshot = - new SpanSnapshot( - span.getResourceName(), - span.getServiceName(), - span.getOperationName(), - span.getServiceNameSource(), - spanType, - span.getHttpStatusCode(), - isSynthetic(span), - span.getParentId() == 0, - spanKind, - spanPeerTagSchema, - peerTagValues, - httpMethod, - httpEndpoint, - grpcStatusCode, - additionalTagValues, - tagAndDuration); + SpanSnapshot snapshot = new SpanSnapshot( + span.getResourceName(), + span.getServiceName(), + span.getOperationName(), + span.getServiceNameSource(), + spanType, + span.getHttpStatusCode(), + isSynthetic(span), + span.getParentId() == 0, + spanKind, + spanPeerTagSchema, + peerTagValues, + httpMethod, + httpEndpoint, + grpcStatusCode, + additionalTagValues, + tagAndDuration); if (!inbox.offer(snapshot)) { healthMetrics.onStatsInboxFull(); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/CoreHandlers.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/CoreHandlers.java index fc6223157ca..a9e9dc3a382 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/CoreHandlers.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/CoreHandlers.java @@ -27,66 +27,54 @@ final class CoreHandlers { CoreHandlers() { Config config = Config.get(); // Configurable limits — tunable via env var. - this.resource = - new PropertyCardinalityHandler( - "resource", - config.getTraceStatsCardinalityLimit("resource", MetricCardinalityLimits.RESOURCE), - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); - this.httpEndpoint = - new PropertyCardinalityHandler( - "http_endpoint", - config.getTraceStatsCardinalityLimit( - "http_endpoint", MetricCardinalityLimits.HTTP_ENDPOINT), - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.resource = new PropertyCardinalityHandler( + "resource", + config.getTraceStatsCardinalityLimit("resource", MetricCardinalityLimits.RESOURCE), + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.httpEndpoint = new PropertyCardinalityHandler( + "http_endpoint", + config.getTraceStatsCardinalityLimit( + "http_endpoint", MetricCardinalityLimits.HTTP_ENDPOINT), + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); // Fixed limits — hardcoded, not user-configurable. - this.service = - new PropertyCardinalityHandler( - "service", - MetricCardinalityLimits.SERVICE, - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.service = new PropertyCardinalityHandler( + "service", MetricCardinalityLimits.SERVICE, MetricCardinalityLimits.USE_BLOCKED_SENTINEL); // operation is carried on the stats wire as the protobuf field "name", so its telemetry tag is // collapsed:name (RFC section 5) while the human-facing reporter keeps the clearer "operation". - this.operation = - new PropertyCardinalityHandler( - "operation", - "name", - MetricCardinalityLimits.OPERATION, - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); - this.serviceSource = - new PropertyCardinalityHandler( - "service_source", - MetricCardinalityLimits.SERVICE_SOURCE, - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); - this.type = - new PropertyCardinalityHandler( - "type", MetricCardinalityLimits.TYPE, MetricCardinalityLimits.USE_BLOCKED_SENTINEL); - this.spanKind = - new PropertyCardinalityHandler( - "span_kind", - MetricCardinalityLimits.SPAN_KIND, - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); - this.httpMethod = - new PropertyCardinalityHandler( - "http_method", - MetricCardinalityLimits.HTTP_METHOD, - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); - this.grpcStatusCode = - new PropertyCardinalityHandler( - "grpc_status_code", - MetricCardinalityLimits.GRPC_STATUS_CODE, - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); - this.handlers = - new PropertyCardinalityHandler[] { - resource, - service, - operation, - serviceSource, - type, - spanKind, - httpMethod, - httpEndpoint, - grpcStatusCode - }; + this.operation = new PropertyCardinalityHandler( + "operation", + "name", + MetricCardinalityLimits.OPERATION, + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.serviceSource = new PropertyCardinalityHandler( + "service_source", + MetricCardinalityLimits.SERVICE_SOURCE, + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.type = new PropertyCardinalityHandler( + "type", MetricCardinalityLimits.TYPE, MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.spanKind = new PropertyCardinalityHandler( + "span_kind", + MetricCardinalityLimits.SPAN_KIND, + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.httpMethod = new PropertyCardinalityHandler( + "http_method", + MetricCardinalityLimits.HTTP_METHOD, + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.grpcStatusCode = new PropertyCardinalityHandler( + "grpc_status_code", + MetricCardinalityLimits.GRPC_STATUS_CODE, + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.handlers = new PropertyCardinalityHandler[] { + resource, + service, + operation, + serviceSource, + type, + spanKind, + httpMethod, + httpEndpoint, + grpcStatusCode + }; } void reset(HealthMetrics healthMetrics, CardinalityLimitReporter reporter) { diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/MetricsAggregatorFactory.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/MetricsAggregatorFactory.java index afd25d9566a..266c2e9c140 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/MetricsAggregatorFactory.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/MetricsAggregatorFactory.java @@ -22,23 +22,21 @@ public static MetricsAggregator createMetricsAggregator( // the injected MetricWriter. if (config.isOtelTracesSpanMetricsEnabled()) { if (config.isTracerMetricsEnabled()) { - log.warn( - "Both OTLP trace span metrics and native tracer metrics are enabled; " - + "using OTLP export and ignoring native tracer metrics (the two are mutually " - + "exclusive)."); + log.warn("Both OTLP trace span metrics and native tracer metrics are enabled; " + + "using OTLP export and ignoring native tracer metrics (the two are mutually " + + "exclusive)."); } if (!config.isMetricsOtlpExporterEnabled()) { - log.warn( - "OTLP trace span metrics are enabled but the OTLP metrics exporter is not enabled " - + "(" - + METRICS_OTEL_EXPORTER - + " is not 'otlp'); span metrics will still be exported over " - + "OTLP using the otlp.metrics.* transport settings. Set " - + METRICS_OTEL_EXPORTER - + "=otlp " - + "to make this explicit, or disable " - + OTEL_TRACES_SPAN_METRICS_ENABLED - + " to suppress them."); + log.warn("OTLP trace span metrics are enabled but the OTLP metrics exporter is not enabled " + + "(" + + METRICS_OTEL_EXPORTER + + " is not 'otlp'); span metrics will still be exported over " + + "OTLP using the otlp.metrics.* transport settings. Set " + + METRICS_OTEL_EXPORTER + + "=otlp " + + "to make this explicit, or disable " + + OTEL_TRACES_SPAN_METRICS_ENABLED + + " to suppress them."); } log.debug("OTLP trace span metrics enabled"); return new ClientStatsAggregator( diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/OkHttpSink.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/OkHttpSink.java index 193a2fb0436..aa3fd9bb9c7 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/OkHttpSink.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/OkHttpSink.java @@ -83,9 +83,8 @@ public void accept(int messageCount, ByteBuffer buffer) { } } else { if (asyncTaskStarted.compareAndSet(false, true)) { - this.future = - AgentTaskScheduler.get() - .scheduleAtFixedRate(new Sender(enqueuedRequests), this, 1, 1, SECONDS); + this.future = AgentTaskScheduler.get() + .scheduleAtFixedRate(new Sender(enqueuedRequests), this, 1, 1, SECONDS); } sendAsync(messageCount, buffer); } @@ -101,8 +100,9 @@ private RequestBody makeRequestBody(ByteBuffer buffer) { private void sendAsync(int messageCount, ByteBuffer buffer) { asyncRequestCounter.getAndIncrement(); - if (!enqueuedRequests.offer( - prepareRequest(metricsUrl, headers).post(makeRequestBody(buffer.duplicate())).build())) { + if (!enqueuedRequests.offer(prepareRequest(metricsUrl, headers) + .post(makeRequestBody(buffer.duplicate())) + .build())) { log.debug( "dropping payload of {} and {}B because sending queue was full", messageCount, diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/PeerTagSchema.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/PeerTagSchema.java index 28d317daf35..5cb1ad8412f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/PeerTagSchema.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/PeerTagSchema.java @@ -82,13 +82,11 @@ static PeerTagSchema of(Set names, String state) { this.state = state; this.handlers = new TagCardinalityHandler[names.length]; for (int i = 0; i < names.length; i++) { - this.handlers[i] = - new TagCardinalityHandler( - names[i], - Config.get() - .getTraceStatsCardinalityLimit( - "peer_tags", MetricCardinalityLimits.PEER_TAG_VALUE), - MetricCardinalityLimits.USE_BLOCKED_SENTINEL); + this.handlers[i] = new TagCardinalityHandler( + names[i], + Config.get() + .getTraceStatsCardinalityLimit("peer_tags", MetricCardinalityLimits.PEER_TAG_VALUE), + MetricCardinalityLimits.USE_BLOCKED_SENTINEL); } } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java index 3eacde8bd45..8b34ece91f9 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java @@ -55,10 +55,9 @@ public final class SerializingMetricWriter implements MetricWriter { public static final int TRISTATE_FALSE = TriState.FALSE.serialValue; private static final Function SHA_COMMIT_GETTER = - gitInfo -> - gitInfo.getCommit() != null && gitInfo.getCommit().getSha() != null - ? UTF8BytesString.create(gitInfo.getCommit().getSha()) - : EMPTY; + gitInfo -> gitInfo.getCommit() != null && gitInfo.getCommit().getSha() != null + ? UTF8BytesString.create(gitInfo.getCommit().getSha()) + : EMPTY; private final WellKnownTags wellKnownTags; private final WritableFormatter writer; @@ -186,13 +185,12 @@ public void add(AggregateEntry entry) { final UTF8BytesString[] additionalTags = entry.getAdditionalTags(); // When the feature is configured the field is always emitted (empty array for entries that // matched no key); when it is off the field is omitted entirely so non-users pay nothing. - final int mapSize = - 15 - + (hasServiceSource ? 1 : 0) - + (hasHttpMethod ? 1 : 0) - + (hasHttpEndpoint ? 1 : 0) - + (hasGrpcStatusCode ? 1 : 0) - + (additionalTagsConfigured ? 1 : 0); + final int mapSize = 15 + + (hasServiceSource ? 1 : 0) + + (hasHttpMethod ? 1 : 0) + + (hasHttpEndpoint ? 1 : 0) + + (hasGrpcStatusCode ? 1 : 0) + + (additionalTagsConfigured ? 1 : 0); writer.startMap(mapSize); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/TagCardinalityHandler.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/TagCardinalityHandler.java index bf116a8fdaa..bc46685cea9 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/TagCardinalityHandler.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/TagCardinalityHandler.java @@ -142,10 +142,9 @@ UTF8BytesString register(String value) { } // Reuse the previous encoded "tag:value" UTF8 value if present; otherwise // create it from the fixed tag name and the raw value. - UTF8BytesString utf8 = - priorKey != null - ? this.priorValues[priorSlot] - : UTF8BytesString.create(this.tag + ":" + value); + UTF8BytesString utf8 = priorKey != null + ? this.priorValues[priorSlot] + : UTF8BytesString.create(this.tag + ":" + value); // If still within budget, remember the raw value and its encoded UTF8 // output in the current-cycle table. if (!capExhausted) { diff --git a/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java b/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java index 0940469c61c..c1c6c20f551 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java @@ -136,10 +136,9 @@ public void onResponse( } fallbackSampler = RateByServiceTraceSampler.createRateSampler(rate); } else { - double oldRate = - currentSnapshot - .getSampler(envAndService.lowerEnv, envAndService.lowerService) - .getSampleRate(); + double oldRate = currentSnapshot + .getSampler(envAndService.lowerEnv, envAndService.lowerService) + .getSampleRate(); if (shouldCap(oldRate, rate)) { if (canIncrease) { rate = cappedRate(oldRate); @@ -149,9 +148,8 @@ public void onResponse( } } final double effectiveRate = rate; - Map serviceRates = - updatedEnvServiceRates.computeIfAbsent( - envAndService.lowerEnv, env -> new TreeMap<>(String::compareToIgnoreCase)); + Map serviceRates = updatedEnvServiceRates.computeIfAbsent( + envAndService.lowerEnv, env -> new TreeMap<>(String::compareToIgnoreCase)); serviceRates.computeIfAbsent( envAndService.lowerService, diff --git a/dd-trace-core/src/main/java/datadog/trace/common/sampling/RuleBasedTraceSampler.java b/dd-trace-core/src/main/java/datadog/trace/common/sampling/RuleBasedTraceSampler.java index 1746a1a3c54..c74cb291009 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/sampling/RuleBasedTraceSampler.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/sampling/RuleBasedTraceSampler.java @@ -61,14 +61,13 @@ public static RuleBasedTraceSampler build( } // Ignore serviceRules & operationRules if traceSamplingRules are defined for (SamplingRule.TraceSamplingRule rule : traceSamplingRules) { - RateSamplingRule.TraceSamplingRule samplingRule = - new RateSamplingRule.TraceSamplingRule( - rule.getService(), - rule.getName(), - rule.getResource(), - rule.getTags(), - new DeterministicSampler.TraceSampler(rule.getSampleRate()), - samplingMechanism(rule.getProvenance())); + RateSamplingRule.TraceSamplingRule samplingRule = new RateSamplingRule.TraceSamplingRule( + rule.getService(), + rule.getName(), + rule.getResource(), + rule.getTags(), + new DeterministicSampler.TraceSampler(rule.getSampleRate()), + samplingMechanism(rule.getProvenance())); samplingRules.add(samplingRule); } } else { @@ -77,9 +76,8 @@ public static RuleBasedTraceSampler build( for (final Entry entry : serviceRules.entrySet()) { try { final double rateForEntry = Double.parseDouble(entry.getValue()); - final RateSamplingRule samplingRule = - new RateSamplingRule.ServiceSamplingRule( - entry.getKey(), new DeterministicSampler.TraceSampler(rateForEntry)); + final RateSamplingRule samplingRule = new RateSamplingRule.ServiceSamplingRule( + entry.getKey(), new DeterministicSampler.TraceSampler(rateForEntry)); samplingRules.add(samplingRule); } catch (final NumberFormatException e) { log.error("Unable to parse rate for service: {}", entry, e); @@ -91,9 +89,8 @@ public static RuleBasedTraceSampler build( for (final Entry entry : operationRules.entrySet()) { try { final double rateForEntry = Double.parseDouble(entry.getValue()); - final RateSamplingRule samplingRule = - new RateSamplingRule.OperationSamplingRule( - entry.getKey(), new DeterministicSampler.TraceSampler(rateForEntry)); + final RateSamplingRule samplingRule = new RateSamplingRule.OperationSamplingRule( + entry.getKey(), new DeterministicSampler.TraceSampler(rateForEntry)); samplingRules.add(samplingRule); } catch (final NumberFormatException e) { log.error("Unable to parse rate for operation: {}", entry, e); @@ -106,10 +103,8 @@ public static RuleBasedTraceSampler build( // remote rule, // but that's not currenlty part of the spec. if (defaultRate != null) { - final RateSamplingRule samplingRule = - new RateSamplingRule.AlwaysMatchesSamplingRule( - new DeterministicSampler.TraceSampler(defaultRate), - SamplingMechanism.LOCAL_USER_RULE); + final RateSamplingRule samplingRule = new RateSamplingRule.AlwaysMatchesSamplingRule( + new DeterministicSampler.TraceSampler(defaultRate), SamplingMechanism.LOCAL_USER_RULE); samplingRules.add(samplingRule); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java b/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java index 823f0d4959b..0a1827e3963 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/sampling/Sampler.java @@ -69,13 +69,12 @@ public static Sampler forConfig(final Config config, final TraceConfig traceConf || traceSamplingRulesDefined || traceSampleRate != null) { try { - sampler = - RuleBasedTraceSampler.build( - serviceRules, - operationRules, - traceSamplingRules, - traceSampleRate, - config.getTraceRateLimit()); + sampler = RuleBasedTraceSampler.build( + serviceRules, + operationRules, + traceSamplingRules, + traceSampleRate, + config.getTraceRateLimit()); } catch (final IllegalArgumentException e) { log.error("Invalid sampler configuration. Using AllSampler", e); sampler = new AllSampler(); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/sampling/SingleSpanSampler.java b/dd-trace-core/src/main/java/datadog/trace/common/sampling/SingleSpanSampler.java index e8fdd7eb2fb..033c1938e16 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/sampling/SingleSpanSampler.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/sampling/SingleSpanSampler.java @@ -62,13 +62,11 @@ public RuleBasedSingleSpanSampler(SpanSamplingRules rules) { this.spanSamplingRules = new ArrayList<>(); for (SpanSamplingRules.Rule rule : rules.getRules()) { RateSampler sampler = new DeterministicSampler.SpanSampler(rule.getSampleRate()); - SimpleRateLimiter simpleRateLimiter = - rule.getMaxPerSecond() == Integer.MAX_VALUE - ? null - : new SimpleRateLimiter(rule.getMaxPerSecond()); - RateSamplingRule.SpanSamplingRule spanSamplingRule = - new RateSamplingRule.SpanSamplingRule( - rule.getService(), rule.getName(), sampler, simpleRateLimiter); + SimpleRateLimiter simpleRateLimiter = rule.getMaxPerSecond() == Integer.MAX_VALUE + ? null + : new SimpleRateLimiter(rule.getMaxPerSecond()); + RateSamplingRule.SpanSamplingRule spanSamplingRule = new RateSamplingRule.SpanSamplingRule( + rule.getService(), rule.getName(), sampler, simpleRateLimiter); spanSamplingRules.add(spanSamplingRule); } } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java index d0fbc11cda8..c9890df8350 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java @@ -151,40 +151,36 @@ public DDAgentWriterBuilder spanSamplingRules(SingleSpanSampler singleSpanSample public DDAgentWriter build() { final HttpUrl agentUrl = HttpUrl.get("http://" + agentHost + ":" + traceAgentPort); - final OkHttpClient client = - null == featureDiscovery || null == agentApi - ? buildHttpClient(true, unixDomainSocket, namedPipe, timeoutMillis) - : null; + final OkHttpClient client = null == featureDiscovery || null == agentApi + ? buildHttpClient(true, unixDomainSocket, namedPipe, timeoutMillis) + : null; if (null == featureDiscovery) { - featureDiscovery = - new DDAgentFeaturesDiscovery( - client, - monitoring, - agentUrl, - protocolVersion, - nativeMetricsReportingEnabled, - metricsIgnoreAgentVersion); + featureDiscovery = new DDAgentFeaturesDiscovery( + client, + monitoring, + agentUrl, + protocolVersion, + nativeMetricsReportingEnabled, + metricsIgnoreAgentVersion); } if (null == agentApi) { - agentApi = - new DDAgentApi( - client, agentUrl, featureDiscovery, monitoring, nativeMetricsReportingEnabled); + agentApi = new DDAgentApi( + client, agentUrl, featureDiscovery, monitoring, nativeMetricsReportingEnabled); } final DDAgentMapperDiscovery mapperDiscovery = new DDAgentMapperDiscovery(featureDiscovery); final PayloadDispatcher dispatcher = new PayloadDispatcherImpl(mapperDiscovery, agentApi, healthMetrics, monitoring); - final TraceProcessingWorker traceProcessingWorker = - new TraceProcessingWorker( - traceBufferSize, - healthMetrics, - dispatcher, - // allow custom dropping policy for OTLP; otherwise fall back to feature discovery - droppingPolicy != null ? droppingPolicy : featureDiscovery, - null == prioritization ? FAST_LANE : prioritization, - flushIntervalMilliseconds, - TimeUnit.MILLISECONDS, - singleSpanSampler); + final TraceProcessingWorker traceProcessingWorker = new TraceProcessingWorker( + traceBufferSize, + healthMetrics, + dispatcher, + // allow custom dropping policy for OTLP; otherwise fall back to feature discovery + droppingPolicy != null ? droppingPolicy : featureDiscovery, + null == prioritization ? FAST_LANE : prioritization, + flushIntervalMilliseconds, + TimeUnit.MILLISECONDS, + singleSpanSampler); return new DDAgentWriter( traceProcessingWorker, diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java index c75ef712ae2..8d11c6d7b89 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDIntakeWriter.java @@ -106,23 +106,21 @@ public DDIntakeWriter build() { if (tracks.size() == 1) { dispatcher = createDispatcher(tracks.entrySet().iterator().next()); } else { - PayloadDispatcher[] dispatchers = - tracks.entrySet().stream() - .map(this::createDispatcher) - .toArray(PayloadDispatcher[]::new); + PayloadDispatcher[] dispatchers = tracks.entrySet().stream() + .map(this::createDispatcher) + .toArray(PayloadDispatcher[]::new); dispatcher = new CompositePayloadDispatcher(dispatchers); } - final TraceProcessingWorker traceProcessingWorker = - new TraceProcessingWorker( - traceBufferSize, - healthMetrics, - dispatcher, - droppingPolicy, - prioritization, - flushIntervalMilliseconds, - TimeUnit.MILLISECONDS, - singleSpanSampler); + final TraceProcessingWorker traceProcessingWorker = new TraceProcessingWorker( + traceBufferSize, + healthMetrics, + dispatcher, + droppingPolicy, + prioritization, + flushIntervalMilliseconds, + TimeUnit.MILLISECONDS, + singleSpanSampler); return new DDIntakeWriter( traceProcessingWorker, diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDSpanJsonAdapter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDSpanJsonAdapter.java index c1e5cb4db1c..51bcbacd15a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/DDSpanJsonAdapter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/DDSpanJsonAdapter.java @@ -75,7 +75,8 @@ public void toJson(final com.squareup.moshi.JsonWriter writer, final DDSpan span writer.name("meta"); writer.beginObject(); final Map tags = span.getTags(); - for (final Map.Entry entry : span.spanContext().getBaggageItems().entrySet()) { + for (final Map.Entry entry : + span.spanContext().getBaggageItems().entrySet()) { if (!tags.containsKey(entry.getKey())) { writer.name(entry.getKey()); writer.value(entry.getValue()); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/FileBasedPayloadDispatcher.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/FileBasedPayloadDispatcher.java index 810952292b8..3d114583de7 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/FileBasedPayloadDispatcher.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/FileBasedPayloadDispatcher.java @@ -54,9 +54,8 @@ public class FileBasedPayloadDispatcher implements PayloadDispatcher { private static final Logger log = LoggerFactory.getLogger(FileBasedPayloadDispatcher.class); - private static final Collection TOP_LEVEL_TAGS = - Arrays.asList( - Tags.TEST_SESSION_ID, Tags.TEST_MODULE_ID, Tags.TEST_SUITE_ID, Tags.ITR_CORRELATION_ID); + private static final Collection TOP_LEVEL_TAGS = Arrays.asList( + Tags.TEST_SESSION_ID, Tags.TEST_MODULE_ID, Tags.TEST_SUITE_ID, Tags.ITR_CORRELATION_ID); /** Tag prefixes excluded from file-based payloads to avoid Bazel cache invalidation. */ private static final String[] EXCLUDED_TAG_PREFIXES = {"ci.", "git.", "runtime.", "os."}; diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java index 7c151dab5c4..d5933fa2f3f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java @@ -90,13 +90,12 @@ public boolean waitForTracesMax(final int number, int seconds) throws Interrupte public void waitForTraces(final int number) throws InterruptedException, TimeoutException { if (!waitForTracesMax(number, 20)) { - String msg = - "Timeout waiting for " - + number - + " trace(s). ListWriter.size() == " - + size() - + " : " - + super.toString(); + String msg = "Timeout waiting for " + + number + + " trace(s). ListWriter.size() == " + + size() + + " : " + + super.toString(); log.warn(msg); throw new TimeoutException(msg); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/LoggingWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/LoggingWriter.java index 24a6361db37..902cb9826b2 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/LoggingWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/LoggingWriter.java @@ -11,11 +11,10 @@ public class LoggingWriter implements Writer { private static final Logger log = LoggerFactory.getLogger(LoggingWriter.class); - private static final JsonAdapter> TRACE_ADAPTER = - new Moshi.Builder() - .add(DDSpanJsonAdapter.buildFactory(false)) - .build() - .adapter(Types.newParameterizedType(List.class, DDSpan.class)); + private static final JsonAdapter> TRACE_ADAPTER = new Moshi.Builder() + .add(DDSpanJsonAdapter.buildFactory(false)) + .build() + .adapter(Types.newParameterizedType(List.class, DDSpan.class)); @Override public void write(final List trace) { diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/MultiWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/MultiWriter.java index 3e3a10c4833..a24622204af 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/MultiWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/MultiWriter.java @@ -31,9 +31,8 @@ public MultiWriter( int i = 0; for (String writerConfig : writerConfigs) { - writers[i] = - WriterFactory.createWriter( - config, commObjects, sampler, singleSpanSampler, healthMetrics, writerConfig); + writers[i] = WriterFactory.createWriter( + config, commObjects, sampler, singleSpanSampler, healthMetrics, writerConfig); i++; } } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java index 1650a77b52a..465d795a88d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/OtlpWriter.java @@ -128,29 +128,26 @@ OtlpWriterBuilder sender(OtlpSender sender) { public OtlpWriter build() { if (sender == null) { - sender = - protocol == OtlpConfig.Protocol.GRPC - ? new OtlpGrpcSender( - endpoint, GRPC_TRACES_SIGNAL_PATH, headers, timeoutMillis, compression) - : new OtlpHttpSender( - endpoint, HTTP_TRACES_SIGNAL_PATH, headers, timeoutMillis, compression); + sender = protocol == OtlpConfig.Protocol.GRPC + ? new OtlpGrpcSender( + endpoint, GRPC_TRACES_SIGNAL_PATH, headers, timeoutMillis, compression) + : new OtlpHttpSender( + endpoint, HTTP_TRACES_SIGNAL_PATH, headers, timeoutMillis, compression); } - final OtlpTraceCollector collector = - protocol == OtlpConfig.Protocol.HTTP_JSON - ? new OtlpTraceJsonCollector() - : new OtlpTraceProtoCollector(); + final OtlpTraceCollector collector = protocol == OtlpConfig.Protocol.HTTP_JSON + ? new OtlpTraceJsonCollector() + : new OtlpTraceProtoCollector(); final OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector); - final TraceProcessingWorker worker = - new TraceProcessingWorker( - traceBufferSize, - HealthMetrics.NO_OP, - dispatcher, - DroppingPolicy.DISABLED, - Prioritization.FAST_LANE, - flushIntervalMilliseconds, - TimeUnit.MILLISECONDS, - singleSpanSampler); + final TraceProcessingWorker worker = new TraceProcessingWorker( + traceBufferSize, + HealthMetrics.NO_OP, + dispatcher, + DroppingPolicy.DISABLED, + Prioritization.FAST_LANE, + flushIntervalMilliseconds, + TimeUnit.MILLISECONDS, + singleSpanSampler); return new OtlpWriter( worker, dispatcher, sender, flushTimeout, flushTimeoutUnit, alwaysFlush); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/PrintingWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/PrintingWriter.java index e882abcd5e8..37705eae90d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/PrintingWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/PrintingWriter.java @@ -20,16 +20,14 @@ public class PrintingWriter implements Writer { public PrintingWriter(final OutputStream outputStream, final boolean hexIds) { sink = Okio.buffer(Okio.sink(outputStream)); - this.jsonAdapter = - new Moshi.Builder() - .add(DDSpanJsonAdapter.buildFactory(hexIds)) - .build() - .adapter( - Types.newParameterizedType( - Map.class, - String.class, - Types.newParameterizedType( - List.class, Types.newParameterizedType(List.class, DDSpan.class)))); + this.jsonAdapter = new Moshi.Builder() + .add(DDSpanJsonAdapter.buildFactory(hexIds)) + .build() + .adapter(Types.newParameterizedType( + Map.class, + String.class, + Types.newParameterizedType( + List.class, Types.newParameterizedType(List.class, DDSpan.class)))); } @Override diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/RemoteApi.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/RemoteApi.java index 72d4562d7f1..d9ac00146ff 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/RemoteApi.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/RemoteApi.java @@ -41,9 +41,8 @@ protected void countAndLogFailedSend( failedTraces += traceCount; // these are used to catch and log if there is a failure in debug logging the response body String responseBody = getResponseBody(response); - String sendErrorString = - createSendLogMessage( - traceCount, sizeInBytes, responseBody.isEmpty() ? "Error" : responseBody); + String sendErrorString = createSendLogMessage( + traceCount, sizeInBytes, responseBody.isEmpty() ? "Error" : responseBody); ioLogger.error(sendErrorString, toLoggerResponse(response, responseBody), outer); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceDumpJsonExporter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceDumpJsonExporter.java index e2b3c0fc976..3905105ef5d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceDumpJsonExporter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceDumpJsonExporter.java @@ -12,11 +12,10 @@ public class TraceDumpJsonExporter implements Writer { - private static final JsonAdapter> TRACE_ADAPTER = - new Moshi.Builder() - .add(DDSpanJsonAdapter.buildFactory(false)) - .build() - .adapter(Types.newParameterizedType(Collection.class, DDSpan.class)); + private static final JsonAdapter> TRACE_ADAPTER = new Moshi.Builder() + .add(DDSpanJsonAdapter.buildFactory(false)) + .build() + .adapter(Types.newParameterizedType(Collection.class, DDSpan.class)); private StringBuilder dumpText; private ZipOutputStream zip; diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceProcessingWorker.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceProcessingWorker.java index 9b70b09bc9e..04728cb198d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceProcessingWorker.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceProcessingWorker.java @@ -58,24 +58,13 @@ public TraceProcessingWorker( this.capacity = capacity; this.primaryQueue = createQueue(capacity); this.secondaryQueue = createQueue(capacity); - this.spanSamplingWorker = - SpanSamplingWorker.build( - capacity, - primaryQueue, - secondaryQueue, - singleSpanSampler, - healthMetrics, - droppingPolicy); - this.prioritizationStrategy = - prioritization.create( - primaryQueue, - secondaryQueue, - spanSamplingWorker.getSpanSamplingQueue(), - droppingPolicy); + this.spanSamplingWorker = SpanSamplingWorker.build( + capacity, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, droppingPolicy); + this.prioritizationStrategy = prioritization.create( + primaryQueue, secondaryQueue, spanSamplingWorker.getSpanSamplingQueue(), droppingPolicy); - this.serializingHandler = - new TraceSerializingHandler( - primaryQueue, secondaryQueue, healthMetrics, dispatcher, flushInterval, timeUnit); + this.serializingHandler = new TraceSerializingHandler( + primaryQueue, secondaryQueue, healthMetrics, dispatcher, flushInterval, timeUnit); this.serializerThread = newAgentThread(TRACE_PROCESSOR, serializingHandler); } @@ -263,16 +252,15 @@ private void maybeTracePostProcessing(List trace) { final long timeout = Config.get().getTracePostProcessingTimeout(); final long deadline = System.nanoTime() + timeout * 1000 * 1000; final boolean[] timedOut = {false}; - final BooleanSupplier timeoutCheck = - () -> { - if (timedOut[0]) { - return true; - } - if (System.nanoTime() > deadline) { - timedOut[0] = true; - } - return timedOut[0]; - }; + final BooleanSupplier timeoutCheck = () -> { + if (timedOut[0]) { + return true; + } + if (System.nanoTime() > deadline) { + timedOut[0] = true; + } + return timedOut[0]; + }; for (DDSpan span : trace) { postProcessor.process(span, timeoutCheck); } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java index f5cb0d2a978..b10b5548b40 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/TraceStructureWriter.java @@ -117,16 +117,15 @@ public void write(List trace) { // build the tree for (DDSpan span : trace) { if (!traceId.equals(span.getTraceId())) { - String message = - "Trace " - + traceId - + " has broken trace link at " - + span.getSpanId() - + "(" - + span.getOperationName() - + ")" - + "->" - + span.getTraceId(); + String message = "Trace " + + traceId + + " has broken trace link at " + + span.getSpanId() + + "(" + + span.getOperationName() + + ")" + + "->" + + span.getTraceId(); out.println("ERROR: " + message); if (debugLog) { log.error(message); @@ -136,16 +135,15 @@ public void write(List trace) { if (rootSpanId != span.getSpanId()) { Node parent = nodesById.get(span.getParentId()); if (null == parent) { - String message = - "Trace " - + traceId - + " has broken parent link at " - + span.getSpanId() - + "(" - + span.getOperationName() - + ")" - + "->" - + span.getParentId(); + String message = "Trace " + + traceId + + " has broken parent link at " + + span.getSpanId() + + "(" + + span.getOperationName() + + ")" + + "->" + + span.getParentId(); out.println("ERROR: " + message); if (debugLog) { log.error(message); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/WriterFactory.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/WriterFactory.java index 73875a0e408..799e10c854d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/WriterFactory.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/WriterFactory.java @@ -108,16 +108,15 @@ public static Writer createWriter( PayloadDispatcher dispatcher = createCiVisBazelPayloadDispatcher(testsDir, coverageDir); - TraceProcessingWorker worker = - new TraceProcessingWorker( - 1024, - healthMetrics, - dispatcher, - DroppingPolicy.DISABLED, - prioritization, - flushIntervalMilliseconds, - TimeUnit.MILLISECONDS, - singleSpanSampler); + TraceProcessingWorker worker = new TraceProcessingWorker( + 1024, + healthMetrics, + dispatcher, + DroppingPolicy.DISABLED, + prioritization, + flushIntervalMilliseconds, + TimeUnit.MILLISECONDS, + singleSpanSampler); return new DDIntakeWriter(worker, dispatcher, healthMetrics, 5, TimeUnit.SECONDS, false); } @@ -140,14 +139,13 @@ public static Writer createWriter( final RemoteApi remoteApi = createDDIntakeRemoteApi(config, commObjects, featuresDiscovery, trackType); - DDIntakeWriter.DDIntakeWriterBuilder builder = - DDIntakeWriter.builder() - .addTrack(trackType, remoteApi) - .prioritization(prioritization) - .healthMetrics(healthMetrics) - .monitoring(commObjects.monitoring) - .singleSpanSampler(singleSpanSampler) - .flushIntervalMilliseconds(flushIntervalMilliseconds); + DDIntakeWriter.DDIntakeWriterBuilder builder = DDIntakeWriter.builder() + .addTrack(trackType, remoteApi) + .prioritization(prioritization) + .healthMetrics(healthMetrics) + .monitoring(commObjects.monitoring) + .singleSpanSampler(singleSpanSampler) + .flushIntervalMilliseconds(flushIntervalMilliseconds); if (config.isCiVisibilityEnabled()) { builder.flushTimeout(5, TimeUnit.SECONDS); @@ -180,13 +178,12 @@ public static Writer createWriter( } } - DDAgentApi ddAgentApi = - new DDAgentApi( - commObjects.agentHttpClient, - commObjects.agentUrl, - featuresDiscovery, - commObjects.monitoring, - config.isTracerMetricsEnabled()); + DDAgentApi ddAgentApi = new DDAgentApi( + commObjects.agentHttpClient, + commObjects.agentUrl, + featuresDiscovery, + commObjects.monitoring, + config.isTracerMetricsEnabled()); if (sampler instanceof RemoteResponseListener) { ddAgentApi.addResponseListener((RemoteResponseListener) sampler); @@ -198,17 +195,16 @@ public static Writer createWriter( final DroppingPolicy droppingPolicy = () -> otlpSpanMetricsEnabled || featuresDiscovery.active(); - DDAgentWriter.DDAgentWriterBuilder builder = - DDAgentWriter.builder() - .agentApi(ddAgentApi) - .featureDiscovery(featuresDiscovery) - .droppingPolicy(droppingPolicy) - .prioritization(prioritization) - .healthMetrics(healthMetrics) - .monitoring(commObjects.monitoring) - .alwaysFlush(alwaysFlush) - .spanSamplingRules(singleSpanSampler) - .flushIntervalMilliseconds(flushIntervalMilliseconds); + DDAgentWriter.DDAgentWriterBuilder builder = DDAgentWriter.builder() + .agentApi(ddAgentApi) + .featureDiscovery(featuresDiscovery) + .droppingPolicy(droppingPolicy) + .prioritization(prioritization) + .healthMetrics(healthMetrics) + .monitoring(commObjects.monitoring) + .alwaysFlush(alwaysFlush) + .spanSamplingRules(singleSpanSampler) + .flushIntervalMilliseconds(flushIntervalMilliseconds); if (config.isCiVisibilityEnabled()) { builder.flushTimeout(5, TimeUnit.SECONDS); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java index 8907e634cfc..fbf5781431f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java @@ -51,11 +51,10 @@ public class DDAgentApi extends RemoteApi { private static final JsonAdapter>> RESPONSE_ADAPTER = new Moshi.Builder() .build() - .adapter( - Types.newParameterizedType( - Map.class, - String.class, - Types.newParameterizedType(Map.class, String.class, Double.class))); + .adapter(Types.newParameterizedType( + Map.class, + String.class, + Types.newParameterizedType(Map.class, String.class, Double.class))); private final DDAgentFeaturesDiscovery featuresDiscovery; private final OkHttpClient httpClient; @@ -102,22 +101,21 @@ public Response sendSerializedTraces(final Payload payload) { HttpUrl tracesUrl = agentUrl.resolve(tracesEndpoint); try { - final Request request = - prepareRequest(tracesUrl, headers) - .addHeader(X_DATADOG_TRACE_COUNT, Integer.toString(payload.traceCount())) - .addHeader(DATADOG_DROPPED_TRACE_COUNT, Long.toString(payload.droppedTraces())) - .addHeader(DATADOG_DROPPED_SPAN_COUNT, Long.toString(payload.droppedSpans())) - .addHeader( - DATADOG_CLIENT_COMPUTED_STATS, - Config.get().isOtelTracesSpanMetricsEnabled() - || (nativeMetricsEnabled && featuresDiscovery.supportsMetrics()) - // Disabling the computation agent-side of the APM trace metrics by - // pretending it was already done by the library - || !Config.get().isApmTracingEnabled() - ? "true" - : "") - .put(payload.toRequest()) - .build(); + final Request request = prepareRequest(tracesUrl, headers) + .addHeader(X_DATADOG_TRACE_COUNT, Integer.toString(payload.traceCount())) + .addHeader(DATADOG_DROPPED_TRACE_COUNT, Long.toString(payload.droppedTraces())) + .addHeader(DATADOG_DROPPED_SPAN_COUNT, Long.toString(payload.droppedSpans())) + .addHeader( + DATADOG_CLIENT_COMPUTED_STATS, + Config.get().isOtelTracesSpanMetricsEnabled() + || (nativeMetricsEnabled && featuresDiscovery.supportsMetrics()) + // Disabling the computation agent-side of the APM trace metrics by + // pretending it was already done by the library + || !Config.get().isApmTracingEnabled() + ? "true" + : "") + .put(payload.toRequest()) + .build(); this.totalTraces += payload.traceCount(); this.receivedTraces += payload.traceCount(); try (final Recording recording = sendPayloadTimer.start(); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_4.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_4.java index 0473010d3d1..b08a038ab6d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_4.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_4.java @@ -26,15 +26,13 @@ import okhttp3.RequestBody; public final class TraceMapperV0_4 implements TraceMapper { - static final SimpleUtf8Cache TAG_CACHE = - Config.get().getTagNameUtf8CacheSize() > 0 - ? new SimpleUtf8Cache(Config.get().getTagNameUtf8CacheSize()) - : null; + static final SimpleUtf8Cache TAG_CACHE = Config.get().getTagNameUtf8CacheSize() > 0 + ? new SimpleUtf8Cache(Config.get().getTagNameUtf8CacheSize()) + : null; - static final GenerationalUtf8Cache VALUE_CACHE = - Config.get().getTagValueUtf8CacheSize() > 0 - ? new GenerationalUtf8Cache(Config.get().getTagValueUtf8CacheSize()) - : null; + static final GenerationalUtf8Cache VALUE_CACHE = Config.get().getTagValueUtf8CacheSize() > 0 + ? new GenerationalUtf8Cache(Config.get().getTagValueUtf8CacheSize()) + : null; // Controls how often the UTF8 caches are recalibrated. The caches adapt to shifts in tag-value // cardinality over a timescale much longer than a single span, so recalibrating periodically @@ -100,19 +98,17 @@ public void accept(Metadata metadata) { final boolean writeSamplingPriority = firstSpanInTrace || lastSpanInTrace || metadata.topLevel(); final UTF8BytesString processTags = firstSpanInPayload ? metadata.processTags() : null; - int metaSize = - metadata.getBaggage().size() - + tags.size() - + (null == metadata.getHttpStatusCode() ? 0 : 1) - + (null == metadata.getOrigin() ? 0 : 1) - + (null == processTags ? 0 : 1) - + 1; - int metricsSize = - (writeSamplingPriority && metadata.hasSamplingPriority() ? 1 : 0) - + (metadata.measured() ? 1 : 0) - + (metadata.topLevel() ? 1 : 0) - + (metadata.longRunningVersion() != 0 ? 1 : 0) - + 1; + int metaSize = metadata.getBaggage().size() + + tags.size() + + (null == metadata.getHttpStatusCode() ? 0 : 1) + + (null == metadata.getOrigin() ? 0 : 1) + + (null == processTags ? 0 : 1) + + 1; + int metricsSize = (writeSamplingPriority && metadata.hasSamplingPriority() ? 1 : 0) + + (metadata.measured() ? 1 : 0) + + (metadata.topLevel() ? 1 : 0) + + (metadata.longRunningVersion() != 0 ? 1 : 0) + + 1; for (TagMap.EntryReader entryReader : tags) { if (entryReader.isNumber()) { @@ -152,35 +148,33 @@ public void accept(Metadata metadata) { writable.writeUTF8(THREAD_ID); writable.writeLong(metadata.getThreadId()); - tags.forEach( - writable, - (w, entry) -> { - if (!entry.isNumber()) return; + tags.forEach(writable, (w, entry) -> { + if (!entry.isNumber()) return; - w.writeString(entry.tag(), TAG_CACHE); + w.writeString(entry.tag(), TAG_CACHE); - switch (entry.type()) { - case TagMap.EntryReader.INT: - w.writeInt(entry.intValue()); - break; + switch (entry.type()) { + case TagMap.EntryReader.INT: + w.writeInt(entry.intValue()); + break; - case TagMap.EntryReader.LONG: - w.writeLong(entry.longValue()); - break; + case TagMap.EntryReader.LONG: + w.writeLong(entry.longValue()); + break; - case TagMap.EntryReader.FLOAT: - w.writeFloat(entry.floatValue()); - break; + case TagMap.EntryReader.FLOAT: + w.writeFloat(entry.floatValue()); + break; - case TagMap.EntryReader.DOUBLE: - w.writeDouble(entry.doubleValue()); - break; + case TagMap.EntryReader.DOUBLE: + w.writeDouble(entry.doubleValue()); + break; - default: - w.writeObject(entry.objectValue(), VALUE_CACHE); - break; - } - }); + default: + w.writeObject(entry.objectValue(), VALUE_CACHE); + break; + } + }); writable.writeUTF8(META); writable.startMap(metaSize); @@ -206,21 +200,19 @@ public void accept(Metadata metadata) { writable.writeUTF8(processTags); } - tags.forEach( - writable, - (w, entryReader) -> { - if (entryReader.isNumber()) return; - - String tag = entryReader.tag(); - Object value = entryReader.objectValue(); - if (value instanceof Map) { - // Write map as flat map - writeFlatMap(w, tag, (Map) value); - } else { - w.writeString(tag, TAG_CACHE); - w.writeObjectString(value, VALUE_CACHE); - } - }); + tags.forEach(writable, (w, entryReader) -> { + if (entryReader.isNumber()) return; + + String tag = entryReader.tag(); + Object value = entryReader.objectValue(); + if (value instanceof Map) { + // Write map as flat map + writeFlatMap(w, tag, (Map) value); + } else { + w.writeString(tag, TAG_CACHE); + w.writeObjectString(value, VALUE_CACHE); + } + }); } /** diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_5.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_5.java index 0e8644bdee9..ba894c20c4d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_5.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_5.java @@ -222,19 +222,17 @@ public void accept(Metadata metadata) { TagMap tags = metadata.getTags(); - int metaSize = - metadata.getBaggage().size() - + tags.size() - + (null == metadata.getHttpStatusCode() ? 0 : 1) - + (null == metadata.getOrigin() ? 0 : 1) - + (null == processTags ? 0 : 1) - + 1; - int metricsSize = - (writeSamplingPriority && metadata.hasSamplingPriority() ? 1 : 0) - + (metadata.measured() ? 1 : 0) - + (metadata.topLevel() ? 1 : 0) - + (metadata.longRunningVersion() != 0 ? 1 : 0) - + 1; + int metaSize = metadata.getBaggage().size() + + tags.size() + + (null == metadata.getHttpStatusCode() ? 0 : 1) + + (null == metadata.getOrigin() ? 0 : 1) + + (null == processTags ? 0 : 1) + + 1; + int metricsSize = (writeSamplingPriority && metadata.hasSamplingPriority() ? 1 : 0) + + (metadata.measured() ? 1 : 0) + + (metadata.topLevel() ? 1 : 0) + + (metadata.longRunningVersion() != 0 ? 1 : 0) + + 1; for (TagMap.EntryReader entry : tags) { if (entry.isNumber()) { diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java index 8e43e43fa67..df75a54cf1b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java @@ -390,14 +390,13 @@ private void encodeSpanAttributes( } writable.writeInt(fieldId); - writable.startArray( - (tagCount - + baggage.size() - + metaStruct.size() - + 2 - + (writeHttpStatus ? 1 : 0) - + (writeTopLevel ? 1 : 0)) - * 3); + writable.startArray((tagCount + + baggage.size() + + metaStruct.size() + + 2 + + (writeHttpStatus ? 1 : 0) + + (writeTopLevel ? 1 : 0)) + * 3); writeAttribute(writable, DDTags.THREAD_ID, meta.getThreadId()); writeAttribute(writable, DDTags.THREAD_NAME, meta.getThreadName()); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDEvpProxyApi.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDEvpProxyApi.java index 9ec4eca5f4e..3f7ab701f0d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDEvpProxyApi.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDEvpProxyApi.java @@ -36,7 +36,10 @@ public static DDEvpProxyApiBuilder builder() { public static class DDEvpProxyApiBuilder { private String apiVersion = DEFAULT_INTAKE_VERSION; - @Nonnull private TrackType trackType = TrackType.NOOP; + + @Nonnull + private TrackType trackType = TrackType.NOOP; + private long timeoutMillis = TimeUnit.SECONDS.toMillis(DEFAULT_INTAKE_TIMEOUT); HttpUrl agentUrl = null; @@ -87,10 +90,9 @@ public DDEvpProxyApi build() { final HttpUrl proxiedApiUrl = evpProxyUrl.resolve(String.format("api/%s/%s", apiVersion, trackName)); - final OkHttpClient client = - (httpClient != null) - ? httpClient - : OkHttpUtils.buildHttpClient(proxiedApiUrl, timeoutMillis); + final OkHttpClient client = (httpClient != null) + ? httpClient + : OkHttpUtils.buildHttpClient(proxiedApiUrl, timeoutMillis); final HttpRetryPolicy.Factory retryPolicyFactory = new HttpRetryPolicy.Factory(5, 100, 2.0, true); @@ -128,11 +130,10 @@ private DDEvpProxyApi( public Response sendSerializedTraces(Payload payload) { final int sizeInBytes = payload.sizeInBytes(); - Request.Builder builder = - new Request.Builder() - .url(proxiedApiUrl) - .addHeader(EvpProxy.SUBDOMAIN_HEADER, subdomain) - .tag(OkHttpUtils.CustomListener.class, telemetryListener); + Request.Builder builder = new Request.Builder() + .url(proxiedApiUrl) + .addHeader(EvpProxy.SUBDOMAIN_HEADER, subdomain) + .tag(OkHttpUtils.CustomListener.class, telemetryListener); if (isCompressionEnabled()) { builder.addHeader(CONTENT_ENCODING_HEADER, GZIP_CONTENT_TYPE); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDIntakeApi.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDIntakeApi.java index 7abad42d2f1..0aa7e0d6aba 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDIntakeApi.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDIntakeApi.java @@ -123,14 +123,13 @@ private DDIntakeApi( public Response sendSerializedTraces(Payload payload) { final int sizeInBytes = payload.sizeInBytes(); - final Request request = - new Request.Builder() - .url(intakeUrl) - .addHeader(DD_API_KEY_HEADER, apiKey) - .addHeader(CONTENT_ENCODING_HEADER, GZIP_CONTENT_TYPE) - .post(payload.toRequest()) - .tag(OkHttpUtils.CustomListener.class, telemetryListener) - .build(); + final Request request = new Request.Builder() + .url(intakeUrl) + .addHeader(DD_API_KEY_HEADER, apiKey) + .addHeader(CONTENT_ENCODING_HEADER, GZIP_CONTENT_TYPE) + .post(payload.toRequest()) + .tag(OkHttpUtils.CustomListener.class, telemetryListener) + .build(); totalTraces += payload.traceCount(); receivedTraces += payload.traceCount(); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 6b2e41a9b1d..7581ecf52d7 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -264,7 +264,10 @@ public ConfigSnapshot captureTraceConfig() { @Override public void updatePreferredServiceName(String serviceName, CharSequence source) { - dynamicConfig.current().setPreferredServiceNameAndSource(serviceName, source).apply(); + dynamicConfig + .current() + .setPreferredServiceNameAndSource(serviceName, source) + .apply(); ServiceNameCollector.get().addService(serviceName); } @@ -511,11 +514,10 @@ public CoreTracerBuilder config(final Config config) { sampler(Sampler.Builder.forConfig(config, null)); singleSpanSampler(SingleSpanSampler.Builder.forConfig(config)); instrumentationGateway(new InstrumentationGateway()); - injector( - HttpCodec.createInjector( - config, - config.getTracePropagationStylesToInject(), - invertMap(config.getBaggageMapping()))); + injector(HttpCodec.createInjector( + config, + config.getTracePropagationStylesToInject(), + invertMap(config.getBaggageMapping()))); // Explicitly skip setting scope manager because it depends on statsDClient localRootSpanTags(config.getLocalRootSpanTags()); defaultSpanTags(withTracerTags(config.getMergedSpanTags(), config, null)); @@ -713,35 +715,32 @@ private CoreTracer( this.defaultSpanTags = defaultSpanTags; this.defaultSpanTagsNeedsIntercept = this.tagInterceptor.needsIntercept(this.defaultSpanTags); - this.dynamicConfig = - DynamicConfig.create(ConfigSnapshot::new) - .setTracingEnabled(true) // implied by installation of CoreTracer - .setRuntimeMetricsEnabled(config.isRuntimeMetricsEnabled()) - .setLogsInjectionEnabled(config.isLogsInjectionEnabled()) - .setDataStreamsEnabled(config.isDataStreamsEnabled()) - .setServiceMapping(serviceNameMappings) - .setHeaderTags(taggedHeaders) - .setBaggageMapping(baggageMapping) - .setTraceSampleRate(config.getTraceSampleRate()) - .setSpanSamplingRules(spanSamplingRules.getRules()) - .setTraceSamplingRules(traceSamplingRules.getRules(), traceSamplingRulesJson) - .setTracingTags(config.getMergedSpanTags()) - .setDataStreamsTransactionExtractors(dataStreamsTransactionExtractors.getExtractors()) - .apply(); + this.dynamicConfig = DynamicConfig.create(ConfigSnapshot::new) + .setTracingEnabled(true) // implied by installation of CoreTracer + .setRuntimeMetricsEnabled(config.isRuntimeMetricsEnabled()) + .setLogsInjectionEnabled(config.isLogsInjectionEnabled()) + .setDataStreamsEnabled(config.isDataStreamsEnabled()) + .setServiceMapping(serviceNameMappings) + .setHeaderTags(taggedHeaders) + .setBaggageMapping(baggageMapping) + .setTraceSampleRate(config.getTraceSampleRate()) + .setSpanSamplingRules(spanSamplingRules.getRules()) + .setTraceSamplingRules(traceSamplingRules.getRules(), traceSamplingRulesJson) + .setTracingTags(config.getMergedSpanTags()) + .setDataStreamsTransactionExtractors(dataStreamsTransactionExtractors.getExtractors()) + .apply(); this.logs128bTraceIdEnabled = Config.get().isLogs128bitTraceIdEnabled(); this.partialFlushMinSpans = partialFlushMinSpans; - this.idGenerationStrategy = - null == idGenerationStrategy - ? Config.get().getIdGenerationStrategy() - : idGenerationStrategy; - - this.healthMetrics = - healthMetrics != null - ? healthMetrics - : (config.isHealthMetricsEnabled() - ? new TracerHealthMetrics(AgentMeter.statsDClient()) - : HealthMetrics.NO_OP); + this.idGenerationStrategy = null == idGenerationStrategy + ? Config.get().getIdGenerationStrategy() + : idGenerationStrategy; + + this.healthMetrics = healthMetrics != null + ? healthMetrics + : (config.isHealthMetricsEnabled() + ? new TracerHealthMetrics(AgentMeter.statsDClient()) + : HealthMetrics.NO_OP); this.healthMetrics.start(); performanceMonitoring = @@ -749,12 +748,11 @@ private CoreTracer( traceWriteTimer = performanceMonitoring.newThreadLocalTimer("trace.write"); - scopeManager = - new ContinuableScopeManager( - config.getScopeDepthLimit(), - config.isScopeStrictMode(), - profilingContextIntegration, - this.healthMetrics); + scopeManager = new ContinuableScopeManager( + config.getScopeDepthLimit(), + config.isScopeStrictMode(), + profilingContextIntegration, + this.healthMetrics); externalAgentLauncher = new ExternalAgentLauncher(config); @@ -772,9 +770,8 @@ private CoreTracer( } if (writer == null) { - this.writer = - WriterFactory.createWriter( - config, sharedCommunicationObjects, sampler, singleSpanSampler, this.healthMetrics); + this.writer = WriterFactory.createWriter( + config, sharedCommunicationObjects, sampler, singleSpanSampler, this.healthMetrics); } else { this.writer = writer; } @@ -796,14 +793,12 @@ private CoreTracer( traceCollectorFactory = new StreamingTraceCollector.Factory(this, this.timeSource, this.healthMetrics); } else { - pendingTraceBuffer = - strictTraceWrites - ? PendingTraceBuffer.discarding() - : PendingTraceBuffer.delaying( - this.timeSource, config, sharedCommunicationObjects, this.healthMetrics); - traceCollectorFactory = - new PendingTrace.Factory( - this, pendingTraceBuffer, this.timeSource, strictTraceWrites, this.healthMetrics); + pendingTraceBuffer = strictTraceWrites + ? PendingTraceBuffer.discarding() + : PendingTraceBuffer.delaying( + this.timeSource, config, sharedCommunicationObjects, this.healthMetrics); + traceCollectorFactory = new PendingTrace.Factory( + this, pendingTraceBuffer, this.timeSource, strictTraceWrites, this.healthMetrics); } pendingTraceBuffer.start(); @@ -814,22 +809,17 @@ private CoreTracer( final SharedCommunicationObjects sco = sharedCommunicationObjects; // asynchronously create these aggregator/export components to avoid triggering // expensive classloading during the tracer initialisation. - sharedCommunicationObjects.whenReady( - () -> - AgentTaskScheduler.get() - .execute( - () -> { - startMetricsAggregation(config, sco); - maybeStartLogsExport(config); - })); + sharedCommunicationObjects.whenReady(() -> AgentTaskScheduler.get().execute(() -> { + startMetricsAggregation(config, sco); + maybeStartLogsExport(config); + })); if (dataStreamsMonitoring == null) { // Avoid DSM in bazel hermetic mode - this.dataStreamsMonitoring = - payloadFilesEnabled - ? DisabledDataStreamsMonitoring.INSTANCE - : new DefaultDataStreamsMonitoring( - config, sharedCommunicationObjects, this.timeSource, this::captureTraceConfig); + this.dataStreamsMonitoring = payloadFilesEnabled + ? DisabledDataStreamsMonitoring.INSTANCE + : new DefaultDataStreamsMonitoring( + config, sharedCommunicationObjects, this.timeSource, this::captureTraceConfig); } else { this.dataStreamsMonitoring = dataStreamsMonitoring; } @@ -841,12 +831,11 @@ private CoreTracer( // Register context propagators HttpCodec.Extractor baseExtractor = extractor == null ? HttpCodec.createExtractor(config, this::captureTraceConfig) : extractor; - OrgGuard orgGuard = - OrgGuard.create( - config, - featuresDiscovery::getOrgPropagationMarker, - propagationTagsFactory, - this.healthMetrics); + OrgGuard orgGuard = OrgGuard.create( + config, + featuresDiscovery::getOrgPropagationMarker, + propagationTagsFactory, + this.healthMetrics); HttpCodec.Extractor tracingExtractor = orgGuard.decorateExtractor(baseExtractor); HttpCodec.Injector tracingInjector = orgGuard.decorateInjector(injector); TracingPropagator tracingPropagator = @@ -1541,18 +1530,17 @@ public void close() { @Override public void addScopeListener( Runnable afterScopeActivatedCallback, Runnable afterScopeClosedCallback) { - addScopeListener( - new ScopeListener() { - @Override - public void afterScopeActivated() { - afterScopeActivatedCallback.run(); - } + addScopeListener(new ScopeListener() { + @Override + public void afterScopeActivated() { + afterScopeActivatedCallback.run(); + } - @Override - public void afterScopeClosed() { - afterScopeClosedCallback.run(); - } - }); + @Override + public void afterScopeClosed() { + afterScopeClosedCallback.run(); + } + }); } @Override @@ -1603,7 +1591,8 @@ public TraceSegment getTraceSegment() { public void addReportToFlare(ZipOutputStream zip) throws IOException { TracerFlare.addText(zip, "dynamic_config.txt", dynamicConfig.toString()); TracerFlare.addText(zip, "tracer_health.txt", healthMetrics.summary()); - TracerFlare.addText(zip, "span_metrics.txt", SpanMetricRegistry.getInstance().summary()); + TracerFlare.addText( + zip, "span_metrics.txt", SpanMetricRegistry.getInstance().summary()); } Recording writeTimer() { @@ -1716,12 +1705,12 @@ private static final List addParentSpanLink( List links, AgentSpanContext parentSpanContext) { SpanLink link; if (parentSpanContext instanceof ExtractedContext) { - String headers = ((ExtractedContext) parentSpanContext).getPropagationStyle().toString(); - SpanAttributes attributes = - SpanAttributes.builder() - .put("reason", "propagation_behavior_extract") - .put("context_headers", headers) - .build(); + String headers = + ((ExtractedContext) parentSpanContext).getPropagationStyle().toString(); + SpanAttributes attributes = SpanAttributes.builder() + .put("reason", "propagation_behavior_extract") + .put("context_headers", headers) + .build(); link = DDSpanLink.from((ExtractedContext) parentSpanContext, attributes); } else { link = SpanLink.from(parentSpanContext); @@ -2093,10 +2082,9 @@ protected static final DDSpanContext buildSpanContext( endToEndStartTime = extractedContext.getEndToEndStartTime(); propagationTags = extractedContext.getPropagationTags(); } else if (resolvedParentSpanContext != null) { - traceId = - resolvedParentSpanContext.getTraceId() == DDTraceId.ZERO - ? tracer.idGenerationStrategy.generateTraceId() - : resolvedParentSpanContext.getTraceId(); + traceId = resolvedParentSpanContext.getTraceId() == DDTraceId.ZERO + ? tracer.idGenerationStrategy.generateTraceId() + : resolvedParentSpanContext.getTraceId(); parentSpanId = resolvedParentSpanContext.getSpanId(); samplingPriority = resolvedParentSpanContext.getSamplingPriority(); endToEndStartTime = 0; @@ -2149,12 +2137,11 @@ protected static final DDSpanContext buildSpanContext( ConfigSnapshot traceConfig = parentTraceCollector.getTraceConfig(); // Use parent pathwayContext if present and started - pathwayContext = - resolvedParentSpanContext != null - && resolvedParentSpanContext.getPathwayContext() != null - && resolvedParentSpanContext.getPathwayContext().isStarted() - ? resolvedParentSpanContext.getPathwayContext() - : tracer.dataStreamsMonitoring.newPathwayContext(); + pathwayContext = resolvedParentSpanContext != null + && resolvedParentSpanContext.getPathwayContext() != null + && resolvedParentSpanContext.getPathwayContext().isStarted() + ? resolvedParentSpanContext.getPathwayContext() + : tracer.dataStreamsMonitoring.newPathwayContext(); // when removing fake services the best upward service name to pick is the local root one // since a split by tag (i.e. servlet context) might have happened on it. @@ -2208,12 +2195,11 @@ protected static final DDSpanContext buildSpanContext( final TagMap mergedTracerTags = traceConfig.mergedTracerTags; boolean mergedTracerTagsNeedsIntercept = traceConfig.mergedTracerTagsNeedsIntercept; - final int tagsSize = - mergedTracerTags.size() - + (null == tagLedger ? 0 : tagLedger.estimateSize()) - + (null == coreTags ? 0 : coreTags.size()) - + (null == rootSpanTags ? 0 : rootSpanTags.size()) - + (null == contextualTags ? 0 : contextualTags.size()); + final int tagsSize = mergedTracerTags.size() + + (null == tagLedger ? 0 : tagLedger.estimateSize()) + + (null == coreTags ? 0 : coreTags.size()) + + (null == rootSpanTags ? 0 : rootSpanTags.size()) + + (null == contextualTags ? 0 : contextualTags.size()); if (builderRequestContextDataAppSec != null) { requestContextDataAppSec = builderRequestContextDataAppSec; @@ -2226,34 +2212,33 @@ protected static final DDSpanContext buildSpanContext( } // some attributes are inherited from the parent - context = - new DDSpanContext( - traceId, - spanId, - parentSpanId, - parentServiceName, - serviceNameSource, - serviceName, - operationName, - resourceName, - samplingPriority, - origin, - baggage, - w3cBaggage, - errorFlag, - spanType, - tagsSize, - parentTraceCollector, - requestContextDataAppSec, - requestContextDataIast, - ciVisibilityContextData, - pathwayContext, - tracer.disableSamplingMechanismValidation, - propagationTags, - tracer.profilingContextIntegration, - tracer.injectBaggageAsTags, - tracer.injectLinksAsTags, - mergedTracerTagsNeedsIntercept ? null : mergedTracerTags); + context = new DDSpanContext( + traceId, + spanId, + parentSpanId, + parentServiceName, + serviceNameSource, + serviceName, + operationName, + resourceName, + samplingPriority, + origin, + baggage, + w3cBaggage, + errorFlag, + spanType, + tagsSize, + parentTraceCollector, + requestContextDataAppSec, + requestContextDataIast, + ciVisibilityContextData, + pathwayContext, + tracer.disableSamplingMechanismValidation, + propagationTags, + tracer.profilingContextIntegration, + tracer.injectBaggageAsTags, + tracer.injectLinksAsTags, + mergedTracerTagsNeedsIntercept ? null : mergedTracerTags); // By setting the tags on the context we apply decorators to any tags that have been set via // the builder. This is the order that the tags were added previously, but maybe the `tags` diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java index 5517952358e..7f79c181625 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java @@ -383,9 +383,8 @@ private boolean isExceptionReplayEnabled() { if (!DebuggerConfigBridge.isExceptionReplayEnabled()) { return false; } - boolean captureOnlyRootSpan = - (Config.get().isDebuggerExceptionOnlyLocalRoot() - || !Config.get().isDebuggerExceptionCaptureIntermediateSpansEnabled()); + boolean captureOnlyRootSpan = (Config.get().isDebuggerExceptionOnlyLocalRoot() + || !Config.get().isDebuggerExceptionCaptureIntermediateSpansEnabled()); if (captureOnlyRootSpan && !isLocalRootSpan()) { return false; } @@ -877,13 +876,8 @@ public Map getBaggage() { @Override public String toString() { - return context.toString() - + ", duration_ns=" - + durationNano - + ", forceKeep=" - + forceKeep - + ", links=" - + links; + return context.toString() + ", duration_ns=" + durationNano + ", forceKeep=" + forceKeep + + ", links=" + links; } @Override diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java index adf4cd66156..5e4b2f6d54a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java @@ -409,10 +409,9 @@ public DDSpanContext( // The +1 is the magic number from the tags below that we set at the end, // and "* 4 / 3" is to make sure that we don't resize immediately final int capacity = Math.max((tagsSize <= 0 ? 3 : (tagsSize + 1)) * 4 / 3, 8); - this.unsafeTags = - readThroughParent != null - ? TagMap.createFromParent(readThroughParent) - : TagMap.create(capacity); + this.unsafeTags = readThroughParent != null + ? TagMap.createFromParent(readThroughParent) + : TagMap.create(capacity); // must set this before setting the service and resource names below this.profilingContextIntegration = profilingContextIntegration; @@ -434,10 +433,9 @@ public DDSpanContext( this.threadName = THREAD_NAMES.computeIfAbsent(current.getName(), Functions.UTF8_ENCODE); this.disableSamplingMechanismValidation = disableSamplingMechanismValidation; - this.propagationTags = - propagationTags != null - ? propagationTags - : traceCollector.getTracer().getPropagationTagsFactory().empty(); + this.propagationTags = propagationTags != null + ? propagationTags + : traceCollector.getTracer().getPropagationTagsFactory().empty(); this.propagationTags.updateTraceIdHighOrderBits(this.traceId.toHighOrderLong()); this.injectBaggageAsTags = injectBaggageAsTags; this.injectLinksAsTags = injectLinksAsTags; @@ -969,9 +967,8 @@ public void setTag(TagMap.EntryReader entry) { } // pre-check to avoid boxing - boolean intercepted = - precheckIntercept(entry.tag()) - && tagInterceptor.interceptTag(this, entry.tag(), entry.objectValue()); + boolean intercepted = precheckIntercept(entry.tag()) + && tagInterceptor.interceptTag(this, entry.tag(), entry.objectValue()); if (!intercepted) { synchronized (unsafeTags) { unsafeTags.set(entry); @@ -1088,16 +1085,14 @@ void setAllTags(final TagMap map, boolean needsIntercept) { // forEach out-performs the iterator of TagMap // Taking advantage of ability to pass through other context arguments // to avoid using a capturing lambda - map.forEach( - this, - (ctx, tagEntry) -> { - String tag = tagEntry.tag(); - Object value = tagEntry.objectValue(); - - if (!ctx.tagInterceptor.interceptTag(ctx, tag, value)) { - ctx.unsafeTags.set(tagEntry); - } - }); + map.forEach(this, (ctx, tagEntry) -> { + String tag = tagEntry.tag(); + Object value = tagEntry.objectValue(); + + if (!ctx.tagInterceptor.interceptTag(ctx, tag, value)) { + ctx.unsafeTags.set(tagEntry); + } + }); } else { unsafeTags.putAll(map); } @@ -1341,27 +1336,25 @@ void processTagsAndBaggage( serializedPropagationTags.fillTagMap(baggageItemsWithPropagationTags); } } else { - baggageItemsWithPropagationTags = - serializedPropagationTags == null - ? EMPTY_BAGGAGE - : serializedPropagationTags.createTagMap(); + baggageItemsWithPropagationTags = serializedPropagationTags == null + ? EMPTY_BAGGAGE + : serializedPropagationTags.createTagMap(); } - consumer.accept( - new Metadata( - threadId, - threadName, - unsafeTags, - baggageItemsWithPropagationTags, - samplingPriority != PrioritySampling.UNSET ? samplingPriority : getSamplingPriority(), - measured, - topLevel, - httpStatusCode == 0 ? null : HTTP_STATUSES.get(httpStatusCode), - // Get origin from rootSpan.context - getOrigin(), - longRunningVersion, - ProcessTags.getTagsForSerialization(), - restrictedSpan.getLinks())); + consumer.accept(new Metadata( + threadId, + threadName, + unsafeTags, + baggageItemsWithPropagationTags, + samplingPriority != PrioritySampling.UNSET ? samplingPriority : getSamplingPriority(), + measured, + topLevel, + httpStatusCode == 0 ? null : HTTP_STATUSES.get(httpStatusCode), + // Get origin from rootSpan.context + getOrigin(), + longRunningVersion, + ProcessTags.getTagsForSerialization(), + restrictedSpan.getLinks())); } } @@ -1397,20 +1390,19 @@ public CharSequence getIntegrationName() { @Override public String toString() { - final StringBuilder s = - new StringBuilder() - .append("DDSpan [ t_id=") - .append(traceId) - .append(", s_id=") - .append(DDSpanId.toString(spanId)) - .append(", p_id=") - .append(DDSpanId.toString(parentId)) - .append(" ] trace=") - .append(getServiceName()) - .append('/') - .append(getOperationName()) - .append('/') - .append(getResourceName()); + final StringBuilder s = new StringBuilder() + .append("DDSpan [ t_id=") + .append(traceId) + .append(", s_id=") + .append(DDSpanId.toString(spanId)) + .append(", p_id=") + .append(DDSpanId.toString(parentId)) + .append(" ] trace=") + .append(getServiceName()) + .append('/') + .append(getOperationName()) + .append('/') + .append(getResourceName()); if (errorFlag) { s.append(" *errored*"); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanLink.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanLink.java index 31554cbcdec..6f875549a26 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanLink.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanLink.java @@ -55,10 +55,9 @@ public static SpanLink from(ExtractedContext context) { */ public static SpanLink from(ExtractedContext context, SpanAttributes attributes) { byte traceFlags = context.getSamplingPriority() > 0 ? SAMPLED_FLAG : DEFAULT_FLAGS; - String traceState = - context.getPropagationTags() == null - ? "" - : context.getPropagationTags().headerValue(PropagationTags.HeaderType.W3C); + String traceState = context.getPropagationTags() == null + ? "" + : context.getPropagationTags().headerValue(PropagationTags.HeaderType.W3C); return new DDSpanLink( context.getTraceId(), context.getSpanId(), traceFlags, traceState, attributes); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDTraceCoreInfo.java b/dd-trace-core/src/main/java/datadog/trace/core/DDTraceCoreInfo.java index 70ab82047de..2e2af17c56e 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDTraceCoreInfo.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDTraceCoreInfo.java @@ -16,10 +16,8 @@ public class DDTraceCoreInfo { static { String v; - try (final BufferedReader br = - new BufferedReader( - new InputStreamReader( - DDTraceCoreInfo.class.getResourceAsStream("/dd-trace-core.version"), UTF_8))) { + try (final BufferedReader br = new BufferedReader(new InputStreamReader( + DDTraceCoreInfo.class.getResourceAsStream("/dd-trace-core.version"), UTF_8))) { final StringBuilder sb = new StringBuilder(); for (int c = br.read(); c != -1; c = br.read()) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java b/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java index d2f7a058ab5..1b39954bf70 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/PendingTrace.java @@ -496,11 +496,10 @@ public static long getDurationNano(CoreSpan span) { DDSpan ddSpan = (DDSpan) span; TraceCollector traceCollector = ddSpan.spanContext().getTraceCollector(); if (!(traceCollector instanceof PendingTrace)) { - throw new IllegalArgumentException( - "Expected " - + PendingTrace.class.getName() - + ", got " - + traceCollector.getClass().getName()); + throw new IllegalArgumentException("Expected " + + PendingTrace.class.getName() + + ", got " + + traceCollector.getClass().getName()); } PendingTrace trace = (PendingTrace) traceCollector; return trace.getLastWriteTime() - span.getStartTime(); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/PendingTraceBuffer.java b/dd-trace-core/src/main/java/datadog/trace/core/PendingTraceBuffer.java index c0e8de95a5c..407ce6554db 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/PendingTraceBuffer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/PendingTraceBuffer.java @@ -298,11 +298,10 @@ public DelayingPendingTraceBuffer( this.worker = newAgentThread(TRACE_MONITOR, new Worker()); this.timeSource = timeSource; boolean runningSpansEnabled = config.isLongRunningTraceEnabled(); - this.runningTracesTracker = - runningSpansEnabled - ? new LongRunningTracesTracker( - config, bufferSize, sharedCommunicationObjects, healthMetrics) - : null; + this.runningTracesTracker = runningSpansEnabled + ? new LongRunningTracesTracker( + config, bufferSize, sharedCommunicationObjects, healthMetrics) + : null; } @VisibleForTesting diff --git a/dd-trace-core/src/main/java/datadog/trace/core/TracingConfigPoller.java b/dd-trace-core/src/main/java/datadog/trace/core/TracingConfigPoller.java index 6bbc13151e3..5f6145f1865 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/TracingConfigPoller.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/TracingConfigPoller.java @@ -67,19 +67,18 @@ public void start(Config config, SharedCommunicationObjects sco) { ConfigurationPoller configPoller = sco.configurationPoller(config); if (configPoller != null) { - configPoller.addCapabilities( - CAPABILITY_APM_TRACING_TRACING_ENABLED - | CAPABILITY_APM_TRACING_SAMPLE_RATE - | CAPABILITY_APM_LOGS_INJECTION - | CAPABILITY_APM_HTTP_HEADER_TAGS - | CAPABILITY_APM_CUSTOM_TAGS - | CAPABILITY_APM_TRACING_DATA_STREAMS_ENABLED - | CAPABILITY_APM_TRACING_SAMPLE_RULES - | CAPABILITY_APM_TRACING_ENABLE_DYNAMIC_INSTRUMENTATION - | CAPABILITY_APM_TRACING_ENABLE_EXCEPTION_REPLAY - | CAPABILITY_APM_TRACING_ENABLE_CODE_ORIGIN - | CAPABILITY_APM_TRACING_ENABLE_LIVE_DEBUGGING - | CAPABILITY_APM_TRACING_MULTICONFIG); + configPoller.addCapabilities(CAPABILITY_APM_TRACING_TRACING_ENABLED + | CAPABILITY_APM_TRACING_SAMPLE_RATE + | CAPABILITY_APM_LOGS_INJECTION + | CAPABILITY_APM_HTTP_HEADER_TAGS + | CAPABILITY_APM_CUSTOM_TAGS + | CAPABILITY_APM_TRACING_DATA_STREAMS_ENABLED + | CAPABILITY_APM_TRACING_SAMPLE_RULES + | CAPABILITY_APM_TRACING_ENABLE_DYNAMIC_INSTRUMENTATION + | CAPABILITY_APM_TRACING_ENABLE_EXCEPTION_REPLAY + | CAPABILITY_APM_TRACING_ENABLE_CODE_ORIGIN + | CAPABILITY_APM_TRACING_ENABLE_LIVE_DEBUGGING + | CAPABILITY_APM_TRACING_MULTICONFIG); } stopPolling = new Updater().register(config, configPoller); } @@ -96,12 +95,11 @@ final class Updater implements ProductListener { private final JsonAdapter TRACE_SAMPLING_RULE; { - Moshi MOSHI = - new Moshi.Builder() - .add(new TracingSamplingRulesAdapter()) - .add(new DataStreamsTransactionExtractors.DataStreamsTransactionExtractorsAdapter()) - .add(new DataStreamsTransactionExtractors.DataStreamsTransactionExtractorAdapter()) - .build(); + Moshi MOSHI = new Moshi.Builder() + .add(new TracingSamplingRulesAdapter()) + .add(new DataStreamsTransactionExtractors.DataStreamsTransactionExtractorsAdapter()) + .add(new DataStreamsTransactionExtractors.DataStreamsTransactionExtractorAdapter()) + .build(); CONFIG_OVERRIDES_ADAPTER = MOSHI.adapter(ConfigOverrides.class); LIB_CONFIG_ADAPTER = MOSHI.adapter(LibConfig.class); TRACE_SAMPLING_RULE = MOSHI.adapter(TracingSamplingRule.class); @@ -123,9 +121,8 @@ public Runnable register(Config config, ConfigurationPoller poller) { public void accept(ConfigKey configKey, byte[] content, PollingRateHinter hinter) throws IOException { - ConfigOverrides overrides = - CONFIG_OVERRIDES_ADAPTER.fromJson( - Okio.buffer(Okio.source(new ByteArrayInputStream(content)))); + ConfigOverrides overrides = CONFIG_OVERRIDES_ADAPTER.fromJson( + Okio.buffer(Okio.source(new ByteArrayInputStream(content)))); if (null != overrides && null != overrides.libConfig) { configs.put(configKey.getConfigId(), overrides); @@ -148,11 +145,10 @@ public void remove(ConfigKey configKey, PollingRateHinter hinter) { @Override public void commit(PollingRateHinter hinter) { // sort configs by override priority - List sortedConfigs = - configs.values().stream() - .sorted(Comparator.comparingInt(ConfigOverrides::getOverridePriority).reversed()) - .map(config -> config.libConfig) - .collect(Collectors.toList()); + List sortedConfigs = configs.values().stream() + .sorted(Comparator.comparingInt(ConfigOverrides::getOverridePriority).reversed()) + .map(config -> config.libConfig) + .collect(Collectors.toList()); LibConfig mergedConfig = LibConfig.mergeLibConfigs(sortedConfigs); @@ -256,12 +252,11 @@ void applyConfigOverrides(LibConfig libConfig) { maybeOverride(builder::setTraceSampleRate, libConfig.traceSampleRate); maybeOverride(builder::setTracingTags, parseTagListToMap(libConfig.tracingTags)); - DebuggerConfigBridge.updateConfig( - new DebuggerConfigUpdate( - libConfig.dynamicInstrumentationEnabled, - libConfig.exceptionReplayEnabled, - libConfig.codeOriginEnabled, - libConfig.liveDebuggingEnabled)); + DebuggerConfigBridge.updateConfig(new DebuggerConfigUpdate( + libConfig.dynamicInstrumentationEnabled, + libConfig.exceptionReplayEnabled, + libConfig.codeOriginEnabled, + libConfig.liveDebuggingEnabled)); builder.apply(); } @@ -605,13 +600,11 @@ public String getResource() { @Override public Map getTags() { if (null == tagMap) { - tagMap = - null == tags - ? Collections.emptyMap() - : tags.stream() - .collect( - Collectors.toMap( - SamplingRuleTagEntry::getKey, e -> normalizeGlob(e.getValue()))); + tagMap = null == tags + ? Collections.emptyMap() + : tags.stream() + .collect(Collectors.toMap( + SamplingRuleTagEntry::getKey, e -> normalizeGlob(e.getValue()))); } return tagMap; } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java index 114f2668790..a246b45b87b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java @@ -141,7 +141,9 @@ public Context extract(Context context, C carrier, CarrierVisitor visitor private class BaggageExtractor implements BiConsumer { private static final char KEY_VALUE_SEPARATOR = '='; private static final char PAIR_SEPARATOR = ','; - @Nullable private Baggage extracted; + + @Nullable + private Baggage extracted; /** URL decode value */ private String decode(final String value) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractors.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractors.java index 52088e97888..3b85f48e2ad 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractors.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractors.java @@ -19,10 +19,9 @@ public class DataStreamsTransactionExtractors { public static final DataStreamsTransactionExtractors EMPTY = new DataStreamsTransactionExtractors("[]", Collections.emptyList()); private static final Logger LOG = LoggerFactory.getLogger(DataStreamsTransactionExtractors.class); - private static final Moshi MOSHI = - new Moshi.Builder() - .add(new DataStreamsTransactionExtractors.DataStreamsTransactionExtractorAdapter()) - .build(); + private static final Moshi MOSHI = new Moshi.Builder() + .add(new DataStreamsTransactionExtractors.DataStreamsTransactionExtractorAdapter()) + .build(); private static final ParameterizedType LIST_OF_RULES = Types.newParameterizedType(List.class, DataStreamsTransactionExtractorImpl.class); public static final JsonAdapter> LIST_OF_RULES_ADAPTER = diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoring.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoring.java index 61b403a22e4..9897a029f55 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoring.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoring.java @@ -145,14 +145,9 @@ public DefaultDataStreamsMonitoring( @Override public void start() { checkDynamicConfig(); - cancellation = - AgentTaskScheduler.get() - .scheduleAtFixedRate( - new ReportTask(), - this, - bucketDurationNanos, - bucketDurationNanos, - TimeUnit.NANOSECONDS); + cancellation = AgentTaskScheduler.get() + .scheduleAtFixedRate( + new ReportTask(), this, bucketDurationNanos, bucketDurationNanos, TimeUnit.NANOSECONDS); thread.start(); } @@ -236,12 +231,11 @@ public Propagator propagator() { @Override public void mergePathwayContextIntoSpan(AgentSpan span, DataStreamsContextCarrier carrier) { if (span instanceof DDSpan) { - DefaultPathwayContext pathwayContext = - DefaultPathwayContext.extract( - carrier, - DataStreamsContextCarrierAdapter.INSTANCE, - this.timeSource, - getThreadServiceName()); + DefaultPathwayContext pathwayContext = DefaultPathwayContext.extract( + carrier, + DataStreamsContextCarrierAdapter.INSTANCE, + this.timeSource, + getThreadServiceName()); ((DDSpan) span).spanContext().mergePathwayContext(pathwayContext); } } @@ -259,29 +253,27 @@ public void reportSchemaRegistryUsage( boolean isSuccess, boolean isKey, String operation) { - inbox.offer( - new SchemaRegistryUsage( - topic, - clusterId, - schemaId, - isSuccess, - isKey, - operation, - timeSource.getCurrentTimeNanos(), - getThreadServiceName())); + inbox.offer(new SchemaRegistryUsage( + topic, + clusterId, + schemaId, + isSuccess, + isKey, + operation, + timeSource.getCurrentTimeNanos(), + getThreadServiceName())); } @Override public void reportKafkaConfig( String type, String kafkaClusterId, String consumerGroup, Map config) { - inbox.offer( - new KafkaConfigReport( - type, - kafkaClusterId, - consumerGroup, - config, - timeSource.getCurrentTimeNanos(), - getThreadServiceName())); + inbox.offer(new KafkaConfigReport( + type, + kafkaClusterId, + consumerGroup, + config, + timeSource.getCurrentTimeNanos(), + getThreadServiceName())); } @Override @@ -291,17 +283,16 @@ public void reportKafkaConsumerGroupMember( String memberId, int generationId, String memberProtocol) { - inbox.offer( - new KafkaConfigReport( - "kafka_consumer", - kafkaClusterId, - consumerGroup, - memberId, - generationId, - memberProtocol, - Collections.emptyMap(), - timeSource.getCurrentTimeNanos(), - getThreadServiceName())); + inbox.offer(new KafkaConfigReport( + "kafka_consumer", + kafkaClusterId, + consumerGroup, + memberId, + generationId, + memberProtocol, + Collections.emptyMap(), + timeSource.getCurrentTimeNanos(), + getThreadServiceName())); } @Override @@ -442,9 +433,8 @@ public void run() { } else if (supportsDataStreams) { if (payload instanceof StatsPoint) { StatsPoint statsPoint = (StatsPoint) payload; - StatsBucket statsBucket = - getStatsBucket( - statsPoint.getTimestampNanos(), statsPoint.getServiceNameOverride()); + StatsBucket statsBucket = getStatsBucket( + statsPoint.getTimestampNanos(), statsPoint.getServiceNameOverride()); statsBucket.addPoint(statsPoint); } else if (payload instanceof Backlog) { Backlog backlog = (Backlog) payload; @@ -469,9 +459,8 @@ public void run() { statsBucket.addSchemaRegistryUsage(usage); } else if (payload instanceof KafkaConfigReport) { KafkaConfigReport configReport = (KafkaConfigReport) payload; - StatsBucket statsBucket = - getStatsBucket( - configReport.getTimestampNanos(), configReport.getServiceNameOverride()); + StatsBucket statsBucket = getStatsBucket( + configReport.getTimestampNanos(), configReport.getServiceNameOverride()); statsBucket.addKafkaConfig(configReport); } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultPathwayContext.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultPathwayContext.java index a6a11610d33..bd6f803834c 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultPathwayContext.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultPathwayContext.java @@ -117,26 +117,24 @@ public synchronized void setCheckpoint( } long newHash = generatePathwayHash(nodeHash, hash); - long aggregationHash = - FNV64Hash.continueHash( - context.tags().getAggregationHash(), - DataStreamsTags.longToBytes(newHash), - FNV64Hash.Version.v1); + long aggregationHash = FNV64Hash.continueHash( + context.tags().getAggregationHash(), + DataStreamsTags.longToBytes(newHash), + FNV64Hash.Version.v1); long pathwayLatencyNano = nanoTicks - pathwayStartNanoTicks; long edgeLatencyNano = nanoTicks - edgeStartNanoTicks; - StatsPoint point = - new StatsPoint( - context.tags(), - newHash, - hash, - aggregationHash, - startNanos, - pathwayLatencyNano, - edgeLatencyNano, - context.payloadSizeBytes(), - serviceNameOverride); + StatsPoint point = new StatsPoint( + context.tags(), + newHash, + hash, + aggregationHash, + startNanos, + pathwayLatencyNano, + edgeLatencyNano, + context.payloadSizeBytes(), + serviceNameOverride); edgeStartNanoTicks = nanoTicks; hash = newHash; @@ -169,9 +167,8 @@ public synchronized String encode() throws IOException { long pathwayStartMillis = TimeUnit.NANOSECONDS.toMillis(pathwayStartNanos); VarEncodingHelper.encodeSignedVarLong(outputBuffer, pathwayStartMillis); - long edgeStartMillis = - pathwayStartMillis - + TimeUnit.NANOSECONDS.toMillis(edgeStartNanoTicks - pathwayStartNanoTicks); + long edgeStartMillis = pathwayStartMillis + + TimeUnit.NANOSECONDS.toMillis(edgeStartNanoTicks - pathwayStartNanoTicks); VarEncodingHelper.encodeSignedVarLong(outputBuffer, edgeStartMillis); byte[] base64 = Base64.getEncoder().encode(outputBuffer.trimmedCopy()); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/MsgPackDatastreamsPayloadWriter.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/MsgPackDatastreamsPayloadWriter.java index f94210309d9..e950524466d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/MsgPackDatastreamsPayloadWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/MsgPackDatastreamsPayloadWriter.java @@ -148,12 +148,11 @@ public void writePayload(Collection data, String serviceNameOverrid boolean hasTransactions = !bucket.getTransactions().isEmpty(); boolean hasSchemaRegistryUsages = !bucket.getSchemaRegistryUsages().isEmpty(); boolean hasKafkaConfigs = !bucket.getKafkaConfigs().isEmpty(); - writer.startMap( - 3 - + (hasBacklogs ? 1 : 0) - + (hasTransactions ? 2 : 0) - + (hasSchemaRegistryUsages ? 1 : 0) - + (hasKafkaConfigs ? 1 : 0)); + writer.startMap(3 + + (hasBacklogs ? 1 : 0) + + (hasTransactions ? 2 : 0) + + (hasSchemaRegistryUsages ? 1 : 0) + + (hasKafkaConfigs ? 1 : 0)); /* 1 */ writer.writeUTF8(START); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsBucket.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsBucket.java index b65300631d6..87134f35c0f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsBucket.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsBucket.java @@ -33,9 +33,8 @@ public void addPoint(StatsPoint statsPoint) { hashToGroup .computeIfAbsent( statsPoint.getAggregationHash(), - hash -> - new StatsGroup( - statsPoint.getTags(), statsPoint.getHash(), statsPoint.getParentHash())) + hash -> new StatsGroup( + statsPoint.getTags(), statsPoint.getHash(), statsPoint.getParentHash())) .add( statsPoint.getPathwayLatencyNano(), statsPoint.getEdgeLatencyNano(), @@ -49,14 +48,13 @@ public void addBacklog(Backlog backlog) { } public void addSchemaRegistryUsage(SchemaRegistryUsage usage) { - SchemaKey key = - new SchemaKey( - usage.getTopic(), - usage.getClusterId(), - usage.getSchemaId(), - usage.isSuccess(), - usage.isKey(), - usage.getOperation()); + SchemaKey key = new SchemaKey( + usage.getTopic(), + usage.getClusterId(), + usage.getSchemaId(), + usage.isSuccess(), + usage.isKey(), + usage.getOperation()); schemaRegistryUsages.merge(key, 1L, Long::sum); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java index 670cd029c1b..71118093b4b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/datastreams/StatsGroup.java @@ -56,14 +56,7 @@ public Histogram getPayloadSize() { @Override public String toString() { - return "StatsGroup{" - + "tags='" - + tags - + '\'' - + ", hash=" - + hash - + ", parentHash=" - + parentHash + return "StatsGroup{" + "tags='" + tags + '\'' + ", hash=" + hash + ", parentHash=" + parentHash + '}'; } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java b/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java index f9c76ff0766..916457aedf9 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java @@ -112,9 +112,8 @@ public class TracerHealthMetrics extends HealthMetrics implements AutoCloseable @Override public void start() { if (started.compareAndSet(false, true)) { - cancellation = - AgentTaskScheduler.get() - .scheduleAtFixedRate(new Flush(), this, interval, interval, units); + cancellation = AgentTaskScheduler.get() + .scheduleAtFixedRate(new Flush(), this, interval, interval, units); } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpCommonProto.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpCommonProto.java index 88fc102a335..aadadc78d82 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpCommonProto.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpCommonProto.java @@ -34,10 +34,9 @@ private OtlpCommonProto() {} public static final int I32_WIRE_TYPE = 5; // use same cache approach for attribute keys as TraceMapperV0_4 - private static final SimpleUtf8Cache KEY_CACHE = - Config.get().getTagNameUtf8CacheSize() > 0 - ? new SimpleUtf8Cache(Config.get().getTagNameUtf8CacheSize()) - : null; + private static final SimpleUtf8Cache KEY_CACHE = Config.get().getTagNameUtf8CacheSize() > 0 + ? new SimpleUtf8Cache(Config.get().getTagNameUtf8CacheSize()) + : null; // use same cache approach for attribute values as TraceMapperV0_4 private static final GenerationalUtf8Cache VALUE_CACHE = diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpProtoBuffer.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpProtoBuffer.java index 81196bfaa23..4bebe74a25f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpProtoBuffer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpProtoBuffer.java @@ -28,12 +28,11 @@ public final class OtlpProtoBuffer { public OtlpProtoBuffer(int requiredCapacity) { this.initialCapacity = nextPowerOfTwo(requiredCapacity); if (this.initialCapacity > MAX_CAPACITY_BYTES) { - throw new IllegalArgumentException( - "OTLP payload initial capacity of " - + this.initialCapacity - + " bytes exceeds maximum buffer size of " - + MAX_CAPACITY_BYTES - + " bytes"); + throw new IllegalArgumentException("OTLP payload initial capacity of " + + this.initialCapacity + + " bytes exceeds maximum buffer size of " + + MAX_CAPACITY_BYTES + + " bytes"); } this.buffer = ByteBuffer.allocate(initialCapacity); this.remaining = initialCapacity; @@ -142,14 +141,13 @@ private void checkCapacity(int required) { // (uses long arithmetic so overflow can be detected before allocating) long newSize = ((long) oldSize + required + initialCapacity - 1) & -initialCapacity; if (newSize > MAX_CAPACITY_BYTES) { - throw new IllegalStateException( - "OTLP payload exceeds maximum buffer size of " - + MAX_CAPACITY_BYTES - + " bytes: " - + oldSize - + " bytes buffered, " - + required - + " more requested"); + throw new IllegalStateException("OTLP payload exceeds maximum buffer size of " + + MAX_CAPACITY_BYTES + + " bytes: " + + oldSize + + " bytes buffered, " + + required + + " more requested"); } ByteBuffer newBuffer = ByteBuffer.allocate((int) newSize); // copy over old content so it stays at the far end diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java index 988307c6b03..66ce68b7896 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/common/OtlpResourceAttributes.java @@ -23,18 +23,16 @@ private OtlpResourceAttributes() {} /** Marks that the Agent should not recompute trace metrics from the exported spans. */ private static final String STATS_COMPUTED_KEY = "_dd.stats_computed"; - private static final Set IGNORED_GLOBAL_TAGS = - new HashSet<>( - asList( - "service", - "env", - "version", - "service.name", - "deployment.environment.name", - "service.version", - "telemetry.sdk.name", - "telemetry.sdk.version", - "telemetry.sdk.language")); + private static final Set IGNORED_GLOBAL_TAGS = new HashSet<>(asList( + "service", + "env", + "version", + "service.name", + "deployment.environment.name", + "service.version", + "telemetry.sdk.name", + "telemetry.sdk.version", + "telemetry.sdk.language")); /** * {@code value} is a {@link String}, except {@code datadog.process_tags}: a {@code List}. @@ -62,16 +60,13 @@ static void visitResourceAttributes( visitor.accept("telemetry.sdk.version", TRACER_VERSION); visitor.accept("telemetry.sdk.language", "java"); - config - .getGlobalTags() - .forEach( - (key, value) -> { - // ignore global tags replaced by canonical or extra resource attributes - if (!IGNORED_GLOBAL_TAGS.contains(key.toLowerCase(Locale.ROOT)) - && !extraAttributes.containsKey(key)) { - visitor.accept(key, value); - } - }); + config.getGlobalTags().forEach((key, value) -> { + // ignore global tags replaced by canonical or extra resource attributes + if (!IGNORED_GLOBAL_TAGS.contains(key.toLowerCase(Locale.ROOT)) + && !extraAttributes.containsKey(key)) { + visitor.accept(key, value); + } + }); extraAttributes.forEach(visitor); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsJson.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsJson.java index d356a53ab46..da3a159ff33 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsJson.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsJson.java @@ -24,7 +24,12 @@ public static void writeLogRecordFields(JsonWriter writer, OtlpLogRecord logReco } if (logRecord.body != null) { - writer.name("body").beginObject().name("stringValue").value(logRecord.body).endObject(); + writer + .name("body") + .beginObject() + .name("stringValue") + .value(logRecord.body) + .endObject(); } if (logRecord.spanContext != null) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java index e65a3757782..8aad170f3ed 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/logs/OtlpLogsService.java @@ -30,33 +30,30 @@ public final class OtlpLogsService { switch (config.getOtlpLogsProtocol()) { case GRPC: this.collector = OtlpLogsProtoCollector.INSTANCE; - this.sender = - new OtlpGrpcSender( - config.getOtlpLogsEndpoint(), - "/opentelemetry.proto.collector.logs.v1.LogsService/Export", - config.getOtlpLogsHeaders(), - config.getOtlpLogsTimeout(), - config.getOtlpLogsCompression()); + this.sender = new OtlpGrpcSender( + config.getOtlpLogsEndpoint(), + "/opentelemetry.proto.collector.logs.v1.LogsService/Export", + config.getOtlpLogsHeaders(), + config.getOtlpLogsTimeout(), + config.getOtlpLogsCompression()); break; case HTTP_PROTOBUF: this.collector = OtlpLogsProtoCollector.INSTANCE; - this.sender = - new OtlpHttpSender( - config.getOtlpLogsEndpoint(), - "/v1/logs", - config.getOtlpLogsHeaders(), - config.getOtlpLogsTimeout(), - config.getOtlpLogsCompression()); + this.sender = new OtlpHttpSender( + config.getOtlpLogsEndpoint(), + "/v1/logs", + config.getOtlpLogsHeaders(), + config.getOtlpLogsTimeout(), + config.getOtlpLogsCompression()); break; case HTTP_JSON: this.collector = OtlpLogsJsonCollector.INSTANCE; - this.sender = - new OtlpHttpSender( - config.getOtlpLogsEndpoint(), - "/v1/logs", - config.getOtlpLogsHeaders(), - config.getOtlpLogsTimeout(), - config.getOtlpLogsCompression()); + this.sender = new OtlpHttpSender( + config.getOtlpLogsEndpoint(), + "/v1/logs", + config.getOtlpLogsHeaders(), + config.getOtlpLogsTimeout(), + config.getOtlpLogsCompression()); break; default: LOGGER.debug("Unsupported OTLP logs protocol: {}", config.getOtlpLogsProtocol()); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java index 4a7580aa061..76177e170a6 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpMetricsService.java @@ -36,10 +36,9 @@ public final class OtlpMetricsService { LOGGER.debug("Unsupported OTLP metrics protocol: {}", config.getOtlpMetricsProtocol()); this.collector = null; } else { - this.collector = - config.getOtlpMetricsProtocol() == OtlpConfig.Protocol.HTTP_JSON - ? new OtlpMetricsJsonCollector(SystemTimeSource.INSTANCE) - : new OtlpMetricsProtoCollector(SystemTimeSource.INSTANCE); + this.collector = config.getOtlpMetricsProtocol() == OtlpConfig.Protocol.HTTP_JSON + ? new OtlpMetricsJsonCollector(SystemTimeSource.INSTANCE) + : new OtlpMetricsProtoCollector(SystemTimeSource.INSTANCE); } this.intervalMillis = config.getMetricsOtelInterval(); @@ -60,18 +59,13 @@ public void start() { // add random jitter of up to 5 seconds to initial delay; avoids a fleet // of apps starting at the same time from exporting OTLP metrics in sync - long initialMillis = - intervalMillis - + Math.min( - (long) - (500d - * Math.log(ThreadLocalRandom.current().nextDouble()) - / Math.log(1 - 0.25)), - 5_000); - - scheduledTask = - scheduler.scheduleAtFixedRate( - this::export, initialMillis, intervalMillis, TimeUnit.MILLISECONDS); + long initialMillis = intervalMillis + + Math.min( + (long) (500d * Math.log(ThreadLocalRandom.current().nextDouble()) / Math.log(1 - 0.25)), + 5_000); + + scheduledTask = scheduler.scheduleAtFixedRate( + this::export, initialMillis, intervalMillis, TimeUnit.MILLISECONDS); } public void flush() { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java index 5e69d20e1f0..3dc4e1e1875 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriter.java @@ -69,7 +69,8 @@ public final class OtlpStatsMetricWriter implements MetricWriter { private static final String SPAN_KIND_CONSUMER = "SPAN_KIND_CONSUMER"; private static final String SPAN_KIND_INTERNAL = "SPAN_KIND_INTERNAL"; - @Nullable private final OtlpSender sender; + @Nullable + private final OtlpSender sender; // own single-thread collector; forced to DELTA since trace-stats buckets are per-interval deltas. private final OtlpMetricsCollector collector; @@ -107,16 +108,11 @@ public OtlpStatsMetricWriter(Config config) { private OtlpStatsMetricWriter(@Nullable OtlpSender sender, OtlpConfig.Protocol protocol) { this.sender = sender; - this.collector = - protocol == OtlpConfig.Protocol.HTTP_JSON - ? new OtlpMetricsJsonCollector( - SystemTimeSource.INSTANCE, - true, - OtlpResourceJson.RESOURCE_FRAGMENT_WITH_DATADOG_ATTRS) - : new OtlpMetricsProtoCollector( - SystemTimeSource.INSTANCE, - true, - OtlpResourceProto.RESOURCE_MESSAGE_WITH_DATADOG_ATTRS); + this.collector = protocol == OtlpConfig.Protocol.HTTP_JSON + ? new OtlpMetricsJsonCollector( + SystemTimeSource.INSTANCE, true, OtlpResourceJson.RESOURCE_FRAGMENT_WITH_DATADOG_ATTRS) + : new OtlpMetricsProtoCollector( + SystemTimeSource.INSTANCE, true, OtlpResourceProto.RESOURCE_MESSAGE_WITH_DATADOG_ATTRS); } @Override @@ -134,22 +130,20 @@ public void add(AggregateEntry entry) { Histogram okLatencies = entry.getOkLatencies(); if (!okLatencies.isEmpty()) { - pending.add( - new PendingPoint( - entry, - OtlpStatsHistogramBuckets.toHistogramPoint(okLatencies, entry.getOkDuration()), - false, - allTopLevel)); + pending.add(new PendingPoint( + entry, + OtlpStatsHistogramBuckets.toHistogramPoint(okLatencies, entry.getOkDuration()), + false, + allTopLevel)); } Histogram errorLatencies = entry.getErrorLatencies(); if (errorLatencies != null && !errorLatencies.isEmpty()) { - pending.add( - new PendingPoint( - entry, - OtlpStatsHistogramBuckets.toHistogramPoint(errorLatencies, entry.getErrorDuration()), - true, - allTopLevel)); + pending.add(new PendingPoint( + entry, + OtlpStatsHistogramBuckets.toHistogramPoint(errorLatencies, entry.getErrorDuration()), + true, + allTopLevel)); } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/otlp/trace/OtlpTraceProto.java b/dd-trace-core/src/main/java/datadog/trace/core/otlp/trace/OtlpTraceProto.java index f97d05c388d..63792d753e1 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/otlp/trace/OtlpTraceProto.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/otlp/trace/OtlpTraceProto.java @@ -177,14 +177,10 @@ public static int recordSpanLinkMessage( writeString(buf, spanLink.traceState()); } - spanLink - .attributes() - .asMap() - .forEach( - (key, value) -> { - writeTag(buf, 4, LEN_WIRE_TYPE); - writeAttribute(buf, STRING_ATTRIBUTE, key, value); - }); + spanLink.attributes().asMap().forEach((key, value) -> { + writeTag(buf, 4, LEN_WIRE_TYPE); + writeAttribute(buf, STRING_ATTRIBUTE, key, value); + }); writeTag(buf, 6, I32_WIRE_TYPE); writeI32(buf, spanLink.traceFlags() & 0xff); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ContextInterpreter.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ContextInterpreter.java index 14a6459ca0f..ea07b614cc4 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ContextInterpreter.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ContextInterpreter.java @@ -243,10 +243,9 @@ protected final boolean addBaggageItem(String key, String value) { return false; } - final long projectedBytes = - oldValue == null - ? (long) baggageBytes + key.length() + value.length() - : (long) baggageBytes + value.length() - oldValue.length(); + final long projectedBytes = oldValue == null + ? (long) baggageBytes + key.length() + value.length() + : (long) baggageBytes + value.length() - oldValue.length(); if (projectedBytes > baggageMaxBytes) { LOG.debug("Dropping baggage item {}: byte limit {} reached", key, baggageMaxBytes); @@ -277,10 +276,9 @@ public ContextInterpreter reset(TraceConfig traceConfig) { valid = true; fullContext = true; httpHeaders = null; - collectIpHeaders = - this.clientIpWithoutAppSec - || this.clientIpResolutionEnabled - && (ActiveSubsystems.APPSEC_ACTIVE || this.aiGuardEnabled); + collectIpHeaders = this.clientIpWithoutAppSec + || this.clientIpResolutionEnabled + && (ActiveSubsystems.APPSEC_ACTIVE || this.aiGuardEnabled); headerTags = traceConfig.getRequestHeaderTags(); baggageMapping = traceConfig.getBaggageMapping(); propagationTags = null; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/HaystackHttpCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/HaystackHttpCodec.java index 61e9a40e897..a691c8cd167 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/HaystackHttpCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/HaystackHttpCodec.java @@ -86,7 +86,9 @@ public void inject( setter.set(carrier, TRACE_ID_KEY, injectedTraceId); context.setTag(HAYSTACK_TRACE_ID_BAGGAGE_KEY, injectedTraceId); setter.set( - carrier, DD_TRACE_ID_BAGGAGE_KEY, HttpCodec.encode(context.getTraceId().toString())); + carrier, + DD_TRACE_ID_BAGGAGE_KEY, + HttpCodec.encode(context.getTraceId().toString())); setter.set(carrier, SPAN_ID_KEY, convertLongToUUID(context.getSpanId())); setter.set( carrier, @@ -216,11 +218,10 @@ public boolean accept(String key, String value) { case PARENT_ID: addBaggageItem(HAYSTACK_PARENT_ID_BAGGAGE_KEY, firstValue); break; - case BAGGAGE: - { - addBaggageItem(lowerCaseKey.substring(BAGGAGE_PREFIX_LC.length()), value); - break; - } + case BAGGAGE: { + addBaggageItem(lowerCaseKey.substring(BAGGAGE_PREFIX_LC.length()), value); + break; + } default: } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java index 38783860e9b..db487e04a18 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java @@ -244,13 +244,12 @@ public TagContext extract( } } else { // Terminate extracted context and add it as span link - context.addTerminatedSpanLink( - DDSpanLink.from( - (ExtractedContext) extracted, - SpanAttributes.builder() - .put("reason", "terminated_context") - .put("context_headers", extracted.getPropagationStyle().toString()) - .build())); + context.addTerminatedSpanLink(DDSpanLink.from( + (ExtractedContext) extracted, + SpanAttributes.builder() + .put("reason", "terminated_context") + .put("context_headers", extracted.getPropagationStyle().toString()) + .build())); // TODO Note: Other vendor tracestate will be lost here } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/NoneCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/NoneCodec.java index 5d6924ea69e..8954f21643c 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/NoneCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/NoneCodec.java @@ -61,11 +61,10 @@ public boolean accept(String key, String value) { } } - public static final HttpCodec.Injector INJECTOR = - new HttpCodec.Injector() { - @Override - public void inject(DDSpanContext context, C carrier, CarrierSetter setter) {} - }; + public static final HttpCodec.Injector INJECTOR = new HttpCodec.Injector() { + @Override + public void inject(DDSpanContext context, C carrier, CarrierSetter setter) {} + }; public static HttpCodec.Extractor newExtractor( Config config, Supplier traceConfigSupplier) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CHttpCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CHttpCodec.java index 86ea382b482..e8739c46e5f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CHttpCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CHttpCodec.java @@ -40,9 +40,15 @@ class W3CHttpCodec { private static final int TRACE_PARENT_FLAGS_SAMPLED = 1; private static final int TRACE_PARENT_LENGTH = TRACE_PARENT_FLAGS_START + 2; - @VisibleForTesting static final String TRACE_PARENT_KEY = "traceparent"; - @VisibleForTesting static final String TRACE_STATE_KEY = "tracestate"; - @VisibleForTesting static final String OT_BAGGAGE_PREFIX = "ot-baggage-"; + @VisibleForTesting + static final String TRACE_PARENT_KEY = "traceparent"; + + @VisibleForTesting + static final String TRACE_STATE_KEY = "tracestate"; + + @VisibleForTesting + static final String OT_BAGGAGE_PREFIX = "ot-baggage-"; + static final String E2E_START_KEY = OT_BAGGAGE_PREFIX + DDTags.TRACE_START_TIME; private W3CHttpCodec() { @@ -71,9 +77,8 @@ public void inject( } private void injectTraceParent(DDSpanContext context, C carrier, CarrierSetter setter) { - String traceparent = - W3CTraceParent.from( - context.getTraceId(), context.getSpanId(), context.getSamplingPriority() > 0); + String traceparent = W3CTraceParent.from( + context.getTraceId(), context.getSpanId(), context.getSamplingPriority() > 0); setter.set(carrier, TRACE_PARENT_KEY, traceparent); } @@ -288,16 +293,14 @@ void parseTraceParentHeader(String tp) { } DDTraceId traceId = DD128bTraceId.fromHex(tp, TRACE_PARENT_TID_START, 32, true); if (traceId.toLong() == 0) { - throw new IllegalStateException( - "Illegal all zero 64 bit trace id " - + tp.substring(TRACE_PARENT_TID_START, TRACE_PARENT_TID_END)); + throw new IllegalStateException("Illegal all zero 64 bit trace id " + + tp.substring(TRACE_PARENT_TID_START, TRACE_PARENT_TID_END)); } this.traceId = traceId; this.spanId = DDSpanId.fromHex(tp, TRACE_PARENT_SID_START, 16, true); if (this.spanId == 0) { - throw new IllegalStateException( - "Illegal all zero span id " - + tp.substring(TRACE_PARENT_SID_START, TRACE_PARENT_SID_END)); + throw new IllegalStateException("Illegal all zero span id " + + tp.substring(TRACE_PARENT_SID_START, TRACE_PARENT_SID_END)); } if (version != 0 && length > TRACE_PARENT_LENGTH && tp.charAt(TRACE_PARENT_LENGTH) != '-') { throw new IllegalStateException("Illegal character after flags in '" + tp + "'"); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/XRayHttpCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/XRayHttpCodec.java index bce004eb054..fc035db4b20 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/XRayHttpCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/XRayHttpCodec.java @@ -70,20 +70,18 @@ public Injector(Map invertedBaggageMapping) { public void inject(DDSpanContext context, C carrier, CarrierSetter setter) { long e2eStart = context.getEndToEndStartTime(); - StringBuilder buf = - new StringBuilder() - .append(ROOT_PREFIX) - .append( - String.format( - "%08x", - e2eStart > 0 - ? NANOSECONDS.toSeconds(e2eStart) - : MILLISECONDS.toSeconds( - context.getTraceCollector().getTimeSource().getCurrentTimeMillis()))) - .append(TRACE_ID_PADDING) - .append(context.getTraceId().toHexStringPadded(16)) - .append(';' + PARENT_PREFIX) - .append(DDSpanId.toHexStringPadded(context.getSpanId())); + StringBuilder buf = new StringBuilder() + .append(ROOT_PREFIX) + .append(String.format( + "%08x", + e2eStart > 0 + ? NANOSECONDS.toSeconds(e2eStart) + : MILLISECONDS.toSeconds( + context.getTraceCollector().getTimeSource().getCurrentTimeMillis()))) + .append(TRACE_ID_PADDING) + .append(context.getTraceId().toHexStringPadded(16)) + .append(';' + PARENT_PREFIX) + .append(DDSpanId.toHexStringPadded(context.getSpanId())); if (context.lockSamplingPriority()) { buf.append(';' + SAMPLED_PREFIX) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/opg/OrgGuard.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/opg/OrgGuard.java index 870bb80fd61..2a5c2368540 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/opg/OrgGuard.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/opg/OrgGuard.java @@ -16,7 +16,8 @@ */ public final class OrgGuard { - @Nullable private final OrgGuardEnforcer enforcer; + @Nullable + private final OrgGuardEnforcer enforcer; public static OrgGuard create( Config config, diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/DatadogPTagsCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/DatadogPTagsCodec.java index 3ac0c7ad712..be6862993a8 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/DatadogPTagsCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/DatadogPTagsCodec.java @@ -65,17 +65,15 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) { int traceSource = 0; TagValue orgPropagationMarkerTagValue = null; while (tagPos < len) { - int tagKeyEndsAt = - validateCharsUntilSeparatorOrEnd( - value, tagPos, TAG_KEY_SEPARATOR, DatadogPTagsCodec::isAllowedKeyChar); + int tagKeyEndsAt = validateCharsUntilSeparatorOrEnd( + value, tagPos, TAG_KEY_SEPARATOR, DatadogPTagsCodec::isAllowedKeyChar); if (tagKeyEndsAt < 0 || tagKeyEndsAt == len) { log.warn("Invalid datadog tags header value: '{}' at {}", value, tagPos); return tagsFactory.createInvalid(PROPAGATION_ERROR_DECODING_ERROR); } int tagValuePos = tagKeyEndsAt + 1; - int tagValueEndsAt = - validateCharsUntilSeparatorOrEnd( - value, tagValuePos, TAGS_SEPARATOR, DatadogPTagsCodec::isAllowedValueChar); + int tagValueEndsAt = validateCharsUntilSeparatorOrEnd( + value, tagValuePos, TAGS_SEPARATOR, DatadogPTagsCodec::isAllowedValueChar); if (tagValueEndsAt < 0) { log.warn("Invalid datadog tags header value: '{}' at {}", value, tagKeyEndsAt); return tagsFactory.createInvalid(PROPAGATION_ERROR_DECODING_ERROR); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsCodec.java index e2c0658a1d2..09e3a96321d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsCodec.java @@ -45,25 +45,22 @@ static String headerValue(PTagsCodec codec, PTags ptags, CharSequence lastParent size = codec.appendTag(sb, TRACE_ID_TAG, ptags.getTraceIdHighOrderBitsHexTagValue(), size); } if (ptags.getTraceSource() != ProductTraceSource.UNSET) { - size = - codec.appendTag( - sb, - TRACE_SOURCE_TAG, - TagValue.from(ProductTraceSource.getBitfieldHex(ptags.getTraceSource())), - size); + size = codec.appendTag( + sb, + TRACE_SOURCE_TAG, + TagValue.from(ProductTraceSource.getBitfieldHex(ptags.getTraceSource())), + size); } if (ptags.getDebugPropagation() != null) { size = codec.appendTag(sb, DEBUG_TAG, TagValue.from(ptags.getDebugPropagation()), size); } if (ptags.getKnuthSamplingRateTagValue() != null) { - size = - codec.appendTag( - sb, KNUTH_SAMPLING_RATE_TAG, ptags.getKnuthSamplingRateTagValue(), size); + size = codec.appendTag( + sb, KNUTH_SAMPLING_RATE_TAG, ptags.getKnuthSamplingRateTagValue(), size); } if (ptags.getOrgPropagationMarkerTagValue() != null) { - size = - codec.appendTag( - sb, ORG_PROPAGATION_MARKER_TAG, ptags.getOrgPropagationMarkerTagValue(), size); + size = codec.appendTag( + sb, ORG_PROPAGATION_MARKER_TAG, ptags.getOrgPropagationMarkerTagValue(), size); } Iterator it = ptags.getTagPairs().iterator(); while (it.hasNext() && !codec.isTooLarge(sb, size)) { @@ -122,12 +119,18 @@ static void fillTagMap(PTags propagationTags, Map tagMap) { if (propagationTags.getKnuthSamplingRateTagValue() != null) { tagMap.put( KNUTH_SAMPLING_RATE_TAG.forType(Encoding.DATADOG).toString(), - propagationTags.getKnuthSamplingRateTagValue().forType(Encoding.DATADOG).toString()); + propagationTags + .getKnuthSamplingRateTagValue() + .forType(Encoding.DATADOG) + .toString()); } if (propagationTags.getOrgPropagationMarkerTagValue() != null) { tagMap.put( ORG_PROPAGATION_MARKER_TAG.forType(Encoding.DATADOG).toString(), - propagationTags.getOrgPropagationMarkerTagValue().forType(Encoding.DATADOG).toString()); + propagationTags + .getOrgPropagationMarkerTagValue() + .forType(Encoding.DATADOG) + .toString()); } if (propagationTags.getTraceIdHighOrderBitsHexTagValue() != null) { tagMap.put( diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsFactory.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsFactory.java index 0b5184d448a..db8ff9d8192 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsFactory.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/PTagsFactory.java @@ -193,26 +193,24 @@ static class PTags extends PropagationTags { this.orgPropagationMarkerTagValue = orgPropagationMarkerTagValue; if (traceIdTagValue != null) { CharSequence traceIdHighOrderBitsHex = traceIdTagValue.forType(TagElement.Encoding.DATADOG); - this.traceIdHighOrderBits = - LongStringUtils.parseUnsignedLongHex( - traceIdHighOrderBitsHex, 0, traceIdHighOrderBitsHex.length(), true); + this.traceIdHighOrderBits = LongStringUtils.parseUnsignedLongHex( + traceIdHighOrderBitsHex, 0, traceIdHighOrderBitsHex.length(), true); } this.traceIdHighOrderBitsHexTagValue = traceIdTagValue; this.error = null; } static PTags withError(PTagsFactory factory, String error) { - PTags pTags = - new PTags( - factory, - null, - null, - null, - ProductTraceSource.UNSET, - PrioritySampling.UNSET, - null, - null, - null); + PTags pTags = new PTags( + factory, + null, + null, + null, + ProductTraceSource.UNSET, + PrioritySampling.UNSET, + null, + null, + null); pTags.error = error; return pTags; } @@ -266,21 +264,19 @@ private void doUpdateTraceSamplingPriority(int samplingPriority, int samplingMec @Override public void addTraceSource(final int product) { - TRACE_SOURCE_UPDATER.updateAndGet( - this, - currentValue -> { - // If the product is already marked, return the same value (no change) - if (ProductTraceSource.isProductMarked(currentValue, product)) { - return currentValue; - } - - // Invalidate cached headers (atomic context ensures correctness) - clearCachedHeader(DATADOG); - clearCachedHeader(W3C); + TRACE_SOURCE_UPDATER.updateAndGet(this, currentValue -> { + // If the product is already marked, return the same value (no change) + if (ProductTraceSource.isProductMarked(currentValue, product)) { + return currentValue; + } + + // Invalidate cached headers (atomic context ensures correctness) + clearCachedHeader(DATADOG); + clearCachedHeader(W3C); - // Set the bit for the given product - return ProductTraceSource.updateProduct(currentValue, product); - }); + // Set the bit for the given product + return ProductTraceSource.updateProduct(currentValue, product); + }); } @Override @@ -407,10 +403,9 @@ public long getTraceIdHighOrderBits() { public void updateTraceIdHighOrderBits(long highOrderBits) { if (traceIdHighOrderBits != highOrderBits) { traceIdHighOrderBits = highOrderBits; - traceIdHighOrderBitsHexTagValue = - highOrderBits == 0 - ? null - : TagValue.from(LongStringUtils.toHexStringPadded(highOrderBits, 16)); + traceIdHighOrderBitsHexTagValue = highOrderBits == 0 + ? null + : TagValue.from(LongStringUtils.toHexStringPadded(highOrderBits, 16)); clearCachedHeader(DATADOG); } } @@ -506,19 +501,16 @@ int getXDatadogTagsSize() { size = PTagsCodec.calcXDatadogTagsSize(getTagPairs()); size = PTagsCodec.calcXDatadogTagsSize(size, DECISION_MAKER_TAG, decisionMakerTagValue); size = PTagsCodec.calcXDatadogTagsSize(size, TRACE_ID_TAG, traceIdHighOrderBitsHexTagValue); - size = - PTagsCodec.calcXDatadogTagsSize( - size, KNUTH_SAMPLING_RATE_TAG, getKnuthSamplingRateTagValue()); - size = - PTagsCodec.calcXDatadogTagsSize( - size, ORG_PROPAGATION_MARKER_TAG, getOrgPropagationMarkerTagValue()); + size = PTagsCodec.calcXDatadogTagsSize( + size, KNUTH_SAMPLING_RATE_TAG, getKnuthSamplingRateTagValue()); + size = PTagsCodec.calcXDatadogTagsSize( + size, ORG_PROPAGATION_MARKER_TAG, getOrgPropagationMarkerTagValue()); int currentProductTraceSource = traceSource; if (currentProductTraceSource != ProductTraceSource.UNSET) { - size = - PTagsCodec.calcXDatadogTagsSize( - size, - TRACE_SOURCE_TAG, - TagValue.from(ProductTraceSource.getBitfieldHex(currentProductTraceSource))); + size = PTagsCodec.calcXDatadogTagsSize( + size, + TRACE_SOURCE_TAG, + TagValue.from(ProductTraceSource.getBitfieldHex(currentProductTraceSource))); } xDatadogTagsSize = size; } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/TagValue.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/TagValue.java index 8c1d6412fec..8fb6099731a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/TagValue.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/TagValue.java @@ -118,10 +118,9 @@ private static char convertW3CtoDD(char c) { TagValue(Encoding encoding, int hash, CharSequence s, int start, int end) { this.source = encoding.ordinal(); this.hash = hash; - values[source] = - (start == 0 && end == s.length()) - ? s - : new StringBuilder(end - start).append(s, start, end).toString(); + values[source] = (start == 0 && end == s.length()) + ? s + : new StringBuilder(end - start).append(s, start, end).toString(); } CharSequence forType(Encoding encoding) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/W3CPTagsCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/W3CPTagsCodec.java index c0018544188..992d1965ee4 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/W3CPTagsCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/W3CPTagsCodec.java @@ -27,7 +27,9 @@ public class W3CPTagsCodec extends PTagsCodec { private static final char KEY_VALUE_SEPARATOR = ':'; private static final int MIN_ALLOWED_CHAR = 32; private static final int MAX_ALLOWED_CHAR = 126; - @VisibleForTesting public static final int MAX_MEMBER_COUNT = 32; + + @VisibleForTesting + public static final int MAX_MEMBER_COUNT = 32; @Override PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) { @@ -104,14 +106,13 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) { if (tagPos >= ddMemberValueEnd) { break; } - int tagKeyEndsAt = - validateCharsUntilSeparatorOrEnd( - value, - tagPos, - ddMemberValueEnd, - KEY_VALUE_SEPARATOR, - false, - W3CPTagsCodec::isAllowedKeyChar); + int tagKeyEndsAt = validateCharsUntilSeparatorOrEnd( + value, + tagPos, + ddMemberValueEnd, + KEY_VALUE_SEPARATOR, + false, + W3CPTagsCodec::isAllowedKeyChar); if (tagKeyEndsAt < 0 || tagKeyEndsAt >= ddMemberValueEnd) { int nextTagPos = skipMalformedElement(value, tagPos, ddMemberValueEnd); maxUnknownSize += (nextTagPos - tagPos); // still relay malformed elements @@ -119,14 +120,13 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) { continue; } int tagValuePos = tagKeyEndsAt + 1; - int tagValueEndsAt = - validateCharsUntilSeparatorOrEnd( - value, - tagValuePos, - ddMemberValueEnd, - ELEMENT_SEPARATOR, - true, - W3CPTagsCodec::isAllowedValueChar); + int tagValueEndsAt = validateCharsUntilSeparatorOrEnd( + value, + tagValuePos, + ddMemberValueEnd, + ELEMENT_SEPARATOR, + true, + W3CPTagsCodec::isAllowedValueChar); if (tagValueEndsAt < 0) { int nextTagPos = skipMalformedElement(value, tagValuePos, ddMemberValueEnd); maxUnknownSize += (nextTagPos - tagPos); // still relay malformed elements diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index fea272bde9d..f783e57e299 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -158,10 +158,9 @@ private AgentScope activate( assert span != null; // Inherit the async propagation from the active scope unless the value is overridden - boolean asyncPropagation = - overrideAsyncPropagation - ? isAsyncPropagating - : top != null ? top.isAsyncPropagating() : DEFAULT_ASYNC_PROPAGATING; + boolean asyncPropagation = overrideAsyncPropagation + ? isAsyncPropagating + : top != null ? top.isAsyncPropagating() : DEFAULT_ASYNC_PROPAGATING; Context context = top != null ? top.context.with(span) : span; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java index 7b2c4c1737f..03628e746ce 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java @@ -25,17 +25,16 @@ public ServiceDiscovery(ForeignMemoryWriter foreignMemoryWriter) { public void writeTracerMetadata(Config config) { try { - byte[] payload = - ServiceDiscovery.encodePayload( - TracerVersion.TRACER_VERSION, - config.getHostName(), - config.isAppLogsCollectionEnabled(), - config.getRuntimeId(), - config.getServiceName(), - config.getEnv(), - config.getVersion(), - ProcessTags.getTagsForSerialization(), - ContainerInfo.get().getContainerId()); + byte[] payload = ServiceDiscovery.encodePayload( + TracerVersion.TRACER_VERSION, + config.getHostName(), + config.isAppLogsCollectionEnabled(), + config.getRuntimeId(), + config.getServiceName(), + config.getEnv(), + config.getVersion(), + ProcessTags.getTagsForSerialization(), + ContainerInfo.get().getContainerId()); foreignMemoryWriter.write(generateFileName(), payload); } catch (Throwable t) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java index d81a9cc8441..6b7800705b3 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java @@ -77,10 +77,9 @@ public TagInterceptor( this.ruleFlags = ruleFlags; splitByServletContext = splitServiceTags.contains(SERVLET_CONTEXT); - shouldSet404ResourceName = - ruleFlags.isEnabled(URL_AS_RESOURCE_NAME) - && ruleFlags.isEnabled(STATUS_404) - && ruleFlags.isEnabled(STATUS_404_DECORATOR); + shouldSet404ResourceName = ruleFlags.isEnabled(URL_AS_RESOURCE_NAME) + && ruleFlags.isEnabled(STATUS_404) + && ruleFlags.isEnabled(STATUS_404_DECORATOR); shouldSetUrlResourceAsName = ruleFlags.isEnabled(URL_AS_RESOURCE_NAME); this.jeeSplitByDeployment = jeeSplitByDeployment; } @@ -229,10 +228,9 @@ private static void setResourceFromUrl( } if (path != null) { final boolean isClient = Tags.SPAN_KIND_CLIENT.equals(span.getSpanKindString()); - Pair normalized = - isClient - ? HttpResourceNames.computeForClient(method, path, false) - : HttpResourceNames.computeForServer(method, path, false); + Pair normalized = isClient + ? HttpResourceNames.computeForClient(method, path, false) + : HttpResourceNames.computeForServer(method, path, false); if (normalized.hasLeft()) { span.setResourceName(normalized.getLeft(), normalized.getRight()); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessor.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessor.java index c2e0dd72761..1e64a86af8b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessor.java @@ -37,10 +37,9 @@ public class HttpEndpointPostProcessor extends TagsPostProcessor { /** Creates a new HttpEndpointPostProcessor using the global config. */ public HttpEndpointPostProcessor() { - this( - new EndpointResolver( - datadog.trace.api.Config.get().isTraceResourceRenamingEnabled(), - datadog.trace.api.Config.get().isTraceResourceRenamingAlwaysSimplifiedEndpoint())); + this(new EndpointResolver( + datadog.trace.api.Config.get().isTraceResourceRenamingEnabled(), + datadog.trace.api.Config.get().isTraceResourceRenamingAlwaysSimplifiedEndpoint())); } /** diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/InternalTagsAdder.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/InternalTagsAdder.java index 3e6b8b13192..1d8d681c3ab 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/InternalTagsAdder.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/InternalTagsAdder.java @@ -15,15 +15,16 @@ public final class InternalTagsAdder extends TagsPostProcessor { // Prebuilt once to avoid per-span Entry allocation. private final TagMap.Entry baseServiceEntry; - @Nullable private final TagMap.Entry versionEntry; + + @Nullable + private final TagMap.Entry versionEntry; public InternalTagsAdder(@Nonnull final String ddService, @Nullable final String version) { this.ddService = UTF8BytesString.create(ddService); this.baseServiceEntry = TagMap.Entry.create(DDTags.BASE_SERVICE, this.ddService); - this.versionEntry = - version != null && !version.isEmpty() - ? TagMap.Entry.create(VERSION, UTF8BytesString.create(version)) - : null; + this.versionEntry = version != null && !version.isEmpty() + ? TagMap.Entry.create(VERSION, UTF8BytesString.create(version)) + : null; } @Override diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java index b0d252db980..a4f5d76f1d7 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java @@ -105,10 +105,9 @@ private static AgentSpanLink handleDynamoDbSpanPointer(Map unsaf primaryKey2Value = ""; } - String[] components = - new String[] { - tableName, primaryKey1Name, primaryKey1Value, primaryKey2Name, primaryKey2Value - }; + String[] components = new String[] { + tableName, primaryKey1Name, primaryKey1Value, primaryKey2Name, primaryKey2Value + }; try { String hash = generatePointerHash(components); return buildSpanPointer(hash, DYNAMODB_PTR_KIND); @@ -151,13 +150,12 @@ private static String generatePointerHash(String[] components) throws NoSuchAlgo } private static AgentSpanLink buildSpanPointer(String hash, String ptrKind) { - SpanAttributes attributes = - SpanAttributes.builder() - .put("ptr.kind", ptrKind) - .put("ptr.dir", DOWN_DIRECTION) - .put("ptr.hash", hash) - .put("link.kind", LINK_KIND) - .build(); + SpanAttributes attributes = SpanAttributes.builder() + .put("ptr.kind", ptrKind) + .put("ptr.dir", DOWN_DIRECTION) + .put("ptr.hash", hash) + .put("link.kind", LINK_KIND) + .build(); return SpanLink.from(noopSpanContext(), DEFAULT_FLAGS, "", attributes); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/util/PercentEscaper.java b/dd-trace-core/src/main/java/datadog/trace/core/util/PercentEscaper.java index cfe1f02b4a9..918ed97451b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/util/PercentEscaper.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/util/PercentEscaper.java @@ -372,27 +372,25 @@ private static int codePointAt(CharSequence seq, int index, int end) { if (Character.isLowSurrogate(c2)) { return Character.toCodePoint(c1, c2); } - throw new IllegalArgumentException( - "Expected low surrogate but got char '" - + c2 - + "' with value " - + (int) c2 - + " at index " - + index - + " in '" - + seq - + "'"); + throw new IllegalArgumentException("Expected low surrogate but got char '" + + c2 + + "' with value " + + (int) c2 + + " at index " + + index + + " in '" + + seq + + "'"); } else { - throw new IllegalArgumentException( - "Unexpected low surrogate character '" - + c1 - + "' with value " - + (int) c1 - + " at index " - + (index - 1) - + " in '" - + seq - + "'"); + throw new IllegalArgumentException("Unexpected low surrogate character '" + + c1 + + "' with value " + + (int) c1 + + " at index " + + (index - 1) + + " in '" + + seq + + "'"); } } throw new IndexOutOfBoundsException("Index exceeds specified range"); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/util/StackTraces.java b/dd-trace-core/src/main/java/datadog/trace/core/util/StackTraces.java index 47299f034f6..eb05d797813 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/util/StackTraces.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/util/StackTraces.java @@ -65,12 +65,11 @@ public static String getStackTrace(Throwable t, int maxChars) { // StackOverflowError while formatting an already stack-constrained throwable). // Reconstruct from getStackTrace() so the call site is still locatable. try { - trace = - t.getClass().getName() - + System.lineSeparator() - + Arrays.stream(t.getStackTrace()) - .map(f -> "\tat " + f) - .collect(Collectors.joining(System.lineSeparator())); + trace = t.getClass().getName() + + System.lineSeparator() + + Arrays.stream(t.getStackTrace()) + .map(f -> "\tat " + f) + .collect(Collectors.joining(System.lineSeparator())); } catch (Exception | StackOverflowError ignored2) { try { trace = t.getClass().getName() + ": " + t.getMessage(); @@ -121,18 +120,15 @@ static String truncate(String trace, int maxChars) { private static String abbreviatePackageNames(String trace) { StringBuilder sb = new StringBuilder(trace.length()); - new BufferedReader(new StringReader(trace)) - .lines() - .forEach( - line -> { - Matcher m = FRAME.matcher(line); - if (m.matches()) { - sb.append("\tat ").append(abbreviatePackageName(m.group(1))).append(m.group(2)); - } else { - sb.append(line); - } - sb.append(System.lineSeparator()); - }); + new BufferedReader(new StringReader(trace)).lines().forEach(line -> { + Matcher m = FRAME.matcher(line); + if (m.matches()) { + sb.append("\tat ").append(abbreviatePackageName(m.group(1))).append(m.group(2)); + } else { + sb.append(line); + } + sb.append(System.lineSeparator()); + }); return sb.toString(); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/util/SystemAccess.java b/dd-trace-core/src/main/java/datadog/trace/core/util/SystemAccess.java index da82cf71625..cb045f41b8c 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/util/SystemAccess.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/util/SystemAccess.java @@ -34,14 +34,12 @@ public static void enableJmx() { * system provider will be loaded at exact moment when the reflection code is executed. Then it is up * to the caller to ensure that it is safe to use JMX. */ - systemAccessProvider = - (SystemAccessProvider) - Class.forName( - "datadog.trace.core.util.JmxSystemAccessProvider", - false, - SystemAccess.class.getClassLoader()) - .getField("INSTANCE") - .get(null); + systemAccessProvider = (SystemAccessProvider) Class.forName( + "datadog.trace.core.util.JmxSystemAccessProvider", + false, + SystemAccess.class.getClassLoader()) + .getField("INSTANCE") + .get(null); } catch (final ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { log.info("Unable to initialize JMX system provider", e); } diff --git a/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaAppSecHandler.java b/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaAppSecHandler.java index 4aac101e98a..7662cb0a841 100644 --- a/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaAppSecHandler.java +++ b/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaAppSecHandler.java @@ -400,10 +400,9 @@ private static AgentSpanContext processAppSecRequestData( // Call requestMethodUriRaw if (eventData.method != null && eventData.path != null) { datadog.trace.api.function.TriFunction> - methodUriCallback = - tracer - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.requestMethodUriRaw()); + methodUriCallback = tracer + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.requestMethodUriRaw()); if (methodUriCallback != null) { methodUriCallback.apply(requestContext, eventData.method, uriAdapter); } else { @@ -413,10 +412,9 @@ private static AgentSpanContext processAppSecRequestData( // Call requestHeader for each header if (eventData.headers != null && !eventData.headers.isEmpty()) { - TriConsumer headerCallback = - tracer - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.requestHeader()); + TriConsumer headerCallback = tracer + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.requestHeader()); if (headerCallback != null) { for (Map.Entry header : eventData.headers.entrySet()) { headerCallback.accept(requestContext, header.getKey(), header.getValue()); @@ -429,10 +427,9 @@ private static AgentSpanContext processAppSecRequestData( // Call requestClientSocketAddress if (eventData.sourceIp != null) { datadog.trace.api.function.TriFunction> - socketAddrCallback = - tracer - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.requestClientSocketAddress()); + socketAddrCallback = tracer + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.requestClientSocketAddress()); if (socketAddrCallback != null) { Integer port = eventData.sourcePort != null ? eventData.sourcePort : 0; socketAddrCallback.apply(requestContext, eventData.sourceIp, port); @@ -442,10 +439,9 @@ private static AgentSpanContext processAppSecRequestData( } // Call requestHeaderDone - Function> headerDoneCallback = - tracer - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.requestHeaderDone()); + Function> headerDoneCallback = tracer + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.requestHeaderDone()); if (headerDoneCallback != null) { headerDoneCallback.apply(requestContext); } else { @@ -454,10 +450,9 @@ private static AgentSpanContext processAppSecRequestData( // Call requestPathParams if (eventData.pathParameters != null && !eventData.pathParameters.isEmpty()) { - BiFunction, Flow> pathParamsCallback = - tracer - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.requestPathParams()); + BiFunction, Flow> pathParamsCallback = tracer + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.requestPathParams()); if (pathParamsCallback != null) { pathParamsCallback.apply(requestContext, eventData.pathParameters); } else { @@ -467,10 +462,9 @@ private static AgentSpanContext processAppSecRequestData( // Call requestBodyProcessed if (eventData.body != null) { - BiFunction> bodyCallback = - tracer - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.requestBodyProcessed()); + BiFunction> bodyCallback = tracer + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.requestBodyProcessed()); if (bodyCallback != null) { bodyCallback.apply(requestContext, eventData.body); } else { diff --git a/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaEventParser.java b/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaEventParser.java index 1848e78b620..2287e29eb52 100644 --- a/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaEventParser.java +++ b/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaEventParser.java @@ -529,7 +529,8 @@ private static Map extractHeaders(Object headersObj) { Map headers = extractHeaderMap(headersObj); log.debug("Extracted {} headers", headers.size()); if (headers.containsKey("cookie")) { - log.debug("Cookie header found with value length: {}", headers.get("cookie").length()); + log.debug( + "Cookie header found with value length: {}", headers.get("cookie").length()); } return headers; } @@ -772,17 +773,16 @@ static class LambdaRequestData { */ final String rawUri; - static final LambdaRequestData EMPTY = - new LambdaRequestData( - Collections.emptyMap(), - null, - null, - null, - null, - LambdaTriggerType.UNKNOWN, - Collections.emptyMap(), - Collections.emptyMap(), - null); + static final LambdaRequestData EMPTY = new LambdaRequestData( + Collections.emptyMap(), + null, + null, + null, + null, + LambdaTriggerType.UNKNOWN, + Collections.emptyMap(), + Collections.emptyMap(), + null); LambdaRequestData( Map headers, diff --git a/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaHandler.java b/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaHandler.java index 7e693ed82c8..35e846472a4 100644 --- a/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaHandler.java +++ b/dd-trace-core/src/main/java/datadog/trace/lambda/LambdaHandler.java @@ -52,47 +52,41 @@ public class LambdaHandler { private static final int MAX_IDLE_CONNECTIONS = 5; private static final Long KEEP_ALIVE_DURATION = 300L; - private static OkHttpClient HTTP_CLIENT = - new OkHttpClient.Builder() - .retryOnConnectionFailure(true) - .connectTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) - .writeTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) - .readTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) - .callTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) - .connectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION, SECONDS)) - .build(); + private static OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder() + .retryOnConnectionFailure(true) + .connectTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) + .writeTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) + .readTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) + .callTimeout(REQUEST_TIMEOUT_IN_S, SECONDS) + .connectionPool(new ConnectionPool(MAX_IDLE_CONNECTIONS, KEEP_ALIVE_DURATION, SECONDS)) + .build(); private static final MediaType jsonMediaType = MediaType.parse("application/json"); - private static final JsonAdapter adapter = - new Moshi.Builder() - .add(ByteArrayInputStream.class, new ReadFromInputStreamJsonAdapter()) - .add(ByteArrayOutputStream.class, new ReadFromOutputStreamJsonAdapter()) - .add(SkipUnsupportedTypeJsonAdapter.newFactory()) - .build() - .adapter(Object.class); + private static final JsonAdapter adapter = new Moshi.Builder() + .add(ByteArrayInputStream.class, new ReadFromInputStreamJsonAdapter()) + .add(ByteArrayOutputStream.class, new ReadFromOutputStreamJsonAdapter()) + .add(SkipUnsupportedTypeJsonAdapter.newFactory()) + .build() + .adapter(Object.class); private static String EXTENSION_BASE_URL = "http://127.0.0.1:8124"; public static AgentSpanContext notifyStartInvocation(Object event, String lambdaRequestId) { RequestBody body = RequestBody.create(jsonMediaType, writeValueAsString(event)); - try (Response response = - HTTP_CLIENT - .newCall( - new Request.Builder() - .url(EXTENSION_BASE_URL + START_INVOCATION) - .addHeader(DATADOG_META_LANG, "java") - .addHeader(LAMBDA_RUNTIME_AWS_REQUEST_ID, lambdaRequestId) - .post(body) - .build()) - .execute()) { + try (Response response = HTTP_CLIENT + .newCall(new Request.Builder() + .url(EXTENSION_BASE_URL + START_INVOCATION) + .addHeader(DATADOG_META_LANG, "java") + .addHeader(LAMBDA_RUNTIME_AWS_REQUEST_ID, lambdaRequestId) + .post(body) + .build()) + .execute()) { if (response.isSuccessful()) { - return extractContextAndGetSpanContext( - response.headers(), - (carrier, classifier) -> { - for (String headerName : carrier.names()) { - classifier.accept(headerName, carrier.get(headerName)); - } - }); + return extractContextAndGetSpanContext(response.headers(), (carrier, classifier) -> { + for (String headerName : carrier.names()) { + classifier.accept(headerName, carrier.get(headerName)); + } + }); } else { log.debug("Extension call failed with status: {}", response.code()); } @@ -111,24 +105,22 @@ public static boolean notifyEndInvocation( } RequestBody body = RequestBody.create(jsonMediaType, writeValueAsString(result)); - Request.Builder builder = - new Request.Builder() - .url(EXTENSION_BASE_URL + END_INVOCATION) - .addHeader(DATADOG_TRACE_ID, span.getTraceId().toString()) - .addHeader(DATADOG_SPAN_ID, DDSpanId.toString(span.getSpanId())) - .addHeader(DATADOG_SAMPLING_PRIORITY, span.getSamplingPriority().toString()) - .addHeader(DATADOG_META_LANG, "java") - .addHeader(LAMBDA_RUNTIME_AWS_REQUEST_ID, lambdaRequestId) - .post(body); + Request.Builder builder = new Request.Builder() + .url(EXTENSION_BASE_URL + END_INVOCATION) + .addHeader(DATADOG_TRACE_ID, span.getTraceId().toString()) + .addHeader(DATADOG_SPAN_ID, DDSpanId.toString(span.getSpanId())) + .addHeader(DATADOG_SAMPLING_PRIORITY, span.getSamplingPriority().toString()) + .addHeader(DATADOG_META_LANG, "java") + .addHeader(LAMBDA_RUNTIME_AWS_REQUEST_ID, lambdaRequestId) + .post(body); addHeaderIfValid(builder, DATADOG_INVOCATION_ERROR_MSG, span.getTag(DDTags.ERROR_MSG)); addHeaderIfValid(builder, DATADOG_INVOCATION_ERROR_TYPE, span.getTag(DDTags.ERROR_TYPE)); Object errorStack = span.getTag(DDTags.ERROR_STACK); if (errorStack != null) { - String encodedErrStack = - Base64.getEncoder() - .encodeToString(errorStack.toString().getBytes(StandardCharsets.UTF_8)); + String encodedErrStack = Base64.getEncoder() + .encodeToString(errorStack.toString().getBytes(StandardCharsets.UTF_8)); if (Strings.isNotBlank(encodedErrStack)) { builder.addHeader(DATADOG_INVOCATION_ERROR_STACK, encodedErrStack); } diff --git a/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapter.java b/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapter.java index fdaa17f542d..c6449d198ae 100644 --- a/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapter.java +++ b/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapter.java @@ -249,15 +249,13 @@ private static void applyIO( List documents = new ArrayList<>(messages.size()); for (int i = 0; i < messages.size(); i++) { LLMObs.LLMMessage message = messages.get(i); - Object originalDocument = - originalDocuments != null && i < originalDocuments.size() - ? originalDocuments.get(i) - : null; + Object originalDocument = originalDocuments != null && i < originalDocuments.size() + ? originalDocuments.get(i) + : null; if (originalDocument instanceof LLMObs.Document) { LLMObs.Document document = (LLMObs.Document) originalDocument; - documents.add( - LLMObs.Document.from( - message.getContent(), document.getName(), document.getId(), document.getScore())); + documents.add(LLMObs.Document.from( + message.getContent(), document.getName(), document.getId(), document.getScore())); } else { documents.add(LLMObs.Document.from(message.getContent())); } diff --git a/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapper.java b/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapper.java index 2b8a85992e1..1538116e7c8 100644 --- a/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapper.java +++ b/dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapper.java @@ -135,13 +135,11 @@ public class LLMObsSpanMapper implements RemoteMapper { * differently on the retry — a dropped span would lose its verdict and be re-emitted as retained. */ private static final Set TAGS_WRITTEN_AS_TOP_LEVEL_FIELDS = - Collections.unmodifiableSet( - new HashSet<>( - Arrays.asList( - PARENT_ID_TAG_INTERNAL_FULL, - SAMPLING_DECISION_TAG_INTERNAL_FULL, - SAMPLE_RATE_TAG_INTERNAL_FULL, - SPAN_KIND_TAG_KEY))); + Collections.unmodifiableSet(new HashSet<>(Arrays.asList( + PARENT_ID_TAG_INTERNAL_FULL, + SAMPLING_DECISION_TAG_INTERNAL_FULL, + SAMPLE_RATE_TAG_INTERNAL_FULL, + SPAN_KIND_TAG_KEY))); private static final String PAGENT_SPAN_ID_TAG_INTERNAL_FULL = LLMOBS_TAG_PREFIX + LLMObsTags.PAGENT_SPAN_ID; @@ -387,20 +385,18 @@ private static final class MetaWriter implements MetadataConsumer { private Map errorInfo; private static final Set TAGS_FOR_REMAPPING = - Collections.unmodifiableSet( - new HashSet<>( - Arrays.asList( - LLMOBS_TAG_PREFIX + INPUT, - LLMOBS_TAG_PREFIX + INPUT_PROMPT, - LLMOBS_TAG_PREFIX + OUTPUT, - LLMOBS_TAG_PREFIX + LLMObsTags.MODEL_NAME, - LLMOBS_TAG_PREFIX + LLMObsTags.MODEL_PROVIDER, - LLMOBS_TAG_PREFIX + LLMObsTags.MODEL_VERSION, - LLMOBS_TAG_PREFIX + LLMObsTags.TOOL_DEFINITIONS, - LLMOBS_TAG_PREFIX + LLMObsTags.METADATA, - LLMOBS_TAG_PREFIX + LLMObsTags.AGENT_MANIFEST, - PAGENT_SPAN_ID_TAG_INTERNAL_FULL, - PAGENT_NAME_TAG_INTERNAL_FULL))); + Collections.unmodifiableSet(new HashSet<>(Arrays.asList( + LLMOBS_TAG_PREFIX + INPUT, + LLMOBS_TAG_PREFIX + INPUT_PROMPT, + LLMOBS_TAG_PREFIX + OUTPUT, + LLMOBS_TAG_PREFIX + LLMObsTags.MODEL_NAME, + LLMOBS_TAG_PREFIX + LLMObsTags.MODEL_PROVIDER, + LLMOBS_TAG_PREFIX + LLMObsTags.MODEL_VERSION, + LLMOBS_TAG_PREFIX + LLMObsTags.TOOL_DEFINITIONS, + LLMOBS_TAG_PREFIX + LLMObsTags.METADATA, + LLMOBS_TAG_PREFIX + LLMObsTags.AGENT_MANIFEST, + PAGENT_SPAN_ID_TAG_INTERNAL_FULL, + PAGENT_NAME_TAG_INTERNAL_FULL))); MetaWriter withWritable(Writable writable, Map errorInfo) { this.writable = writable; @@ -490,14 +486,13 @@ public void accept(Metadata metadata) { // agent_attribution block is skipped; subtract 1 for that entry too. boolean hasInvalidParentAgentSpanId = tagsToRemapToMeta.containsKey(PAGENT_SPAN_ID_TAG_INTERNAL_FULL) && !hasAgentAttribution; - int metaSize = - tagsToRemapToMeta.size() - - (hasInputPrompt ? 1 : 0) - + (inputPrompt != null && !hasInput ? 1 : 0) - + 1 - + (null != errorInfo && !errorInfo.isEmpty() ? 1 : 0) - - (hasAgentAttributionName ? 1 : 0) - - (hasInvalidParentAgentSpanId ? 1 : 0); + int metaSize = tagsToRemapToMeta.size() + - (hasInputPrompt ? 1 : 0) + + (inputPrompt != null && !hasInput ? 1 : 0) + + 1 + + (null != errorInfo && !errorInfo.isEmpty() ? 1 : 0) + - (hasAgentAttributionName ? 1 : 0) + - (hasInvalidParentAgentSpanId ? 1 : 0); writable.writeUTF8(META); writable.startMap(metaSize); writable.writeUTF8(SPAN_KIND); @@ -820,12 +815,11 @@ public RequestBody toRequest() { if (traceCount() == 0) { buffers = Collections.singletonList(msgpackMapHeader(0)); } else { - buffers = - Arrays.asList( - header.slice(), - // Third Value: is an array of spans serialized into the body - msgpackArrayHeader(spansWritten), - body); + buffers = Arrays.asList( + header.slice(), + // Third Value: is an array of spans serialized into the body + msgpackArrayHeader(spansWritten), + body); } return gzippedMsgpackRequestBodyOf(buffers); } diff --git a/dd-trace-core/src/test/java/datadog/trace/TracerConnectionReliabilityTest.java b/dd-trace-core/src/test/java/datadog/trace/TracerConnectionReliabilityTest.java index cfda2f730c7..4f832f69012 100644 --- a/dd-trace-core/src/test/java/datadog/trace/TracerConnectionReliabilityTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/TracerConnectionReliabilityTest.java @@ -45,9 +45,8 @@ static void setupSpec() { client = new OkHttpClient(); // Create body parser for /test/traces route Moshi moshi = new Moshi.Builder().build(); - Type type = - Types.newParameterizedType( - List.class, Types.newParameterizedType(List.class, SentTraces.class)); + Type type = Types.newParameterizedType( + List.class, Types.newParameterizedType(List.class, SentTraces.class)); traceJsonAdapter = moshi.adapter(type); } @@ -65,12 +64,11 @@ void setup() { new FixedTraceEndpointFeaturesDiscovery(sharedCommunicationObjects); sharedCommunicationObjects.setFeaturesDiscovery(fixedFeaturesDiscovery); - tracer = - CoreTracer.builder() - .idGenerationStrategy(IdGenerationStrategy.fromName("SEQUENTIAL")) - .withProperties(properties) - .sharedCommunicationObjects(sharedCommunicationObjects) - .build(); + tracer = CoreTracer.builder() + .idGenerationStrategy(IdGenerationStrategy.fromName("SEQUENTIAL")) + .withProperties(properties) + .sharedCommunicationObjects(sharedCommunicationObjects) + .build(); } @AfterEach @@ -130,14 +128,12 @@ void testAgentRestart() throws Exception { GenericContainer startTestAgentContainer() { //noinspection GrDeprecatedAPIUsage Use FixedHostPortGenericContainer against deprecation // because we need to know the exposed to configure the tracer at start - GenericContainer agentContainer = - new FixedHostPortGenericContainer( - "registry.ddbuild.io/images/mirror/dd-apm-test-agent/ddapm-test-agent:v1.64.1") - .withFixedExposedPort(agentContainerPort, DEFAULT_TRACE_AGENT_PORT) - .withEnv( - "ENABLED_CHECKS", - "trace_count_header,meta_tracer_version_header,trace_content_length") - .waitingFor(Wait.forHttp("/test/traces")); + GenericContainer agentContainer = new FixedHostPortGenericContainer( + "registry.ddbuild.io/images/mirror/dd-apm-test-agent/ddapm-test-agent:v1.64.1") + .withFixedExposedPort(agentContainerPort, DEFAULT_TRACE_AGENT_PORT) + .withEnv( + "ENABLED_CHECKS", "trace_count_header,meta_tracer_version_header,trace_content_length") + .waitingFor(Wait.forHttp("/test/traces")); agentContainer.start(); return agentContainer; } @@ -156,10 +152,9 @@ static void waitForDiscoveryTimeout() throws InterruptedException { } int getTraceCount(GenericContainer agentContainer) throws IOException { - Request request = - new Request.Builder() - .url("http://" + agentContainer.getHost() + ":" + agentContainerPort + "/test/traces") - .build(); + Request request = new Request.Builder() + .url("http://" + agentContainer.getHost() + ":" + agentContainerPort + "/test/traces") + .build(); String body = client.newCall(request).execute().body().string(); return traceJsonAdapter.fromJson(body).size(); } diff --git a/dd-trace-core/src/test/java/datadog/trace/api/writer/PrintingWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/api/writer/PrintingWriterTest.java index 8289bfe35a0..c1ff4aa0615 100644 --- a/dd-trace-core/src/test/java/datadog/trace/api/writer/PrintingWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/api/writer/PrintingWriterTest.java @@ -33,22 +33,19 @@ public class PrintingWriterTest extends DDCoreJavaSpecification { @BeforeEach void setup() { tracer = tracerBuilder().writer(new ListWriter()).build(); - adapter = - new Moshi.Builder() - .build() - .adapter( - Types.newParameterizedType( - Map.class, - String.class, - Types.newParameterizedType( - List.class, Types.newParameterizedType(List.class, Map.class)))); - - AgentTracer.SpanBuilder builder = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .withSpanType("fakeType"); + adapter = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType( + Map.class, + String.class, + Types.newParameterizedType( + List.class, Types.newParameterizedType(List.class, Map.class)))); + + AgentTracer.SpanBuilder builder = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanType("fakeType"); sampleTrace = Arrays.asList((DDSpan) builder.start(), (DDSpan) builder.start()); secondTrace = Collections.singletonList((DDSpan) builder.start()); diff --git a/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptorTest.java b/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptorTest.java index 1ffc71e7ed3..77b727972e5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptorTest.java @@ -66,8 +66,8 @@ void testSessionTestModuleAndTestSuiteIdsAreNullified() throws InterruptedException, TimeoutException { tracer.addTraceInterceptor(CiVisibilityApmProtocolInterceptor.INSTANCE); - DDSpan testSpan = - (DDSpan) tracer.buildSpan("datadog", "test").withSpanType(DDSpanTypes.TEST).start(); + DDSpan testSpan = (DDSpan) + tracer.buildSpan("datadog", "test").withSpanType(DDSpanTypes.TEST).start(); testSpan.setTag(Tags.TEST_SESSION_ID, "session ID"); testSpan.setTag(Tags.TEST_MODULE_ID, "module ID"); testSpan.setTag(Tags.TEST_SUITE_ID, "suite ID"); diff --git a/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityTraceInterceptorTest.java b/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityTraceInterceptorTest.java index dcc81fe9908..ae353ae43ae 100644 --- a/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityTraceInterceptorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/civisibility/interceptor/CiVisibilityTraceInterceptorTest.java @@ -70,8 +70,8 @@ void addTracerVersionToSpansOfType(@ConvertWith(DDSpanTypesConverter.class) Stri throws InterruptedException, TimeoutException { tracer.addTraceInterceptor(CiVisibilityTraceInterceptor.INSTANCE); - DDSpan span = - (DDSpan) tracer.buildSpan("datadog", "sample-span").withSpanType(spanType).start(); + DDSpan span = (DDSpan) + tracer.buildSpan("datadog", "sample-span").withSpanType(spanType).start(); span.spanContext().setOrigin(CIConstants.CIAPP_TEST_ORIGIN); span.finish(); writer.waitForTraces(1); diff --git a/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2Test.java b/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2Test.java index b6c42fc9388..da207ef53b9 100644 --- a/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2Test.java +++ b/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2Test.java @@ -38,14 +38,11 @@ public class CiTestCovMapperV2Test extends DDCoreJavaSpecification { @Test void testWritesMessage() throws Exception { - List trace = - givenTrace( - new TestReport( - DDTraceId.from(1), - 2L, - 3L, - Arrays.asList( - new TestReportFileEntry("source", BitSet.valueOf(new long[] {3, 5, 8}))))); + List trace = givenTrace(new TestReport( + DDTraceId.from(1), + 2L, + 3L, + Arrays.asList(new TestReportFileEntry("source", BitSet.valueOf(new long[] {3, 5, 8}))))); Map message = getMappedMessage(trace); @@ -63,15 +60,13 @@ void testWritesMessage() throws Exception { @Test void testWritesMessageWithMultipleFilesAndMultipleLines() throws Exception { - List trace = - givenTrace( - new TestReport( - DDTraceId.from(1), - 2L, - 3L, - Arrays.asList( - new TestReportFileEntry("sourceA", BitSet.valueOf(new long[] {3, 5, 8})), - new TestReportFileEntry("sourceB", BitSet.valueOf(new long[] {1, 255, 7}))))); + List trace = givenTrace(new TestReport( + DDTraceId.from(1), + 2L, + 3L, + Arrays.asList( + new TestReportFileEntry("sourceA", BitSet.valueOf(new long[] {3, 5, 8})), + new TestReportFileEntry("sourceB", BitSet.valueOf(new long[] {1, 255, 7}))))); Map message = getMappedMessage(trace); @@ -91,20 +86,19 @@ void testWritesMessageWithMultipleFilesAndMultipleLines() throws Exception { @Test void testWritesMessageWithMultipleReports() throws Exception { - List trace = - givenTrace( - new TestReport( - DDTraceId.from(1), - 2L, - 3L, - Arrays.asList( - new TestReportFileEntry("sourceA", BitSet.valueOf(new long[] {2, 17, 41})))), - new TestReport( - DDTraceId.from(1), - 2L, - 4L, - Arrays.asList( - new TestReportFileEntry("sourceB", BitSet.valueOf(new long[] {11, 13, 55}))))); + List trace = givenTrace( + new TestReport( + DDTraceId.from(1), + 2L, + 3L, + Arrays.asList( + new TestReportFileEntry("sourceA", BitSet.valueOf(new long[] {2, 17, 41})))), + new TestReport( + DDTraceId.from(1), + 2L, + 4L, + Arrays.asList( + new TestReportFileEntry("sourceB", BitSet.valueOf(new long[] {11, 13, 55}))))); Map message = getMappedMessage(trace); @@ -123,23 +117,21 @@ void testWritesMessageWithMultipleReports() throws Exception { List> files1 = (List>) coverage1.get("files"); assertEquals(1, files1.size()); assertFile( - files1.get(0), - "sourceB", - new byte[] {11, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 55}); + files1.get(0), "sourceB", new byte[] {11, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 55 + }); } @Test void skipsSpansThatHaveNoReports() throws Exception { - List trace = - givenTrace( - null, - new TestReport( - DDTraceId.from(1), - 2L, - 3L, - Arrays.asList( - new TestReportFileEntry("source", BitSet.valueOf(new long[] {83, 25, 48})))), - null); + List trace = givenTrace( + null, + new TestReport( + DDTraceId.from(1), + 2L, + 3L, + Arrays.asList( + new TestReportFileEntry("source", BitSet.valueOf(new long[] {83, 25, 48})))), + null); Map message = getMappedMessage(trace); @@ -157,15 +149,14 @@ void skipsSpansThatHaveNoReports() throws Exception { @Test void skipsEmptyReports() throws Exception { - List trace = - givenTrace( - new TestReport( - DDTraceId.from(1), - 2L, - 3L, - Arrays.asList( - new TestReportFileEntry("source", BitSet.valueOf(new long[] {33, 53, 87})))), - new TestReport(DDTraceId.from(1), 2L, 4L, Collections.emptyList())); + List trace = givenTrace( + new TestReport( + DDTraceId.from(1), + 2L, + 3L, + Arrays.asList( + new TestReportFileEntry("source", BitSet.valueOf(new long[] {33, 53, 87})))), + new TestReport(DDTraceId.from(1), 2L, 4L, Collections.emptyList())); Map message = getMappedMessage(trace); @@ -184,29 +175,26 @@ void skipsEmptyReports() throws Exception { @Test void skipsDuplicateReports() throws Exception { List trace = new ArrayList<>(); - TestReport report = - new TestReport( - DDTraceId.from(1), - 2L, - 3L, - Arrays.asList(new TestReportFileEntry("source", BitSet.valueOf(new long[] {3, 5, 8})))); - - trace.add( - buildSpan( - 0, - InternalSpanTypes.TEST, - PropagationTags.factory().empty(), - Collections.emptyMap(), - PrioritySampling.SAMPLER_KEEP, - new DummyTestContext(new DummyReportHolder(report)))); - trace.add( - buildSpan( - 0, - "testChild", - PropagationTags.factory().empty(), - Collections.emptyMap(), - PrioritySampling.SAMPLER_KEEP, - new DummyTestContext(new DummyReportHolder(report)))); + TestReport report = new TestReport( + DDTraceId.from(1), + 2L, + 3L, + Arrays.asList(new TestReportFileEntry("source", BitSet.valueOf(new long[] {3, 5, 8})))); + + trace.add(buildSpan( + 0, + InternalSpanTypes.TEST, + PropagationTags.factory().empty(), + Collections.emptyMap(), + PrioritySampling.SAMPLER_KEEP, + new DummyTestContext(new DummyReportHolder(report)))); + trace.add(buildSpan( + 0, + "testChild", + PropagationTags.factory().empty(), + Collections.emptyMap(), + PrioritySampling.SAMPLER_KEEP, + new DummyTestContext(new DummyReportHolder(report)))); Map message = getMappedMessage(trace); @@ -226,14 +214,13 @@ private List givenTrace(TestReport... testReports) { List trace = new ArrayList<>(); for (TestReport testReport : testReports) { DummyReportHolder testReportHolder = new DummyReportHolder(testReport); - trace.add( - buildSpan( - 0, - InternalSpanTypes.TEST, - PropagationTags.factory().empty(), - Collections.emptyMap(), - PrioritySampling.SAMPLER_KEEP, - new DummyTestContext(testReportHolder))); + trace.add(buildSpan( + 0, + InternalSpanTypes.TEST, + PropagationTags.factory().empty(), + Collections.emptyMap(), + PrioritySampling.SAMPLER_KEEP, + new DummyTestContext(testReportHolder))); } return trace; } diff --git a/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.java b/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.java index e59f758056e..415cdba7804 100644 --- a/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.java @@ -74,18 +74,17 @@ public class CiTestCycleMapperV1PayloadTest extends DDJavaSpecification { "100k buffer, 1000 traces, high cardinality | 102400 | 1000 | false " }) void testTracesWrittenCorrectly(int bufferSize, int traceCount, boolean lowCardinality) { - CiVisibilityWellKnownTags wellKnownTags = - new CiVisibilityWellKnownTags( - "runtimeid", - "my-env", - "language", - "my-runtime-name", - "my-runtime-version", - "my-runtime-vendor", - "my-os-arch", - "my-os-platform", - "my-os-version", - "false"); + CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( + "runtimeid", + "my-env", + "language", + "my-runtime-name", + "my-runtime-version", + "my-runtime-vendor", + "my-os-arch", + "my-os-platform", + "my-os-version", + "false"); CiTestCycleMapperV1 mapper = new CiTestCycleMapperV1(wellKnownTags, false); List> traces = generateRandomTraces(traceCount, lowCardinality); @@ -157,15 +156,13 @@ void truncatesMetaStringValuesAndPreservesMetricsAndTopLevelIds() { @Test void truncatesPayloadMetadataValues() { String longValue = repeat("m", MAX_META_STRING_VALUE_LENGTH + 1); - CiVisibilityWellKnownTags wellKnownTags = - new CiVisibilityWellKnownTags( - longValue, longValue, longValue, longValue, longValue, longValue, longValue, longValue, - longValue, longValue); + CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( + longValue, longValue, longValue, longValue, longValue, longValue, longValue, longValue, + longValue, longValue); CiTestCycleMapperV1 mapper = new CiTestCycleMapperV1(wellKnownTags, false); List> traces = - Collections.singletonList( - Collections.singletonList( - generateRandomSpan(InternalSpanTypes.TEST, Collections.emptyMap()))); + Collections.singletonList(Collections.singletonList( + generateRandomSpan(InternalSpanTypes.TEST, Collections.emptyMap()))); PayloadVerifier verifier = new PayloadVerifier(wellKnownTags, traces, mapper); MsgPackWriter packer = new MsgPackWriter(new FlushingBuffer(100 << 10, verifier)); @@ -287,18 +284,17 @@ private static void verifyTopLevelTags( private static Map whenASpanIsWritten(TraceGenerator.PojoSpan span) { List trace = Collections.singletonList(span); - CiVisibilityWellKnownTags wellKnownTags = - new CiVisibilityWellKnownTags( - "runtimeid", - "my-env", - "language", - "my-runtime-name", - "my-runtime-version", - "my-runtime-vendor", - "my-os-arch", - "my-os-platform", - "my-os-version", - "false"); + CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( + "runtimeid", + "my-env", + "language", + "my-runtime-name", + "my-runtime-version", + "my-runtime-vendor", + "my-os-arch", + "my-os-platform", + "my-os-version", + "false"); CiTestCycleMapperV1 mapper = new CiTestCycleMapperV1(wellKnownTags, false); CaptureConsumer consumer = new CaptureConsumer(); @@ -505,9 +501,8 @@ public void accept(int messageCount, ByteBuffer buffer) { fail("Unexpected type in metrics values: " + format); } if (DD_MEASURED.toString().equals(key)) { - assertTrue( - (n != null && n.intValue() == 1 && expectedSpan.isMeasured()) - || !expectedSpan.isMeasured()); + assertTrue((n != null && n.intValue() == 1 && expectedSpan.isMeasured()) + || !expectedSpan.isMeasured()); } else if (DDSpanContext.PRIORITY_SAMPLING_KEY.equals(key)) { // check that priority sampling is only on first and last span if (k == 0 || k == eventCount - 1) { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/AdditionalTagsSchemaTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/AdditionalTagsSchemaTest.java index 65ebf357055..ec99a4de8f2 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/AdditionalTagsSchemaTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/AdditionalTagsSchemaTest.java @@ -44,9 +44,8 @@ void schemaSortsAndCapsAtMaxTagKeys() { @Test void rejectsEmptyAndColonContainingKeys() { - AdditionalTagsSchema schema = - AdditionalTagsSchema.from( - new LinkedHashSet<>(Arrays.asList("region", "", "bad:key", "tenant_id"))); + AdditionalTagsSchema schema = AdditionalTagsSchema.from( + new LinkedHashSet<>(Arrays.asList("region", "", "bad:key", "tenant_id"))); // Empty key and "bad:key" are dropped; only the two valid keys remain. assertArrayEquals(new String[] {"region", "tenant_id"}, schema.names); } @@ -69,20 +68,21 @@ void emptySchemaHasZeroSize() { void perKeyCardinalityBudgetsAreIndependent() { // Two configured keys, cardinality limit 1 each. Exhausting one key's budget must neither // consume nor block the other's -- each key gets its own TagCardinalityHandler. - AdditionalTagsSchema schema = - AdditionalTagsSchema.from( - new LinkedHashSet<>(Arrays.asList("region", "tenant_id")), 1, true); + AdditionalTagsSchema schema = AdditionalTagsSchema.from( + new LinkedHashSet<>(Arrays.asList("region", "tenant_id")), 1, true); int region = indexOf(schema, "region"); int tenant = indexOf(schema, "tenant_id"); // region: first value fits, second collapses to the blocked sentinel. assertEquals("region:us-east-1", schema.register(region, "us-east-1").toString()); - assertEquals("region:tracer_blocked_value", schema.register(region, "eu-west-1").toString()); + assertEquals( + "region:tracer_blocked_value", schema.register(region, "eu-west-1").toString()); // tenant_id is untouched by region's exhaustion: its first value still flows through, and its // own budget collapses only its own second value. assertEquals("tenant_id:acme-corp", schema.register(tenant, "acme-corp").toString()); - assertEquals("tenant_id:tracer_blocked_value", schema.register(tenant, "globex").toString()); + assertEquals( + "tenant_id:tracer_blocked_value", schema.register(tenant, "globex").toString()); } @Test @@ -137,9 +137,8 @@ private static long drainTelemetryDelta(String reason) { void resetHandlersAggregatesCardinalityCollapseAcrossKeysUnderOneFieldTag() { // Two keys each collapse: the field-level health metric sums both under a single // "collapsed:additional_metric_tags" tag rather than emitting per key name. - AdditionalTagsSchema schema = - AdditionalTagsSchema.from( - new LinkedHashSet<>(Arrays.asList("region", "tenant_id")), 1, true); + AdditionalTagsSchema schema = AdditionalTagsSchema.from( + new LinkedHashSet<>(Arrays.asList("region", "tenant_id")), 1, true); int region = indexOf(schema, "region"); int tenant = indexOf(schema, "tenant_id"); schema.register(region, "us-east-1"); // within budget diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTest.java index f2fc1d5710d..f80c8897559 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTest.java @@ -98,21 +98,20 @@ void absentOptionalFieldsResolveToEmptySentinel() { @Test void presentOptionalFieldsCarryTheirValue() { - AggregateEntry entry = - AggregateEntryTestUtils.of( - "resource", - "svc", - "op", - "src", - "type", - 200, - false, - true, - "client", - null, - "GET", - "/api/v1/foo", - "0"); + AggregateEntry entry = AggregateEntryTestUtils.of( + "resource", + "svc", + "op", + "src", + "type", + 200, + false, + true, + "client", + null, + "GET", + "/api/v1/foo", + "0"); assertNotSame(EMPTY, entry.getServiceSource()); assertNotSame(EMPTY, entry.getHttpMethod()); assertNotSame(EMPTY, entry.getHttpEndpoint()); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTestUtils.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTestUtils.java index 221d23909d8..f08dd6d2943 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTestUtils.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/AggregateEntryTestUtils.java @@ -96,24 +96,23 @@ public static AggregateEntry of( UTF8BytesString[] peerTagsArr = peerTagsList.toArray(new UTF8BytesString[0]); UTF8BytesString[] additionalTagsArr = additionalTags == null ? new UTF8BytesString[0] : additionalTags; - long keyHash = - AggregateEntry.hashOf( - resourceUtf, - serviceUtf, - operationNameUtf, - serviceSourceUtf, - typeUtf, - spanKindUtf, - httpMethodUtf, - httpEndpointUtf, - grpcUtf, - (short) httpStatusCode, - synthetic, - traceRoot, - peerTagsArr, - peerTagsArr.length, - additionalTagsArr, - additionalTagsArr.length); + long keyHash = AggregateEntry.hashOf( + resourceUtf, + serviceUtf, + operationNameUtf, + serviceSourceUtf, + typeUtf, + spanKindUtf, + httpMethodUtf, + httpEndpointUtf, + grpcUtf, + (short) httpStatusCode, + synthetic, + traceRoot, + peerTagsArr, + peerTagsArr.length, + additionalTagsArr, + additionalTagsArr.length); return new AggregateEntry( keyHash, resourceUtf, diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorBootstrapTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorBootstrapTest.java index 758f5db9910..1bf8f37d6a1 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorBootstrapTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorBootstrapTest.java @@ -54,18 +54,17 @@ void bootstrapHappensOnceOnFirstPublish() { when(features.peerTags()).thenReturn(Collections.singleton("peer.hostname")); when(features.state()).thenReturn("state-1"); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - healthMetrics, - sink, - writer, - /* maxAggregates */ 16, - /* queueSize */ 64, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + healthMetrics, + sink, + writer, + /* maxAggregates */ 16, + /* queueSize */ 64, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); // Do not start the aggregator thread -- reconcile must not run, only bootstrap. aggregator.publish(Collections.>singletonList(peerAggregationSpan())); @@ -91,34 +90,31 @@ void reconcileSkipsDeepCompareWhenStateMatches() throws Exception { when(features.peerTags()).thenReturn(Collections.singleton("peer.hostname")); when(features.state()).thenReturn("state-1"); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - healthMetrics, - sink, - writer, - /* maxAggregates */ 16, - /* queueSize */ 64, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + healthMetrics, + sink, + writer, + /* maxAggregates */ 16, + /* queueSize */ 64, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); aggregator.start(); try { CountDownLatch cycle1 = new CountDownLatch(1); CountDownLatch cycle2 = new CountDownLatch(1); // Both reports flush a bucket; the cycle1/cycle2 countdowns synchronize the test thread // with the aggregator thread's per-cycle completion. - org.mockito.Mockito.doAnswer( - invocation -> { - cycle1.countDown(); - return null; - }) - .doAnswer( - invocation -> { - cycle2.countDown(); - return null; - }) + org.mockito.Mockito.doAnswer(invocation -> { + cycle1.countDown(); + return null; + }) + .doAnswer(invocation -> { + cycle2.countDown(); + return null; + }) .when(writer) .finishBucket(); @@ -160,32 +156,29 @@ void reconcileSurvivesStateChangeWhenTagsUnchanged() throws Exception { // State hash changes every reconcile -- forces reconcile into the slow path each time. when(features.state()).thenReturn("state-1", "state-2", "state-3"); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - healthMetrics, - sink, - writer, - /* maxAggregates */ 16, - /* queueSize */ 64, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + healthMetrics, + sink, + writer, + /* maxAggregates */ 16, + /* queueSize */ 64, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); aggregator.start(); try { CountDownLatch cycle1 = new CountDownLatch(1); CountDownLatch cycle2 = new CountDownLatch(1); - org.mockito.Mockito.doAnswer( - invocation -> { - cycle1.countDown(); - return null; - }) - .doAnswer( - invocation -> { - cycle2.countDown(); - return null; - }) + org.mockito.Mockito.doAnswer(invocation -> { + cycle1.countDown(); + return null; + }) + .doAnswer(invocation -> { + cycle2.countDown(); + return null; + }) .when(writer) .finishBucket(); @@ -233,32 +226,29 @@ void reconcileSwapsSchemaWhenTagSetChanges() throws Exception { // (mismatch -> slow path), stable at "state-2" for cycle 2's reconcile (match -> fast path). when(features.state()).thenReturn("state-1", "state-2", "state-2"); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - healthMetrics, - sink, - writer, - /* maxAggregates */ 16, - /* queueSize */ 64, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + healthMetrics, + sink, + writer, + /* maxAggregates */ 16, + /* queueSize */ 64, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); aggregator.start(); try { CountDownLatch cycle1 = new CountDownLatch(1); CountDownLatch cycle2 = new CountDownLatch(1); - org.mockito.Mockito.doAnswer( - invocation -> { - cycle1.countDown(); - return null; - }) - .doAnswer( - invocation -> { - cycle2.countDown(); - return null; - }) + org.mockito.Mockito.doAnswer(invocation -> { + cycle1.countDown(); + return null; + }) + .doAnswer(invocation -> { + cycle2.countDown(); + return null; + }) .when(writer) .finishBucket(); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorDisableTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorDisableTest.java index 3239cca4e90..8211f1d14d2 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorDisableTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorDisableTest.java @@ -55,29 +55,27 @@ void downgradeRoutesClearThroughInboxBeforeNextReport() throws Exception { when(features.peerTags()).thenReturn(Collections.emptySet()); when(features.state()).thenReturn("state-1"); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - healthMetrics, - sink, - writer, - /* maxAggregates */ 16, - /* queueSize */ 64, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + healthMetrics, + sink, + writer, + /* maxAggregates */ 16, + /* queueSize */ 64, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); aggregator.start(); try { // Baseline: publish a span, run a report, verify the table flushes normally. This gives // us a clean post-first-report state with the aggregator's reconcile already having fired // once on the aggregator thread. CountDownLatch firstFlush = new CountDownLatch(1); - org.mockito.Mockito.doAnswer( - invocation -> { - firstFlush.countDown(); - return null; - }) + org.mockito.Mockito.doAnswer(invocation -> { + firstFlush.countDown(); + return null; + }) .when(writer) .finishBucket(); @@ -111,11 +109,10 @@ void downgradeRoutesClearThroughInboxBeforeNextReport() throws Exception { // bucket chains), this assertion would catch it. when(features.supportsMetrics()).thenReturn(true); CountDownLatch postClearFlush = new CountDownLatch(1); - org.mockito.Mockito.doAnswer( - invocation -> { - postClearFlush.countDown(); - return null; - }) + org.mockito.Mockito.doAnswer(invocation -> { + postClearFlush.countDown(); + return null; + }) .when(writer) .finishBucket(); aggregator.publish(Collections.>singletonList(markerSpan())); @@ -145,18 +142,17 @@ void clearDoesNotTrampleQueuedStopSignal() throws Exception { when(features.peerTags()).thenReturn(Collections.emptySet()); when(features.state()).thenReturn("state-1"); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - healthMetrics, - sink, - writer, - /* maxAggregates */ 16, - /* queueSize */ 64, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + healthMetrics, + sink, + writer, + /* maxAggregates */ 16, + /* queueSize */ 64, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); aggregator.start(); // Force at least one snapshot into the inbox so the aggregator has something to drain. diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorInboxFullTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorInboxFullTest.java index 3683bef7f42..49d42ac9279 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorInboxFullTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorInboxFullTest.java @@ -36,18 +36,17 @@ void publishFiresOnStatsInboxFullOnceInboxIsAtCapacity() { // never drains -- snapshots accumulate in the inbox until capacity, then the next publish hits // the size-vs-capacity fast path. int queueSize = 8; - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - healthMetrics, - sink, - writer, - /* maxAggregates */ 16, - queueSize, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + healthMetrics, + sink, + writer, + /* maxAggregates */ 16, + queueSize, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); // Publish well past capacity. The first `queueSize` calls land in the inbox; subsequent calls // see size >= capacity and hit the fast path. diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorOtlpExportTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorOtlpExportTest.java index b8d56bde658..901e0e98362 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorOtlpExportTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorOtlpExportTest.java @@ -33,18 +33,17 @@ void grpcStatusExtractedFromGrpcTypedSpanOnOtlpPath() throws Exception { when(features.peerTags()).thenReturn(Collections.emptySet()); Sink sink = mock(Sink.class); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - Collections.emptySet(), - features, - HealthMetrics.NO_OP, - sink, - writer, - /* maxAggregates */ 16, - /* queueSize */ 16, - /* reportingInterval */ 10, - SECONDS, - /* includeEndpointInMetrics */ false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + Collections.emptySet(), + features, + HealthMetrics.NO_OP, + sink, + writer, + /* maxAggregates */ 16, + /* queueSize */ 16, + /* reportingInterval */ 10, + SECONDS, + /* includeEndpointInMetrics */ false); aggregator.start(); try { // A span typed "grpc" (not "rpc") carrying grpc.status.code -- a key + type combo the native diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorTest.java index 7269bbbf580..46108c31f81 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/ClientStatsAggregatorTest.java @@ -63,19 +63,18 @@ void shouldIgnoreTracesWithNoMeasuredSpans() throws Exception { when(features.supportsMetrics()).thenReturn(true); WellKnownTags wellKnownTags = new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"); - try (ClientStatsAggregator aggregator = - new ClientStatsAggregator( - wellKnownTags, - emptySet(), - AdditionalTagsSchema.EMPTY, - features, - HealthMetrics.NO_OP, - sink, - 10, - QUEUE_SIZE, - 1, - MILLISECONDS, - false)) { + try (ClientStatsAggregator aggregator = new ClientStatsAggregator( + wellKnownTags, + emptySet(), + AdditionalTagsSchema.EMPTY, + features, + HealthMetrics.NO_OP, + sink, + 10, + QUEUE_SIZE, + 1, + MILLISECONDS, + false)) { aggregator.start(); aggregator.publish( @@ -98,53 +97,48 @@ void shouldIgnoreTracesWithIgnoredResourceNames() throws Exception { WellKnownTags wellKnownTags = new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"); Set ignoredResources = Collections.singleton(ignoredResourceName); - try (ClientStatsAggregator aggregator = - new ClientStatsAggregator( - wellKnownTags, - ignoredResources, - AdditionalTagsSchema.EMPTY, - features, - HealthMetrics.NO_OP, - sink, - 10, - QUEUE_SIZE, - 1, - MILLISECONDS, - false)) { + try (ClientStatsAggregator aggregator = new ClientStatsAggregator( + wellKnownTags, + ignoredResources, + AdditionalTagsSchema.EMPTY, + features, + HealthMetrics.NO_OP, + sink, + 10, + QUEUE_SIZE, + 1, + MILLISECONDS, + false)) { aggregator.start(); clearInvocations(sink); // publish ignored resource names - aggregator.publish( - singletonList( - new SimpleSpan("", "", ignoredResourceName, "", true, true, false, 0, 0, HTTP_OK))); - aggregator.publish( - singletonList( - new SimpleSpan( - "", - "", - UTF8BytesString.create(ignoredResourceName), - "", - true, - true, - false, - 0, - 0, - HTTP_OK))); - aggregator.publish( - Arrays.asList( - new SimpleSpan("", "", ignoredResourceName, "", true, true, false, 0, 0, HTTP_OK), - new SimpleSpan( - "", - "", - "measured, not ignored, but child of ignored, so should be ignored", - "", - true, - true, - false, - 0, - 0, - HTTP_OK))); + aggregator.publish(singletonList( + new SimpleSpan("", "", ignoredResourceName, "", true, true, false, 0, 0, HTTP_OK))); + aggregator.publish(singletonList(new SimpleSpan( + "", + "", + UTF8BytesString.create(ignoredResourceName), + "", + true, + true, + false, + 0, + 0, + HTTP_OK))); + aggregator.publish(Arrays.asList( + new SimpleSpan("", "", ignoredResourceName, "", true, true, false, 0, 0, HTTP_OK), + new SimpleSpan( + "", + "", + "measured, not ignored, but child of ignored, so should be ignored", + "", + true, + true, + false, + 0, + 0, + HTTP_OK))); aggregator.forceReport().get(2, SECONDS); verifyNoInteractions(sink); @@ -163,45 +157,40 @@ void shouldBeResilientToNullResourceNames() throws Exception { aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedEntry = - AggregateEntryTestUtils.of( - null, - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); - assertEquals(1, e.getHitCount()); - assertEquals(1, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - return null; - }) + AggregateEntry expectedEntry = AggregateEntryTestUtils.of( + null, + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); + assertEquals(1, e.getHitCount()); + assertEquals(1, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - singletonList( - new SimpleSpan( - "service", "operation", null, "type", false, true, false, 0, 100, HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList( + new SimpleSpan("service", "operation", null, "type", false, true, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -224,54 +213,40 @@ void unmeasuredTopLevelSpansHaveMetricsComputed() throws Exception { aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedEntry = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); - assertEquals(1, e.getHitCount()); - assertEquals(1, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - return null; - }) + AggregateEntry expectedEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); + assertEquals(1, e.getHitCount()); + assertEquals(1, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - singletonList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - false, - true, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -312,45 +287,41 @@ void shouldComputeStatsForSpanKind( CountDownLatch latch = new CountDownLatch(1); if (statsComputed) { - AggregateEntry expectedEntry = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - kind == null ? null : kind.toString(), - emptyList(), - httpMethod, - httpEndpoint, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); - assertEquals(1, e.getHitCount()); - assertEquals(0, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - return null; - }) + AggregateEntry expectedEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + kind == null ? null : kind.toString(), + emptyList(), + httpMethod, + httpEndpoint, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); + assertEquals(1, e.getHitCount()); + assertEquals(0, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); } - SimpleSpan span = - new SimpleSpan( - "service", "operation", "resource", "type", false, false, false, 0, 100, HTTP_OK) - .setTag(Tags.SPAN_KIND, kind); + SimpleSpan span = new SimpleSpan( + "service", "operation", "resource", "type", false, false, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, kind); if (httpMethod != null) { span.setTag("http.method", httpMethod); } @@ -404,93 +375,69 @@ void shouldCreateSeparateBucketsForDistinctPeerTagValues() throws Exception { CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedFranceEntry = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "client", - Arrays.asList( - UTF8BytesString.create("country:france"), - UTF8BytesString.create("georegion:europe")), - null, - null, - null); - AggregateEntry expectedGermanyEntry = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "client", - Arrays.asList( - UTF8BytesString.create("country:germany"), - UTF8BytesString.create("georegion:europe")), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - if (AggregateEntryTestUtils.equals(e, expectedFranceEntry) - || AggregateEntryTestUtils.equals(e, expectedGermanyEntry)) { - assertEquals(1, e.getHitCount()); - assertEquals(0, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - } else { - throw new AssertionError("Unexpected AggregateEntry in add(): " + e); - } - return null; - }) + AggregateEntry expectedFranceEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "client", + Arrays.asList( + UTF8BytesString.create("country:france"), UTF8BytesString.create("georegion:europe")), + null, + null, + null); + AggregateEntry expectedGermanyEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "client", + Arrays.asList( + UTF8BytesString.create("country:germany"), + UTF8BytesString.create("georegion:europe")), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + if (AggregateEntryTestUtils.equals(e, expectedFranceEntry) + || AggregateEntryTestUtils.equals(e, expectedGermanyEntry)) { + assertEquals(1, e.getHitCount()); + assertEquals(0, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + } else { + throw new AssertionError("Unexpected AggregateEntry in add(): " + e); + } + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - Arrays.asList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "client") - .setTag("country", "france") - .setTag("georegion", "europe"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "client") - .setTag("country", "germany") - .setTag("georegion", "europe"))); + aggregator.publish(Arrays.asList( + new SimpleSpan( + "service", "operation", "resource", "type", true, false, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "client") + .setTag("country", "france") + .setTag("georegion", "europe"), + new SimpleSpan( + "service", "operation", "resource", "type", true, false, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "client") + .setTag("country", "germany") + .setTag("georegion", "europe"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -529,56 +476,42 @@ void shouldAggregateTheRightPeerTagsForKind( aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedEntry = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - kind, - expectedPeerTags, - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); - assertEquals(1, e.getHitCount()); - assertEquals(0, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - return null; - }) + AggregateEntry expectedEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + kind, + expectedPeerTags, + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); + assertEquals(1, e.getHitCount()); + assertEquals(0, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - singletonList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, kind) - .setTag("peer.hostname", "localhost") - .setTag("_dd.base_service", UTF8BytesString.create("test")))); + aggregator.publish(singletonList(new SimpleSpan( + "service", "operation", "resource", "type", true, false, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, kind) + .setTag("peer.hostname", "localhost") + .setTag("_dd.base_service", UTF8BytesString.create("test")))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -607,54 +540,49 @@ void measuredSpansDoNotContributeToTopLevelCount( aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedEntry = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); - assertEquals(1, e.getHitCount()); - assertEquals(topLevelCount, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - return null; - }) + AggregateEntry expectedEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); + assertEquals(1, e.getHitCount()); + assertEquals(topLevelCount, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - singletonList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - measured, - topLevel, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service", + "operation", + "resource", + "type", + measured, + topLevel, + false, + 0, + 100, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -679,98 +607,84 @@ void aggregateRepetitiveSpans(int count) throws Exception { try (ClientStatsAggregator aggregator = createClientStatsAggregator(features, sink, writer, false)) { long duration = 100; - List trace = - Arrays.asList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"), - new SimpleSpan( - "service1", - "operation1", - "resource1", - "type", - false, - false, - false, - 0, - 0, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"), - new SimpleSpan( - "service2", - "operation2", - "resource2", - "type", - true, - false, - false, - 0, - duration * 2, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz")); + List trace = Arrays.asList( + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"), + new SimpleSpan( + "service1", "operation1", "resource1", "type", false, false, false, 0, 0, HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"), + new SimpleSpan( + "service2", + "operation2", + "resource2", + "type", + true, + false, + false, + 0, + duration * 2, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz")); aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedEntry1 = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); - AggregateEntry expectedEntry2 = - AggregateEntryTestUtils.of( - "resource2", - "service2", - "operation2", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - if (AggregateEntryTestUtils.equals(e, expectedEntry1)) { - assertEquals(count, e.getHitCount()); - assertEquals(count * duration, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedEntry2)) { - assertEquals(count, e.getHitCount()); - assertEquals(count * duration * 2, e.getDuration()); - } else { - throw new AssertionError("Unexpected AggregateEntry in add()"); - } - return null; - }) + AggregateEntry expectedEntry1 = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); + AggregateEntry expectedEntry2 = AggregateEntryTestUtils.of( + "resource2", + "service2", + "operation2", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + if (AggregateEntryTestUtils.equals(e, expectedEntry1)) { + assertEquals(count, e.getHitCount()); + assertEquals(count * duration, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedEntry2)) { + assertEquals(count, e.getHitCount()); + assertEquals(count * duration * 2, e.getDuration()); + } else { + throw new AssertionError("Unexpected AggregateEntry in add()"); + } + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); @@ -806,111 +720,103 @@ void aggregateSpansWithSameHttpEndpointTogetherSeparateDifferentEndpoints() thro CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch2 = new CountDownLatch(1); - AggregateEntry expectedGetUsers = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "server", - emptyList(), - "GET", - "/api/users/:id", - null); - AggregateEntry expectedGetOrders = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "server", - emptyList(), - "GET", - "/api/orders/:id", - null); - AggregateEntry expectedPostUsers = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "server", - emptyList(), - "POST", - "/api/users/:id", - null); + AggregateEntry expectedGetUsers = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "server", + emptyList(), + "GET", + "/api/users/:id", + null); + AggregateEntry expectedGetOrders = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "server", + emptyList(), + "GET", + "/api/orders/:id", + null); + AggregateEntry expectedPostUsers = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "server", + emptyList(), + "POST", + "/api/users/:id", + null); AtomicInteger cycle = new AtomicInteger(1); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - if (cycle.get() == 1) { - // should aggregate into single metric - assertTrue(AggregateEntryTestUtils.equals(e, expectedGetUsers)); - assertEquals(count, e.getHitCount()); - assertEquals(count * duration, e.getDuration()); - } else { - // separate metrics for each endpoint/method combination - if (AggregateEntryTestUtils.equals(e, expectedGetUsers)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedGetOrders)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration * 2, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedPostUsers)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration * 3, e.getDuration()); - } else { - throw new AssertionError("Unexpected AggregateEntry in cycle 2 add()"); - } - } - return null; - }) + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + if (cycle.get() == 1) { + // should aggregate into single metric + assertTrue(AggregateEntryTestUtils.equals(e, expectedGetUsers)); + assertEquals(count, e.getHitCount()); + assertEquals(count * duration, e.getDuration()); + } else { + // separate metrics for each endpoint/method combination + if (AggregateEntryTestUtils.equals(e, expectedGetUsers)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedGetOrders)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration * 2, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedPostUsers)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration * 3, e.getDuration()); + } else { + throw new AssertionError("Unexpected AggregateEntry in cycle 2 add()"); + } + } + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - cycle.incrementAndGet(); - latch.countDown(); - return null; - }) - .doAnswer( - invocation -> { - latch2.countDown(); - return null; - }) + doAnswer(invocation -> { + cycle.incrementAndGet(); + latch.countDown(); + return null; + }) + .doAnswer(invocation -> { + latch2.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i < count; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/users/:id"))); + aggregator.publish(singletonList(new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/users/:id"))); } aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -922,50 +828,49 @@ void aggregateSpansWithSameHttpEndpointTogetherSeparateDifferentEndpoints() thro .add(argThat(e -> AggregateEntryTestUtils.equals(e, expectedGetUsers))); // publish spans with different endpoints - aggregator.publish( - Arrays.asList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/users/:id"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration * 2, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/orders/:id"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration * 3, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "POST") - .setTag("http.endpoint", "/api/users/:id"))); + aggregator.publish(Arrays.asList( + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/users/:id"), + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration * 2, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/orders/:id"), + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration * 3, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "POST") + .setTag("http.endpoint", "/api/users/:id"))); aggregator.report(); boolean latchTriggered2 = latch2.await(2, SECONDS); @@ -997,158 +902,142 @@ void createSeparateMetricsForDifferentHttpMethodEndpointStatusCombinations() thr CountDownLatch latch = new CountDownLatch(1); long duration = 100; - AggregateEntry expectedGet200Users = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - emptyList(), - "GET", - "/api/users/:id", - null); - AggregateEntry expectedPost200Users = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - emptyList(), - "POST", - "/api/users/:id", - null); - AggregateEntry expectedGet404Users = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - 404, - false, - false, - "server", - emptyList(), - "GET", - "/api/users/:id", - null); - AggregateEntry expectedGet200Orders = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - emptyList(), - "GET", - "/api/orders/:id", - null); - - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - if (AggregateEntryTestUtils.equals(e, expectedGet200Users)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedPost200Users)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration * 2, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedGet404Users)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration * 3, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedGet200Orders)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration * 4, e.getDuration()); - } else { - throw new AssertionError("Unexpected AggregateEntry in add()"); - } - return null; - }) + AggregateEntry expectedGet200Users = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + emptyList(), + "GET", + "/api/users/:id", + null); + AggregateEntry expectedPost200Users = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + emptyList(), + "POST", + "/api/users/:id", + null); + AggregateEntry expectedGet404Users = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + 404, + false, + false, + "server", + emptyList(), + "GET", + "/api/users/:id", + null); + AggregateEntry expectedGet200Orders = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + emptyList(), + "GET", + "/api/orders/:id", + null); + + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + if (AggregateEntryTestUtils.equals(e, expectedGet200Users)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedPost200Users)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration * 2, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedGet404Users)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration * 3, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedGet200Orders)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration * 4, e.getDuration()); + } else { + throw new AssertionError("Unexpected AggregateEntry in add()"); + } + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - Arrays.asList( - // Same endpoint, different methods - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration, - 200) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/users/:id"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration * 2, - 200) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "POST") - .setTag("http.endpoint", "/api/users/:id"), - // Same method/endpoint, different status - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration * 3, - 404) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/users/:id"), - // Different endpoint - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration * 4, - 200) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/orders/:id"))); + aggregator.publish(Arrays.asList( + // Same endpoint, different methods + new SimpleSpan( + "service", "operation", "resource", "type", true, false, false, 0, duration, 200) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/users/:id"), + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration * 2, + 200) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "POST") + .setTag("http.endpoint", "/api/users/:id"), + // Same method/endpoint, different status + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration * 3, + 404) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/users/:id"), + // Different endpoint + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration * 4, + 200) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/orders/:id"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -1182,91 +1071,77 @@ void handleSpansWithoutHttpEndpointTagsForBackwardCompatibility() throws Excepti CountDownLatch latch = new CountDownLatch(1); long duration = 100; - AggregateEntry expectedNoHttpTags = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - emptyList(), - null, - null, - null); - AggregateEntry expectedWithHttpTags = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - emptyList(), - "GET", - "/api/users/:id", - null); - - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - if (AggregateEntryTestUtils.equals(e, expectedNoHttpTags)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedWithHttpTags)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration * 2, e.getDuration()); - } else { - throw new AssertionError("Unexpected AggregateEntry in add()"); - } - return null; - }) + AggregateEntry expectedNoHttpTags = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + emptyList(), + null, + null, + null); + AggregateEntry expectedWithHttpTags = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + emptyList(), + "GET", + "/api/users/:id", + null); + + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + if (AggregateEntryTestUtils.equals(e, expectedNoHttpTags)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedWithHttpTags)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration * 2, e.getDuration()); + } else { + throw new AssertionError("Unexpected AggregateEntry in add()"); + } + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - Arrays.asList( - // Span without HTTP tags (legacy behavior) - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration, - 200) - .setTag(Tags.SPAN_KIND, "server"), - // Span with HTTP tags (new behavior) - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - false, - false, - 0, - duration * 2, - 200) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/users/:id"))); + aggregator.publish(Arrays.asList( + // Span without HTTP tags (legacy behavior) + new SimpleSpan( + "service", "operation", "resource", "type", true, false, false, 0, duration, 200) + .setTag(Tags.SPAN_KIND, "server"), + // Span with HTTP tags (new behavior) + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + false, + false, + 0, + duration * 2, + 200) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/users/:id"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -1296,108 +1171,103 @@ void gatherTheServiceNameSourceWhenTheSpanIsPublished() throws Exception { CountDownLatch latch = new CountDownLatch(1); long duration = 100; - AggregateEntry expectedWithSource = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - "source", - "type", - 200, - false, - false, - "server", - emptyList(), - null, - null, - null); - AggregateEntry expectedWithoutSource = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - emptyList(), - null, - null, - null); - - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - if (AggregateEntryTestUtils.equals(e, expectedWithSource)) { - assertEquals(2, e.getHitCount()); - assertEquals(2 * duration, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedWithoutSource)) { - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - } else { - throw new AssertionError("Unexpected AggregateEntry in add()"); - } - return null; - }) + AggregateEntry expectedWithSource = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + "source", + "type", + 200, + false, + false, + "server", + emptyList(), + null, + null, + null); + AggregateEntry expectedWithoutSource = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + emptyList(), + null, + null, + null); + + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + if (AggregateEntryTestUtils.equals(e, expectedWithSource)) { + assertEquals(2, e.getHitCount()); + assertEquals(2 * duration, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedWithoutSource)) { + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + } else { + throw new AssertionError("Unexpected AggregateEntry in add()"); + } + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - Arrays.asList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - true, - false, - 0, - duration, - 200, - false, - 0, - "source") - .setTag(Tags.SPAN_KIND, "server"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - true, - false, - 0, - duration, - 200, - false, - 0, - null) - .setTag(Tags.SPAN_KIND, "server"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - true, - false, - 0, - duration, - 200, - false, - 0, - "source") - .setTag(Tags.SPAN_KIND, "server"))); + aggregator.publish(Arrays.asList( + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + true, + false, + 0, + duration, + 200, + false, + 0, + "source") + .setTag(Tags.SPAN_KIND, "server"), + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + true, + false, + 0, + duration, + 200, + false, + 0, + null) + .setTag(Tags.SPAN_KIND, "server"), + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + true, + false, + 0, + duration, + 200, + false, + 0, + "source") + .setTag(Tags.SPAN_KIND, "server"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -1423,61 +1293,55 @@ void newAggregatesBeyondSizeLimitAreDroppedWhenNoStaleEntriesCanBeEvicted() thro DDAgentFeaturesDiscovery features = mock(DDAgentFeaturesDiscovery.class); when(features.supportsMetrics()).thenReturn(true); when(features.peerTags()).thenReturn(emptySet()); - try (ClientStatsAggregator aggregator = - createClientStatsAggregator( - features, HealthMetrics.NO_OP, sink, writer, maxAggregates, false)) { + try (ClientStatsAggregator aggregator = createClientStatsAggregator( + features, HealthMetrics.NO_OP, sink, writer, maxAggregates, false)) { long duration = 100; aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedDropped = - AggregateEntryTestUtils.of( - "resource", - "service10", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - return null; - }) + AggregateEntry expectedDropped = AggregateEntryTestUtils.of( + "resource", + "service10", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i < 11; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, + "operation", + "resource", + "type", + false, + true, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); } aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -1486,21 +1350,20 @@ void newAggregatesBeyondSizeLimitAreDroppedWhenNoStaleEntriesCanBeEvicted() thro assertTrue(latchTriggered); verify(writer).startBucket(eq(10), anyLong(), eq(SECONDS.toNanos(REPORTING_INTERVAL))); for (int i = 0; i < 10; ++i) { - AggregateEntry expected = - AggregateEntryTestUtils.of( - "resource", - "service" + i, - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); + AggregateEntry expected = AggregateEntryTestUtils.of( + "resource", + "service" + i, + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); verify(writer, times(1)).add(argThat(e -> AggregateEntryTestUtils.equals(e, expected))); } verify(writer, never()).add(argThat(e -> AggregateEntryTestUtils.equals(e, expectedDropped))); @@ -1523,29 +1386,26 @@ void shouldReportDroppedAggregateToHealthMetricsOnLruEviction() throws Exception aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i < maxAggregates + 1; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, + "operation", + "resource", + "type", + false, + true, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); } aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -1571,29 +1431,17 @@ void shouldNotReportDroppedAggregateWhenEvictedEntryWasAlreadyFlushed() throws E // fill cache and flush — entries are cleared (hitCount=0) but stay in the LRU CountDownLatch latch1 = new CountDownLatch(1); - doAnswer( - invocation -> { - latch1.countDown(); - return null; - }) + doAnswer(invocation -> { + latch1.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i < maxAggregates; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, "operation", "resource", "type", false, true, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); } aggregator.report(); latch1.await(2, SECONDS); @@ -1602,29 +1450,17 @@ void shouldNotReportDroppedAggregateWhenEvictedEntryWasAlreadyFlushed() throws E // publish new distinct spans — LRU evicts the cleared entries before the next report CountDownLatch latch2 = new CountDownLatch(1); - doAnswer( - invocation -> { - latch2.countDown(); - return null; - }) + doAnswer(invocation -> { + latch2.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = maxAggregates; i < maxAggregates * 2; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, "operation", "resource", "type", false, true, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); } aggregator.report(); latch2.await(2, SECONDS); @@ -1643,46 +1479,41 @@ void aggregateNotUpdatedInReportingIntervalNotReported() throws Exception { DDAgentFeaturesDiscovery features = mock(DDAgentFeaturesDiscovery.class); when(features.supportsMetrics()).thenReturn(true); when(features.peerTags()).thenReturn(emptySet()); - try (ClientStatsAggregator aggregator = - createClientStatsAggregator( - features, HealthMetrics.NO_OP, sink, writer, maxAggregates, false)) { + try (ClientStatsAggregator aggregator = createClientStatsAggregator( + features, HealthMetrics.NO_OP, sink, writer, maxAggregates, false)) { long duration = 100; aggregator.start(); // first cycle CountDownLatch latch = new CountDownLatch(1); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - return null; - }) + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i < 5; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, + "operation", + "resource", + "type", + false, + true, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); } aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -1691,50 +1522,46 @@ void aggregateNotUpdatedInReportingIntervalNotReported() throws Exception { assertTrue(latchTriggered); verify(writer).startBucket(eq(5), anyLong(), eq(SECONDS.toNanos(REPORTING_INTERVAL))); for (int i = 0; i < 5; ++i) { - AggregateEntry expected = - AggregateEntryTestUtils.of( - "resource", - "service" + i, - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); + AggregateEntry expected = AggregateEntryTestUtils.of( + "resource", + "service" + i, + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); verify(writer, times(1)).add(argThat(e -> AggregateEntryTestUtils.equals(e, expected))); } verify(writer, times(1)).finishBucket(); // second cycle - service0 not updated CountDownLatch latch2 = new CountDownLatch(1); - doAnswer( - invocation -> { - latch2.countDown(); - return null; - }) + doAnswer(invocation -> { + latch2.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 1; i < 5; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "baz"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, + "operation", + "resource", + "type", + false, + true, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "baz"))); } aggregator.report(); boolean latchTriggered2 = latch2.await(2, SECONDS); @@ -1743,38 +1570,36 @@ void aggregateNotUpdatedInReportingIntervalNotReported() throws Exception { assertTrue(latchTriggered2); verify(writer).startBucket(eq(4), anyLong(), eq(SECONDS.toNanos(REPORTING_INTERVAL))); for (int i = 1; i < 5; ++i) { - AggregateEntry expected = - AggregateEntryTestUtils.of( - "resource", - "service" + i, - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); + AggregateEntry expected = AggregateEntryTestUtils.of( + "resource", + "service" + i, + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); verify(writer, times(2)).add(argThat(e -> AggregateEntryTestUtils.equals(e, expected))); } - AggregateEntry expectedService0 = - AggregateEntryTestUtils.of( - "resource", - "service0", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "baz", - emptyList(), - null, - null, - null); + AggregateEntry expectedService0 = AggregateEntryTestUtils.of( + "resource", + "service0", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "baz", + emptyList(), + null, + null, + null); verify(writer, times(1)) .add(argThat(e -> AggregateEntryTestUtils.equals(e, expectedService0))); verify(writer, times(2)).finishBucket(); @@ -1789,46 +1614,41 @@ void whenNoAggregateIsUpdatedInReportingIntervalNothingIsReported() throws Excep DDAgentFeaturesDiscovery features = mock(DDAgentFeaturesDiscovery.class); when(features.supportsMetrics()).thenReturn(true); when(features.peerTags()).thenReturn(emptySet()); - try (ClientStatsAggregator aggregator = - createClientStatsAggregator( - features, HealthMetrics.NO_OP, sink, writer, maxAggregates, false)) { + try (ClientStatsAggregator aggregator = createClientStatsAggregator( + features, HealthMetrics.NO_OP, sink, writer, maxAggregates, false)) { long duration = 100; aggregator.start(); // first cycle CountDownLatch latch = new CountDownLatch(1); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - return null; - }) + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i < 5; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - duration, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "quux"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, + "operation", + "resource", + "type", + false, + true, + false, + 0, + duration, + HTTP_OK) + .setTag(Tags.SPAN_KIND, "quux"))); } aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -1837,21 +1657,20 @@ void whenNoAggregateIsUpdatedInReportingIntervalNothingIsReported() throws Excep assertTrue(latchTriggered); verify(writer).startBucket(eq(5), anyLong(), eq(SECONDS.toNanos(REPORTING_INTERVAL))); for (int i = 0; i < 5; ++i) { - AggregateEntry expected = - AggregateEntryTestUtils.of( - "resource", - "service" + i, - "operation", - null, - "type", - HTTP_OK, - false, - false, - "quux", - emptyList(), - null, - null, - null); + AggregateEntry expected = AggregateEntryTestUtils.of( + "resource", + "service" + i, + "operation", + null, + "type", + HTTP_OK, + false, + false, + "quux", + emptyList(), + null, + null, + null); verify(writer, times(1)).add(argThat(e -> AggregateEntryTestUtils.equals(e, expected))); } verify(writer, times(1)).finishBucket(); @@ -1882,39 +1701,35 @@ void shouldReportPeriodically() throws Exception { aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertEquals(1, e.getHitCount()); - assertEquals(duration, e.getDuration()); - return null; - }) + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertEquals(1, e.getHitCount()); + assertEquals(duration, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i < 5; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - duration, - HTTP_OK, - true) - .setTag(Tags.SPAN_KIND, "garply"))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, + "operation", + "resource", + "type", + false, + true, + false, + 0, + duration, + HTTP_OK, + true) + .setTag(Tags.SPAN_KIND, "garply"))); } boolean latchTriggered = latch.await(2, SECONDS); @@ -1922,21 +1737,20 @@ void shouldReportPeriodically() throws Exception { assertTrue(latchTriggered); verify(writer).startBucket(eq(5), anyLong(), eq(SECONDS.toNanos(1))); for (int i = 0; i < 5; ++i) { - AggregateEntry expected = - AggregateEntryTestUtils.of( - "resource", - "service" + i, - "operation", - null, - "type", - HTTP_OK, - false, - true, - "garply", - emptyList(), - null, - null, - null); + AggregateEntry expected = AggregateEntryTestUtils.of( + "resource", + "service" + i, + "operation", + null, + "type", + HTTP_OK, + false, + true, + "garply", + emptyList(), + null, + null, + null); verify(writer, times(1)).add(argThat(e -> AggregateEntryTestUtils.equals(e, expected))); } verify(writer, times(1)).finishBucket(); @@ -1960,28 +1774,25 @@ void shouldBeResilientToSerializationErrors() throws Exception { doThrow(new IllegalArgumentException("something went wrong")) .when(writer) .startBucket(anyInt(), anyLong(), anyLong()); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .reset(); for (int i = 0; i < 5; ++i) { - aggregator.publish( - singletonList( - new SimpleSpan( - "service" + i, - "operation", - "resource", - "type", - false, - true, - false, - 0, - duration, - HTTP_OK))); + aggregator.publish(singletonList(new SimpleSpan( + "service" + i, + "operation", + "resource", + "type", + false, + true, + false, + 0, + duration, + HTTP_OK))); } boolean latchTriggered = latch.await(2, SECONDS); @@ -2018,10 +1829,8 @@ void shouldStartEvenIfTheAgentIsNotAvailable() throws Exception { when(features.peerTags()).thenReturn(emptySet()); try (ClientStatsAggregator aggregator = createClientStatsAggregator(features, sink, writer, 10, 200, MILLISECONDS, false)) { - List spans = - singletonList( - new SimpleSpan( - "service", "operation", "resource", "type", false, true, false, 0, 10, HTTP_OK)); + List spans = singletonList(new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 10, HTTP_OK)); aggregator.start(); // metrics not available @@ -2052,15 +1861,13 @@ void forceFlushShouldWaitForAggregatorToStart() throws Exception { createClientStatsAggregator(features, sink, writer, maxAggregates, 1, SECONDS, false)) { // call forceReport before start - CompletableFuture async = - CompletableFuture.supplyAsync( - () -> { - try { - return aggregator.forceReport().get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - }); + CompletableFuture async = CompletableFuture.supplyAsync(() -> { + try { + return aggregator.forceReport().get(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); assertThrows(TimeoutException.class, () -> async.get(3, SECONDS)); @@ -2084,68 +1891,64 @@ void shouldNotCountPartialSnapshotLongRunning() throws Exception { aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedEntry = - AggregateEntryTestUtils.of( - "resource", + AggregateEntry expectedEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + true, + "", + emptyList(), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); + assertEquals(1, e.getHitCount()); + assertEquals(1, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + return null; + }) + .when(writer) + .add(any(AggregateEntry.class)); + doAnswer(invocation -> { + latch.countDown(); + return null; + }) + .when(writer) + .finishBucket(); + + aggregator.publish(Arrays.asList( + new SimpleSpan( "service", "operation", - null, + "resource", "type", + true, + true, + false, + 0, + 100, HTTP_OK, + true, + 12345), + new SimpleSpan( + "service", + "operation", + "resource", + "type", + true, + true, false, + 0, + 100, + HTTP_OK, true, - "", - emptyList(), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); - assertEquals(1, e.getHitCount()); - assertEquals(1, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - return null; - }) - .when(writer) - .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) - .when(writer) - .finishBucket(); - - aggregator.publish( - Arrays.asList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - true, - false, - 0, - 100, - HTTP_OK, - true, - 12345), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - true, - true, - false, - 0, - 100, - HTTP_OK, - true, - 0))); + 0))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -2169,82 +1972,51 @@ void shouldNotChangeMetricBucketsWhenIncludeEndpointInMetricsIsDisabled() throws // publishing spans with different http.method and http.endpoint CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedEntry = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "server", - emptyList(), - null, - null, - null); - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); - assertEquals(3, e.getHitCount()); - assertEquals(3, e.getTopLevelCount()); - assertEquals(450, e.getDuration()); - return null; - }) + AggregateEntry expectedEntry = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "server", + emptyList(), + null, + null, + null); + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + assertTrue(AggregateEntryTestUtils.equals(e, expectedEntry)); + assertEquals(3, e.getHitCount()); + assertEquals(3, e.getTopLevelCount()); + assertEquals(450, e.getDuration()); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - Arrays.asList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - false, - true, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/users/:id"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - false, - true, - false, - 0, - 200, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "POST") - .setTag("http.endpoint", "/api/orders"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - false, - true, - false, - 0, - 150, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server"))); + aggregator.publish(Arrays.asList( + new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/users/:id"), + new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 200, HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "POST") + .setTag("http.endpoint", "/api/orders"), + new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 150, HTTP_OK) + .setTag(Tags.SPAN_KIND, "server"))); aggregator.forceReport().get(2, SECONDS); boolean latchTriggered = latch.await(0, SECONDS); @@ -2269,124 +2041,91 @@ void shouldSeparateMetricBucketsWhenIncludeEndpointInMetricsIsEnabled() throws E // publishing spans with different http.method and http.endpoint CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedGetUsers = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "server", - emptyList(), - "GET", - "/api/users/:id", - null); - AggregateEntry expectedPostOrders = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "server", - emptyList(), - "POST", - "/api/orders", - null); - AggregateEntry expectedNoHttp = - AggregateEntryTestUtils.of( - "resource", - "service", - "operation", - null, - "type", - HTTP_OK, - false, - false, - "server", - emptyList(), - null, - null, - null); - - doAnswer( - invocation -> { - AggregateEntry e = invocation.getArgument(0); - if (AggregateEntryTestUtils.equals(e, expectedGetUsers)) { - assertEquals(1, e.getHitCount()); - assertEquals(1, e.getTopLevelCount()); - assertEquals(100, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedPostOrders)) { - assertEquals(1, e.getHitCount()); - assertEquals(1, e.getTopLevelCount()); - assertEquals(200, e.getDuration()); - } else if (AggregateEntryTestUtils.equals(e, expectedNoHttp)) { - assertEquals(1, e.getHitCount()); - assertEquals(1, e.getTopLevelCount()); - assertEquals(150, e.getDuration()); - } else { - throw new AssertionError("Unexpected AggregateEntry in add()"); - } - return null; - }) + AggregateEntry expectedGetUsers = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "server", + emptyList(), + "GET", + "/api/users/:id", + null); + AggregateEntry expectedPostOrders = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "server", + emptyList(), + "POST", + "/api/orders", + null); + AggregateEntry expectedNoHttp = AggregateEntryTestUtils.of( + "resource", + "service", + "operation", + null, + "type", + HTTP_OK, + false, + false, + "server", + emptyList(), + null, + null, + null); + + doAnswer(invocation -> { + AggregateEntry e = invocation.getArgument(0); + if (AggregateEntryTestUtils.equals(e, expectedGetUsers)) { + assertEquals(1, e.getHitCount()); + assertEquals(1, e.getTopLevelCount()); + assertEquals(100, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedPostOrders)) { + assertEquals(1, e.getHitCount()); + assertEquals(1, e.getTopLevelCount()); + assertEquals(200, e.getDuration()); + } else if (AggregateEntryTestUtils.equals(e, expectedNoHttp)) { + assertEquals(1, e.getHitCount()); + assertEquals(1, e.getTopLevelCount()); + assertEquals(150, e.getDuration()); + } else { + throw new AssertionError("Unexpected AggregateEntry in add()"); + } + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - Arrays.asList( - new SimpleSpan( - "service", - "operation", - "resource", - "type", - false, - true, - false, - 0, - 100, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "GET") - .setTag("http.endpoint", "/api/users/:id"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - false, - true, - false, - 0, - 200, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server") - .setTag("http.method", "POST") - .setTag("http.endpoint", "/api/orders"), - new SimpleSpan( - "service", - "operation", - "resource", - "type", - false, - true, - false, - 0, - 150, - HTTP_OK) - .setTag(Tags.SPAN_KIND, "server"))); + aggregator.publish(Arrays.asList( + new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 100, HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "GET") + .setTag("http.endpoint", "/api/users/:id"), + new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 200, HTTP_OK) + .setTag(Tags.SPAN_KIND, "server") + .setTag("http.method", "POST") + .setTag("http.endpoint", "/api/orders"), + new SimpleSpan( + "service", "operation", "resource", "type", false, true, false, 0, 150, HTTP_OK) + .setTag(Tags.SPAN_KIND, "server"))); aggregator.forceReport().get(2, SECONDS); boolean latchTriggered = latch.await(0, SECONDS); @@ -2414,92 +2153,87 @@ void shouldIncludeGrpcStatusCodeInMetricKeyForRpcSpans() throws Exception { aggregator.start(); CountDownLatch latch = new CountDownLatch(1); - AggregateEntry expectedGrpcStatus0 = - AggregateEntryTestUtils.of( - "grpc.service/Method", - "service", - "grpc.server", - null, - "rpc", - 0, - false, - false, - "server", - emptyList(), - null, - null, - "0"); - AggregateEntry expectedGrpcStatus5 = - AggregateEntryTestUtils.of( - "grpc.service/Method", - "service", - "grpc.server", - null, - "rpc", - 0, - false, - false, - "server", - emptyList(), - null, - null, - "5"); - AggregateEntry expectedHttpSpan = - AggregateEntryTestUtils.of( - "GET /api", - "service", - "http.request", - null, - "web", - 200, - false, - false, - "server", - emptyList(), - null, - null, - null); + AggregateEntry expectedGrpcStatus0 = AggregateEntryTestUtils.of( + "grpc.service/Method", + "service", + "grpc.server", + null, + "rpc", + 0, + false, + false, + "server", + emptyList(), + null, + null, + "0"); + AggregateEntry expectedGrpcStatus5 = AggregateEntryTestUtils.of( + "grpc.service/Method", + "service", + "grpc.server", + null, + "rpc", + 0, + false, + false, + "server", + emptyList(), + null, + null, + "5"); + AggregateEntry expectedHttpSpan = AggregateEntryTestUtils.of( + "GET /api", + "service", + "http.request", + null, + "web", + 200, + false, + false, + "server", + emptyList(), + null, + null, + null); doAnswer(invocation -> null).when(writer).add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(writer) .finishBucket(); - aggregator.publish( - Arrays.asList( - new SimpleSpan( - "service", - "grpc.server", - "grpc.service/Method", - "rpc", - true, - false, - false, - 0, - 100, - 0) - .setTag(Tags.SPAN_KIND, "server") - .setTag(InstrumentationTags.GRPC_STATUS_CODE, 0), - new SimpleSpan( - "service", - "grpc.server", - "grpc.service/Method", - "rpc", - true, - false, - false, - 0, - 50, - 0) - .setTag(Tags.SPAN_KIND, "server") - .setTag(InstrumentationTags.GRPC_STATUS_CODE, 5), - new SimpleSpan( - "service", "http.request", "GET /api", "web", true, false, false, 0, 75, 200) - .setTag(Tags.SPAN_KIND, "server"))); + aggregator.publish(Arrays.asList( + new SimpleSpan( + "service", + "grpc.server", + "grpc.service/Method", + "rpc", + true, + false, + false, + 0, + 100, + 0) + .setTag(Tags.SPAN_KIND, "server") + .setTag(InstrumentationTags.GRPC_STATUS_CODE, 0), + new SimpleSpan( + "service", + "grpc.server", + "grpc.service/Method", + "rpc", + true, + false, + false, + 0, + 50, + 0) + .setTag(Tags.SPAN_KIND, "server") + .setTag(InstrumentationTags.GRPC_STATUS_CODE, 5), + new SimpleSpan( + "service", "http.request", "GET /api", "web", true, false, false, 0, 75, 200) + .setTag(Tags.SPAN_KIND, "server"))); aggregator.report(); boolean latchTriggered = latch.await(2, SECONDS); @@ -2531,25 +2265,21 @@ void cardinalityLimitsResetBetweenReportCycles() throws Exception { aggregator.start(); // publish SERVICE+1 distinct services to fill and overflow the cardinality budget - doAnswer( - invocation -> { - cycle1Entries.add(invocation.getArgument(0)); - return null; - }) + doAnswer(invocation -> { + cycle1Entries.add(invocation.getArgument(0)); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch1.countDown(); - return null; - }) + doAnswer(invocation -> { + latch1.countDown(); + return null; + }) .when(writer) .finishBucket(); for (int i = 0; i <= MetricCardinalityLimits.SERVICE; i++) { - aggregator.publish( - singletonList( - new SimpleSpan( - "svc-" + i, "op", "resource", "web", false, true, false, 0, 100, HTTP_OK))); + aggregator.publish(singletonList(new SimpleSpan( + "svc-" + i, "op", "resource", "web", false, true, false, 0, 100, HTTP_OK))); } aggregator.report(); latch1.await(2, SECONDS); @@ -2565,34 +2295,21 @@ void cardinalityLimitsResetBetweenReportCycles() throws Exception { // publish the overflow service in the next cycle after the cardinality reset clearInvocations(writer); - doAnswer( - invocation -> { - cycle2Entries.add(invocation.getArgument(0)); - return null; - }) + doAnswer(invocation -> { + cycle2Entries.add(invocation.getArgument(0)); + return null; + }) .when(writer) .add(any(AggregateEntry.class)); - doAnswer( - invocation -> { - latch2.countDown(); - return null; - }) + doAnswer(invocation -> { + latch2.countDown(); + return null; + }) .when(writer) .finishBucket(); String overflowServiceName = "svc-" + MetricCardinalityLimits.SERVICE; - aggregator.publish( - singletonList( - new SimpleSpan( - overflowServiceName, - "op", - "resource", - "web", - false, - true, - false, - 0, - 100, - HTTP_OK))); + aggregator.publish(singletonList(new SimpleSpan( + overflowServiceName, "op", "resource", "web", false, true, false, 0, 100, HTTP_OK))); aggregator.report(); latch2.await(2, SECONDS); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/CoreHandlersTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/CoreHandlersTest.java index 35c2fa8468c..9cbc57f913a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/CoreHandlersTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/CoreHandlersTest.java @@ -69,7 +69,8 @@ void resetRefreshesCapacityForNextCycle() { handlers.reset(HealthMetrics.NO_OP, new CardinalityLimitReporter()); // Overflow value should now be accepted as a real value. - assertNotEquals("tracer_blocked_value", handlers.spanKind.register("overflow").toString()); + assertNotEquals( + "tracer_blocked_value", handlers.spanKind.register("overflow").toString()); assertEquals("overflow", handlers.spanKind.register("overflow").toString()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/FootprintForkedTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/FootprintForkedTest.java index ac54d7d700f..df6751215dc 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/FootprintForkedTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/FootprintForkedTest.java @@ -59,19 +59,18 @@ void footprintLessThan10MB( mock(DDAgentFeaturesDiscovery.class, withSettings().stubOnly()); when(features.supportsMetrics()).thenReturn(true); when(features.peerTags()).thenReturn(emptySet()); - ClientStatsAggregator aggregator = - new ClientStatsAggregator( - new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"), - emptySet(), - AdditionalTagsSchema.EMPTY, - features, - HealthMetrics.NO_OP, - sink, - 1000, - 1000, - 100, - SECONDS, - false); + ClientStatsAggregator aggregator = new ClientStatsAggregator( + new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"), + emptySet(), + AdditionalTagsSchema.EMPTY, + features, + HealthMetrics.NO_OP, + sink, + 1000, + 1000, + 100, + SECONDS, + false); // Measuring the AggregateTable directly (rather than the whole ClientStatsAggregator) avoids // both the 'features' mock (mocks are heavyweight, e.g. around 22MiB) and the aggregator's // background Thread, whose ThreadGroup transitively references every other live thread in the @@ -99,19 +98,17 @@ void footprintLessThan10MB( String resourceName = resourceNames[ThreadLocalRandom.current().nextInt(resourceNames.length)]; boolean isError = ThreadLocalRandom.current().nextInt(traceCount) < errorThreshold; - aggregator.publish( - Collections.singletonList( - new SimpleSpan( - serviceName, - operation, - resourceName, - type, - true, - true, - isError, - System.nanoTime(), - isError ? expDistributedNanoseconds(0.99) : expDistributedNanoseconds(0.01), - 200))); + aggregator.publish(Collections.singletonList(new SimpleSpan( + serviceName, + operation, + resourceName, + type, + true, + true, + isError, + System.nanoTime(), + isError ? expDistributedNanoseconds(0.99) : expDistributedNanoseconds(0.01), + 200))); } if (!aggregator.report()) { int attempts = 0; diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsAggregatorFactoryTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsAggregatorFactoryTest.java index e9d981df389..d7b6d031dcf 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsAggregatorFactoryTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsAggregatorFactoryTest.java @@ -47,9 +47,8 @@ private static Properties props(String... keyValues) { void whenAllMetricsDisabledNoOpAggregatorCreated() { Config config = Config.get(props(TRACE_STATS_COMPUTATION_ENABLED, "false")); - MetricsAggregator aggregator = - MetricsAggregatorFactory.createMetricsAggregator( - config, sharedCommunicationObjects(), HealthMetrics.NO_OP); + MetricsAggregator aggregator = MetricsAggregatorFactory.createMetricsAggregator( + config, sharedCommunicationObjects(), HealthMetrics.NO_OP); assertInstanceOf(NoOpMetricsAggregator.class, aggregator); } @@ -59,9 +58,8 @@ void whenNativeTracerMetricsEnabledSerializingWriterSelected() { // tracer metrics default to enabled; OTLP span metrics default off (no OTLP trace export). Config config = Config.get(props()); - MetricsAggregator aggregator = - MetricsAggregatorFactory.createMetricsAggregator( - config, sharedCommunicationObjects(), HealthMetrics.NO_OP); + MetricsAggregator aggregator = MetricsAggregatorFactory.createMetricsAggregator( + config, sharedCommunicationObjects(), HealthMetrics.NO_OP); ClientStatsAggregator conflating = assertInstanceOf(ClientStatsAggregator.class, aggregator); assertFalse(conflating.isOtlpStatsExportEnabled()); @@ -72,13 +70,11 @@ void whenNativeTracerMetricsEnabledSerializingWriterSelected() { @Test void whenOtlpTraceMetricsEnabledOtlpStatsMetricWriterSelected() { - Config config = - Config.get( - props(OTEL_TRACES_SPAN_METRICS_ENABLED, "true", OTLP_METRICS_PROTOCOL, "http/json")); + Config config = Config.get( + props(OTEL_TRACES_SPAN_METRICS_ENABLED, "true", OTLP_METRICS_PROTOCOL, "http/json")); - MetricsAggregator aggregator = - MetricsAggregatorFactory.createMetricsAggregator( - config, sharedCommunicationObjects(), HealthMetrics.NO_OP); + MetricsAggregator aggregator = MetricsAggregatorFactory.createMetricsAggregator( + config, sharedCommunicationObjects(), HealthMetrics.NO_OP); ClientStatsAggregator conflating = assertInstanceOf(ClientStatsAggregator.class, aggregator); assertTrue(conflating.isOtlpStatsExportEnabled()); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsReliabilityTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsReliabilityTest.java index cb204fdb426..357fe5e46e2 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsReliabilityTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/MetricsReliabilityTest.java @@ -34,12 +34,11 @@ void metricsShouldReliablyHandleMomentaryDowngrades() throws Exception { sharedComm.createRemaining(config); DDAgentFeaturesDiscovery featuresDiscovery = sharedComm.featuresDiscovery(config); TracerHealthMetrics healthMetrics = new TracerHealthMetrics(StatsDClient.NO_OP); - CoreTracer tracer = - tracerBuilder() - .sharedCommunicationObjects(sharedComm) - .healthMetrics(healthMetrics) - .config(config) - .build(); + CoreTracer tracer = tracerBuilder() + .sharedCommunicationObjects(sharedComm) + .healthMetrics(healthMetrics) + .config(config) + .build(); try { // metrics enabled and discovery is performed @@ -137,44 +136,32 @@ void metricsShouldReliablyHandleMomentaryDowngrades() throws Exception { } private static JavaTestHttpServer newAgent(State state) { - return JavaTestHttpServer.httpServer( - server -> - server.handlers( - h -> { - h.get( - "/info", - api -> { - String res = - "{\"version\":\"7.65.0\",\"endpoints\":[" - + (state.agentMetricsAvailable ? "\"/v0.6/stats\", " : "") - + "\"/v0.4/traces\"], \"client_drop_p0s\" : true}"; - try { - state.hash = Strings.sha256(res); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - api.getResponse().status(200).send(res); - state.latch.countDown(); - }); - h.post( - "/v0.6/stats", - api -> { - state.receivedStats = true; - api.getResponse().status(state.statsResponseCode).send(); - }); - h.put( - "/v0.4/traces", - api -> { - state.receivedClientComputedHeader = - "true" - .equals( - api.getRequest().getHeader("Datadog-Client-Computed-Stats")); - api.getResponse() - .status(200) - .addHeader("Datadog-Agent-State", state.hash) - .send(); - }); - })); + return JavaTestHttpServer.httpServer(server -> server.handlers(h -> { + h.get("/info", api -> { + String res = "{\"version\":\"7.65.0\",\"endpoints\":[" + + (state.agentMetricsAvailable ? "\"/v0.6/stats\", " : "") + + "\"/v0.4/traces\"], \"client_drop_p0s\" : true}"; + try { + state.hash = Strings.sha256(res); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + api.getResponse().status(200).send(res); + state.latch.countDown(); + }); + h.post("/v0.6/stats", api -> { + state.receivedStats = true; + api.getResponse().status(state.statsResponseCode).send(); + }); + h.put("/v0.4/traces", api -> { + state.receivedClientComputedHeader = + "true".equals(api.getRequest().getHeader("Datadog-Client-Computed-Stats")); + api.getResponse() + .status(200) + .addHeader("Datadog-Agent-State", state.hash) + .send(); + }); + })); } private static void assertMetrics( diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/OkHttpSinkTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/OkHttpSinkTest.java index c864baeaf8c..92838de14b5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/OkHttpSinkTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/OkHttpSinkTest.java @@ -80,19 +80,18 @@ void degradeToAsyncModeWhenAgentSlowToRespond() throws Exception { sink.register(listener); // Single doAnswer handles all three calls using an atomic counter AtomicInteger callCount = new AtomicInteger(0); - doAnswer( - invocation -> { - int callNumber = callCount.incrementAndGet(); - Request request = invocation.getArgument(0); - if (callNumber == 1) { - // First call: simulate slow agent - Thread.sleep(1001); - } else if (callNumber == 2) { - // Second call: should be in degraded mode - assertTrue(sink.isInDegradedMode()); - } - return respond(request, 200); - }) + doAnswer(invocation -> { + int callNumber = callCount.incrementAndGet(); + Request request = invocation.getArgument(0); + if (callNumber == 1) { + // First call: simulate slow agent + Thread.sleep(1001); + } else if (callNumber == 2) { + // Second call: should be in degraded mode + assertTrue(sink.isInDegradedMode()); + } + return respond(request, 200); + }) .when(client) .newCall(any()); @@ -124,14 +123,13 @@ private static Call respond(Request request, int code) throws IOException { if (code == 0) { return error(); } - Response response = - new Response.Builder() - .code(code) - .request(request) - .protocol(Protocol.HTTP_1_1) - .message("message") - .body(ResponseBody.create(MediaType.get("text/plain"), "message")) - .build(); + Response response = new Response.Builder() + .code(code) + .request(request) + .protocol(Protocol.HTTP_1_1) + .message("message") + .body(ResponseBody.create(MediaType.get("text/plain"), "message")) + .build(); Call call = mock(Call.class); doReturn(response).when(call).execute(); return call; diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/PeerTagSchemaTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/PeerTagSchemaTest.java index 3270917068f..112115351dc 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/PeerTagSchemaTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/PeerTagSchemaTest.java @@ -43,9 +43,8 @@ void internalSingletonCarriesBaseService() { @Test void hasSameTagsAsReturnsTrueForExactMatch() { - PeerTagSchema schema = - PeerTagSchema.of( - new LinkedHashSet<>(Arrays.asList("peer.hostname", "peer.service")), "state-1"); + PeerTagSchema schema = PeerTagSchema.of( + new LinkedHashSet<>(Arrays.asList("peer.hostname", "peer.service")), "state-1"); // Same content via a different Set reference -- this is the case the reconcile fast-path // depends on (Set returned from a fresh discovery cycle is content-equal to the prior one). @@ -64,9 +63,8 @@ void hasSameTagsAsReturnsFalseWhenSetGrew() { @Test void hasSameTagsAsReturnsFalseWhenSetShrank() { - PeerTagSchema schema = - PeerTagSchema.of( - new LinkedHashSet<>(Arrays.asList("peer.hostname", "peer.service")), "state-1"); + PeerTagSchema schema = PeerTagSchema.of( + new LinkedHashSet<>(Arrays.asList("peer.hostname", "peer.service")), "state-1"); assertFalse(schema.hasSameTagsAs(Collections.singleton("peer.hostname"))); } @@ -101,13 +99,12 @@ void resetHandlersReportsBlockedCountToHealthMetrics() { schema.register(0, "host-c"); // blocked long[] recorded = {0}; - HealthMetrics hm = - new HealthMetrics() { - @Override - public void onTagCardinalityBlocked(String[] tag, long count) { - recorded[0] += count; - } - }; + HealthMetrics hm = new HealthMetrics() { + @Override + public void onTagCardinalityBlocked(String[] tag, long count) { + recorded[0] += count; + } + }; schema.resetHandlers(hm, new CardinalityLimitReporter()); assertEquals(2, recorded[0]); @@ -135,14 +132,13 @@ void resetHandlersAggregatesAllPeerTagsUnderSinglePeerTagsField() { List tags = new ArrayList<>(); long[] total = {0}; - HealthMetrics hm = - new HealthMetrics() { - @Override - public void onTagCardinalityBlocked(String[] tag, long count) { - tags.add(tag); - total[0] += count; - } - }; + HealthMetrics hm = new HealthMetrics() { + @Override + public void onTagCardinalityBlocked(String[] tag, long count) { + tags.add(tag); + total[0] += count; + } + }; schema.resetHandlers(hm, new CardinalityLimitReporter()); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/metrics/SerializingMetricWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/common/metrics/SerializingMetricWriterTest.java index bc05393cea3..c8aa8da5347 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/metrics/SerializingMetricWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/metrics/SerializingMetricWriterTest.java @@ -61,21 +61,20 @@ private static AggregateEntry entry( CharSequence httpEndpoint, CharSequence grpcStatusCode, int hitCount) { - AggregateEntry aggregateEntry = - AggregateEntryTestUtils.of( - resource, - service, - operationName, - serviceSource, - type, - httpStatusCode, - synthetic, - traceRoot, - spanKind, - peerTags, - httpMethod, - httpEndpoint, - grpcStatusCode); + AggregateEntry aggregateEntry = AggregateEntryTestUtils.of( + resource, + service, + operationName, + serviceSource, + type, + httpStatusCode, + synthetic, + traceRoot, + spanKind, + peerTags, + httpMethod, + httpEndpoint, + grpcStatusCode); for (int i = 0; i < hitCount; i++) { aggregateEntry.recordOneDuration(1L); } @@ -83,78 +82,76 @@ private static AggregateEntry entry( } static Stream shouldProduceCorrectMessageArguments() { - List smallContent = - Arrays.asList( - entry( - "resource1", - "service1", - "operation1", - null, - "type", - 0, - false, - false, - "client", - Arrays.asList( - UTF8BytesString.create("country:canada"), - UTF8BytesString.create("georegion:amer"), - UTF8BytesString.create("peer.service:remote-service")), - null, - null, - null, - 10), - entry( - "resource2", - "service2", - "operation2", - null, - "type2", - 200, - true, - false, - "producer", - Arrays.asList( - UTF8BytesString.create("country:canada"), - UTF8BytesString.create("georegion:amer"), - UTF8BytesString.create("peer.service:remote-service")), - null, - null, - null, - 9), - entry( - "GET /api/users/:id", - "web-service", - "http.request", - null, - "web", - 200, - false, - true, - "server", - Collections.emptyList(), - null, - null, - null, - 5)); + List smallContent = Arrays.asList( + entry( + "resource1", + "service1", + "operation1", + null, + "type", + 0, + false, + false, + "client", + Arrays.asList( + UTF8BytesString.create("country:canada"), + UTF8BytesString.create("georegion:amer"), + UTF8BytesString.create("peer.service:remote-service")), + null, + null, + null, + 10), + entry( + "resource2", + "service2", + "operation2", + null, + "type2", + 200, + true, + false, + "producer", + Arrays.asList( + UTF8BytesString.create("country:canada"), + UTF8BytesString.create("georegion:amer"), + UTF8BytesString.create("peer.service:remote-service")), + null, + null, + null, + 9), + entry( + "GET /api/users/:id", + "web-service", + "http.request", + null, + "web", + 200, + false, + true, + "server", + Collections.emptyList(), + null, + null, + null, + 5)); List largeContent = new ArrayList<>(); for (int i = 0; i <= 10000; i++) { - largeContent.add( - entry( - "resource" + i, - "service" + i, - "operation" + i, - null, - "type", - 0, - false, - false, - "producer", - Collections.singletonList(UTF8BytesString.create("messaging.destination:dest" + i)), - null, - null, - null, - 10)); + largeContent.add(entry( + "resource" + i, + "service" + i, + "operation" + i, + null, + "type", + 0, + false, + false, + "producer", + Collections.singletonList(UTF8BytesString.create("messaging.destination:dest" + i)), + null, + null, + null, + 10)); } return Stream.of( @@ -203,38 +200,36 @@ void serviceSourceOptionalInThePayload() { WellKnownTags wellKnownTags = new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"); - AggregateEntry entryNoSource = - entry( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - Collections.emptyList(), - "GET", - "/api/users", - null, - 1); - AggregateEntry entryWithSource = - entry( - "resource", - "service", - "operation", - "source", - "type", - 200, - false, - false, - "server", - Collections.emptyList(), - "POST", - null, - null, - 1); + AggregateEntry entryNoSource = entry( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + Collections.emptyList(), + "GET", + "/api/users", + null, + 1); + AggregateEntry entryWithSource = entry( + "resource", + "service", + "operation", + "source", + "type", + 200, + false, + false, + "server", + Collections.emptyList(), + "POST", + null, + null, + 1); List content = Arrays.asList(entryNoSource, entryWithSource); @@ -260,70 +255,66 @@ void httpMethodAndHttpEndpointFieldsAreOptionalInPayload() { WellKnownTags wellKnownTags = new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"); - AggregateEntry entryWithBoth = - entry( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - Collections.emptyList(), - "GET", - "/api/users", - null, - 1); - AggregateEntry entryWithMethodOnly = - entry( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - Collections.emptyList(), - "POST", - null, - null, - 1); - AggregateEntry entryWithEndpointOnly = - entry( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - Collections.emptyList(), - null, - "/api/orders", - null, - 1); - AggregateEntry entryWithNeither = - entry( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "client", - Collections.emptyList(), - null, - null, - null, - 1); + AggregateEntry entryWithBoth = entry( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + Collections.emptyList(), + "GET", + "/api/users", + null, + 1); + AggregateEntry entryWithMethodOnly = entry( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + Collections.emptyList(), + "POST", + null, + null, + 1); + AggregateEntry entryWithEndpointOnly = entry( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + Collections.emptyList(), + null, + "/api/orders", + null, + 1); + AggregateEntry entryWithNeither = entry( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "client", + Collections.emptyList(), + null, + null, + null, + 1); List content = Arrays.asList(entryWithBoth, entryWithMethodOnly, entryWithEndpointOnly, entryWithNeither); @@ -358,22 +349,21 @@ void addGitShaCommitInfo(String shaCommit) { WellKnownTags wellKnownTags = new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"); - AggregateEntry aggregateEntry = - entry( - "resource", - "service", - "operation", - null, - "type", - 200, - false, - false, - "server", - Collections.emptyList(), - "GET", - "/api/users", - null, - 1); + AggregateEntry aggregateEntry = entry( + "resource", + "service", + "operation", + null, + "type", + 200, + false, + false, + "server", + Collections.emptyList(), + "GET", + "/api/users", + null, + 1); List content = Collections.singletonList(aggregateEntry); @@ -401,54 +391,51 @@ void grpcStatusCodeFieldIsPresentInPayloadForRpcTypeSpans() { WellKnownTags wellKnownTags = new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"); - AggregateEntry entryWithGrpc = - entry( - "grpc.service/Method", - "grpc-service", - "grpc.server", - null, - "rpc", - 0, - false, - false, - "server", - Collections.emptyList(), - null, - null, - "OK", - 1); - AggregateEntry entryWithGrpcError = - entry( - "grpc.service/Method", - "grpc-service", - "grpc.server", - null, - "rpc", - 0, - false, - false, - "client", - Collections.emptyList(), - null, - null, - "NOT_FOUND", - 1); - AggregateEntry entryWithoutGrpc = - entry( - "resource", - "service", - "operation", - null, - "web", - 200, - false, - false, - "server", - Collections.emptyList(), - null, - null, - null, - 1); + AggregateEntry entryWithGrpc = entry( + "grpc.service/Method", + "grpc-service", + "grpc.server", + null, + "rpc", + 0, + false, + false, + "server", + Collections.emptyList(), + null, + null, + "OK", + 1); + AggregateEntry entryWithGrpcError = entry( + "grpc.service/Method", + "grpc-service", + "grpc.server", + null, + "rpc", + 0, + false, + false, + "client", + Collections.emptyList(), + null, + null, + "NOT_FOUND", + 1); + AggregateEntry entryWithoutGrpc = entry( + "resource", + "service", + "operation", + null, + "web", + 200, + false, + false, + "server", + Collections.emptyList(), + null, + null, + null, + 1); List content = Arrays.asList(entryWithGrpc, entryWithGrpcError, entryWithoutGrpc); @@ -539,13 +526,10 @@ void additionalMetricTagsSkipsNullSlots() { // Set only tenant_id; leave region null. table - .findOrInsert( - snapshot( - schema, - new String[] { - /*region*/ - null, /*tenant_id*/ "acme-corp" - })) + .findOrInsert(snapshot(schema, new String[] { + /*region*/ + null, /*tenant_id*/ "acme-corp" + })) .recordOneDuration(1L); List content = contentOf(table); @@ -725,13 +709,12 @@ private void validate(ByteBuffer buffer) throws IOException { boolean hasServiceSource = entry.hasServiceSource(); boolean hasGrpcStatusCode = entry.hasGrpcStatusCode(); UTF8BytesString[] additionalTags = entry.getAdditionalTags(); - int expectedMapSize = - 15 - + (hasServiceSource ? 1 : 0) - + (hasHttpMethod ? 1 : 0) - + (hasHttpEndpoint ? 1 : 0) - + (hasGrpcStatusCode ? 1 : 0) - + (additionalTagsConfigured ? 1 : 0); + int expectedMapSize = 15 + + (hasServiceSource ? 1 : 0) + + (hasHttpMethod ? 1 : 0) + + (hasHttpEndpoint ? 1 : 0) + + (hasGrpcStatusCode ? 1 : 0) + + (additionalTagsConfigured ? 1 : 0); assertEquals(expectedMapSize, metricMapSize); int elementCount = 0; assertEquals("Name", unpacker.unpackString()); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/ForcePrioritySamplerTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/ForcePrioritySamplerTest.java index 6553672e57e..1b8c2be1aeb 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/ForcePrioritySamplerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/ForcePrioritySamplerTest.java @@ -86,7 +86,8 @@ void settingForcedTracingViaTag( @ConvertWith(PrioritySamplingConverter.class) int expectedPriority) { ForcePrioritySampler sampler = new ForcePrioritySampler(PrioritySampling.SAMPLER_KEEP, SamplingMechanism.DEFAULT); - CoreTracer tracer = tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); + CoreTracer tracer = + tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); try { DDSpan span = (DDSpan) tracer.buildSpan("datadog", "root").start(); span.setTag(tagName, tagValue); @@ -110,7 +111,8 @@ void notSettingForcedTracingViaTagOrSettingItWrongValueNotCausingException( String tagName, @ConvertWith(BoxedValueConverter.class) Object tagValue) { ForcePrioritySampler sampler = new ForcePrioritySampler(PrioritySampling.SAMPLER_KEEP, SamplingMechanism.DEFAULT); - CoreTracer tracer = tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); + CoreTracer tracer = + tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); try { DDSpan span = (DDSpan) tracer.buildSpan("datadog", "root").start(); if (tagName != null) { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/ParentBasedAlwaysOnSamplerTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/ParentBasedAlwaysOnSamplerTest.java index 19369beeac9..d8155906c19 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/ParentBasedAlwaysOnSamplerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/ParentBasedAlwaysOnSamplerTest.java @@ -69,8 +69,8 @@ void childSpanInheritsSamplingPriorityFromLocalParent() { DDSpan rootSpan = (DDSpan) tracer.buildSpan("datadog", "root").start(); sampler.setSamplingPriority(rootSpan); - DDSpan childSpan = - (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); + DDSpan childSpan = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); try { assertEquals(SAMPLER_KEEP, rootSpan.getSamplingPriority()); assertEquals(SAMPLER_KEEP, childSpan.getSamplingPriority()); @@ -92,11 +92,11 @@ void childSpanInheritsSamplingDecisionFromRemoteParent(int parentPriority) { ParentBasedAlwaysOnSampler sampler = new ParentBasedAlwaysOnSampler(); CoreTracer tracer = buildTracer(sampler); - ExtractedContext extractedContext = - new ExtractedContext( - DDTraceId.ONE, 2, parentPriority, null, PropagationTags.factory().empty(), DATADOG); + ExtractedContext extractedContext = new ExtractedContext( + DDTraceId.ONE, 2, parentPriority, null, PropagationTags.factory().empty(), DATADOG); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(extractedContext).start(); + DDSpan span = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(extractedContext).start(); try { assertEquals(parentPriority, span.getSamplingPriority()); } finally { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/RateByServiceTraceSamplerTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/RateByServiceTraceSamplerTest.java index 6918cf9c31f..984ff579a1c 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/RateByServiceTraceSamplerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/RateByServiceTraceSamplerTest.java @@ -82,13 +82,10 @@ void invalidRateTo1(Number rate, double expectedRate) { }) void rateSelection(String service, String env, double expectedRate) { RateByServiceTraceSampler serviceSampler = new RateByServiceTraceSampler(); - serviceSampler.onResponse( - "traces", - rateResponse( - new String[][] { - {"service:foo,env:bar", "0.8"}, - {"service:,env:", "0.20"} - })); + serviceSampler.onResponse("traces", rateResponse(new String[][] { + {"service:foo,env:bar", "0.8"}, + {"service:,env:", "0.20"} + })); double sampleRate = serviceSampler.sampleRateFor(env, service); assertTrue(sampleRate > expectedRate - 0.01); @@ -108,15 +105,12 @@ void rateSelection(String service, String env, double expectedRate) { }) void ratePartialAndFullCollisions(String service, String env, double expectedRate) { RateByServiceTraceSampler serviceSampler = new RateByServiceTraceSampler(); - serviceSampler.onResponse( - "traces", - rateResponse( - new String[][] { - {"service:foo,env:bar", "0.8"}, - {"service:FOO,env:BAR", "0.2"}, - {"service:FOO,env:BAZ", "0.3"}, - {"service:quux,env:BAZ", "0.4"} - })); + serviceSampler.onResponse("traces", rateResponse(new String[][] { + {"service:foo,env:bar", "0.8"}, + {"service:FOO,env:BAR", "0.2"}, + {"service:FOO,env:BAZ", "0.3"}, + {"service:quux,env:BAZ", "0.4"} + })); double sampleRate = serviceSampler.sampleRateFor(env, service); assertTrue(sampleRate > expectedRate - 0.01); @@ -130,35 +124,28 @@ void rateByServiceName() { CoreTracer tracer = tracerBuilder().writer(writer).build(); try { serviceSampler.onResponse("traces", rateResponse("service:spock,env:test", 0.0)); - DDSpan span1 = - (DDSpan) - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("foo") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span1 = (DDSpan) tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("foo") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); serviceSampler.setSamplingPriority(span1); assertEquals(SAMPLER_KEEP, span1.getSamplingPriority()); assertTrue(serviceSampler.sample(span1)); // case-insensitive equivalence - undefined in spec, but implemented as first one wins - serviceSampler.onResponse( - "traces", - rateResponse( - new String[][] { - {"service:spock,env:test", "1.0"}, - {"service:SPOCK,env:Test", "0.0"} - })); - DDSpan span2 = - (DDSpan) - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("spock") - .withTag("env", "test") - .ignoreActiveSpan() - .start(); + serviceSampler.onResponse("traces", rateResponse(new String[][] { + {"service:spock,env:test", "1.0"}, + {"service:SPOCK,env:Test", "0.0"} + })); + DDSpan span2 = (DDSpan) tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("spock") + .withTag("env", "test") + .ignoreActiveSpan() + .start(); serviceSampler.setSamplingPriority(span2); assertEquals(SAMPLER_KEEP, span2.getSamplingPriority()); @@ -174,14 +161,12 @@ void rateByServiceNameCaseInsensitive() { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); try { serviceSampler.onResponse("traces", rateResponse("service:spock,env:test", 1.0)); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("SPOCK") - .withTag("env", "Test") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("SPOCK") + .withTag("env", "Test") + .ignoreActiveSpan() + .start(); serviceSampler.setSamplingPriority(span); assertEquals(SAMPLER_KEEP, span.getSamplingPriority()); @@ -197,14 +182,12 @@ void samplingPrioritySetOnContext() { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); serviceSampler.onResponse("traces", rateResponse("service:,env:", 1.0)); try { - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("spock") - .withTag("env", "test") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("spock") + .withTag("env", "test") + .ignoreActiveSpan() + .start(); serviceSampler.setSamplingPriority(span); // sets correctly on root span @@ -222,13 +205,10 @@ void samplingPrioritySetWhenServiceLater() throws Exception { ListWriter writer = new ListWriter(); CoreTracer tracer = tracerBuilder().writer(writer).sampler(sampler).build(); try { - sampler.onResponse( - "test", - rateResponse( - new String[][] { - {"service:,env:", "1.0"}, - {"service:spock,env:", "0.0"} - })); + sampler.onResponse("test", rateResponse(new String[][] { + {"service:,env:", "1.0"}, + {"service:spock,env:", "0.0"} + })); DDSpan span = (DDSpan) tracer.buildSpan("datadog", "test").start(); @@ -240,9 +220,10 @@ void samplingPrioritySetWhenServiceLater() throws Exception { writer.waitForTraces(1); assertEquals(SAMPLER_DROP, span.getSamplingPriority()); - span = - (DDSpan) - tracer.buildSpan("datadog", "test").withTag(DDTags.SERVICE_NAME, "spock").start(); + span = (DDSpan) tracer + .buildSpan("datadog", "test") + .withTag(DDTags.SERVICE_NAME, "spock") + .start(); span.finish(); writer.waitForTraces(2); @@ -262,7 +243,8 @@ void settingForcedTracingViaTag( boolean tagValue, @ConvertWith(PrioritySamplingConverter.class) int expectedPriority) { RateByServiceTraceSampler sampler = new RateByServiceTraceSampler(); - CoreTracer tracer = tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); + CoreTracer tracer = + tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); try { DDSpan span = (DDSpan) tracer.buildSpan("datadog", "root").start(); span.setTag(tagName, tagValue); @@ -309,9 +291,9 @@ void rampUpCapsRateIncreasesAt2xPerInterval() { double tolerance = 0.01; // Set initial rate to 0.1 - serviceSampler.onResponse( - "traces", - rateResponse(new String[][] {{"service:foo,env:bar", "0.1"}, {"service:,env:", "0.1"}})); + serviceSampler.onResponse("traces", rateResponse(new String[][] { + {"service:foo,env:bar", "0.1"}, {"service:,env:", "0.1"} + })); assertTrue(Math.abs(serviceSampler.sampleRateFor("bar", "foo") - 0.1) < tolerance); @@ -358,14 +340,14 @@ void rampDownAppliesImmediately() { double tolerance = 0.01; // Set initial rate to 0.8 - serviceSampler.onResponse( - "traces", - rateResponse(new String[][] {{"service:foo,env:bar", "0.8"}, {"service:,env:", "0.8"}})); + serviceSampler.onResponse("traces", rateResponse(new String[][] { + {"service:foo,env:bar", "0.8"}, {"service:,env:", "0.8"} + })); // rate decreases to 0.2 - serviceSampler.onResponse( - "traces", - rateResponse(new String[][] {{"service:foo,env:bar", "0.2"}, {"service:,env:", "0.2"}})); + serviceSampler.onResponse("traces", rateResponse(new String[][] { + {"service:foo,env:bar", "0.2"}, {"service:,env:", "0.2"} + })); // decrease is applied immediately assertTrue(Math.abs(serviceSampler.sampleRateFor("bar", "foo") - 0.2) < tolerance); @@ -450,7 +432,8 @@ void cooldownNotResetByBlockedIncrease() { void notSettingForcedTracingViaTagOrSettingItWrongValueNotCausingException( String tagName, @ConvertWith(BoxedValueConverter.class) Object tagValue) { RateByServiceTraceSampler sampler = new RateByServiceTraceSampler(); - CoreTracer tracer = tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); + CoreTracer tracer = + tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build(); try { DDSpan span = (DDSpan) tracer.buildSpan("datadog", "root").start(); if (tagName != null) { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/RuleBasedSamplingTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/RuleBasedSamplingTest.java index cfd4ab373aa..ad91a127990 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/RuleBasedSamplingTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/RuleBasedSamplingTest.java @@ -115,17 +115,16 @@ void samplingConfigCombinations( Sampler sampler = Sampler.Builder.forConfig(properties); assertInstanceOf(PrioritySampler.class, sampler); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span); - Map propagationMap = span.spanContext().getPropagationTags().createTagMap(); + Map propagationMap = + span.spanContext().getPropagationTags().createTagMap(); String decisionMaker = propagationMap.get("_dd.p.dm"); String expectedDmStr = expectedDecisionMaker == null ? null : "-" + (int) expectedDecisionMaker; @@ -217,19 +216,18 @@ void samplingConfigJsonRulesCombinations( Sampler sampler = Sampler.Builder.forConfig(properties); assertInstanceOf(PrioritySampler.class, sampler); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .withTag("tag", "foo") - .withResourceName("resource") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .withTag("tag", "foo") + .withResourceName("resource") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span); - Map propagationMap = span.spanContext().getPropagationTags().createTagMap(); + Map propagationMap = + span.spanContext().getPropagationTags().createTagMap(); String decisionMaker = propagationMap.get("_dd.p.dm"); String expectedDmStr = expectedDecisionMaker == null ? null : "-" + (int) expectedDecisionMaker; @@ -258,15 +256,13 @@ void tagTypesTest(String scenario, String tagPattern, Object tagValue, boolean e try { PrioritySampler sampler = (PrioritySampler) Sampler.Builder.forConfig(properties); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withResourceName("resource") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withResourceName("resource") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); span.setTag("testTag", tagValue); sampler.setSamplingPriority(span); @@ -325,22 +321,18 @@ void preferJsonRulesOverOtherDeprecatedOnes() { properties.setProperty(TRACE_RATE_LIMIT, "1"); Sampler sampler = Sampler.Builder.forConfig(properties); - DDSpan span1 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); - DDSpan span2 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span1 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); + DDSpan span2 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span1); // Span 2 should be rate limited if there isn't a >1 sec delay between these 2 lines @@ -369,22 +361,18 @@ void rateLimitIsSetForRateLimitedSpans() { properties.setProperty(TRACE_RATE_LIMIT, "1"); Sampler sampler = Sampler.Builder.forConfig(properties); - DDSpan span1 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); - DDSpan span2 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span1 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); + DDSpan span2 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span1); // Span 2 should be rate limited if there isn't a >1 sec delay between these 2 lines @@ -413,22 +401,18 @@ void rateLimitIsSetForRateLimitedSpansMatchedOnDifferentRules() { properties.setProperty(TRACE_RATE_LIMIT, "1"); Sampler sampler = Sampler.Builder.forConfig(properties); - DDSpan span1 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); - DDSpan span2 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("foo") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span1 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); + DDSpan span2 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("foo") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span1); // Span 2 should be rate limited if there isn't a >1 sec delay between these 2 lines diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SamplerTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SamplerTest.java index e4658e7046b..d36c03aeaea 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SamplerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SamplerTest.java @@ -152,7 +152,8 @@ void forcePrioritySamplerRespectedWhenOtlpEnabledAndPrioritySamplingForcedDrop() void spansBuiltWithOtlpEnabledAndPrioritySamplingDisabledHaveNonUnsetSamplingPriority() { Config config = Config.get(); Sampler sampler = Sampler.Builder.forConfig(config, null); - CoreTracer tracer = CoreTracer.builder().writer(new ListWriter()).sampler(sampler).build(); + CoreTracer tracer = + CoreTracer.builder().writer(new ListWriter()).sampler(sampler).build(); try { DDSpan span = (DDSpan) tracer.buildSpan("datadog", "test").start(); ((PrioritySampler) sampler).setSamplingPriority(span); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SingleSpanSamplerTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SingleSpanSamplerTest.java index 7d953341b2c..838a2f18d07 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SingleSpanSamplerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SingleSpanSamplerTest.java @@ -28,7 +28,8 @@ import org.tabletest.junit.TableTest; class SingleSpanSamplerTest extends DDCoreJavaSpecification { - @TempDir Path tempDir; + @TempDir + Path tempDir; @TableTest({ "scenario | rules ", @@ -74,14 +75,12 @@ void singleSpanSamplerSetSamplingPriority( SingleSpanSampler sampler = SingleSpanSampler.Builder.forConfig(Config.get(properties)); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); assertEquals(isFirstSampled, sampler.setSamplingPriority(span)); @@ -112,22 +111,18 @@ void parentChildScenariosWhenTraceDroppedButSpansKeptBySingleSpanSampler( SingleSpanSampler sampler = SingleSpanSampler.Builder.forConfig(Config.get(properties)); - DDSpan rootSpan = - (DDSpan) - tracer - .buildSpan("datadog", "web.request") - .withServiceName("webserver") - .ignoreActiveSpan() - .start(); - - DDSpan childSpan = - (DDSpan) - tracer - .buildSpan("datadog", "web.handler") - .withServiceName("webserver") - .asChildOf(rootSpan) - .ignoreActiveSpan() - .start(); + DDSpan rootSpan = (DDSpan) tracer + .buildSpan("datadog", "web.request") + .withServiceName("webserver") + .ignoreActiveSpan() + .start(); + + DDSpan childSpan = (DDSpan) tracer + .buildSpan("datadog", "web.handler") + .withServiceName("webserver") + .asChildOf(rootSpan) + .ignoreActiveSpan() + .start(); // set trace sampling priority to drop the trace rootSpan.setSamplingPriority(SAMPLER_DROP, DEFAULT); @@ -162,23 +157,19 @@ void singleSpanSamplerSetSamplingPriorityWithMaxPerSecondLimit( SingleSpanSampler sampler = SingleSpanSampler.Builder.forConfig(Config.get(properties)); - DDSpan span1 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); - - DDSpan span2 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span1 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); + + DDSpan span2 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); assertEquals(isFirstSampled, sampler.setSamplingPriority(span1)); assertEquals(isSecondSampled, sampler.setSamplingPriority(span2)); @@ -194,14 +185,12 @@ void loadRulesFromFile() throws Exception { SingleSpanSampler sampler = SingleSpanSampler.Builder.forConfig(Config.get(properties)); - DDSpan span1 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span1 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); assertTrue(sampler.setSamplingPriority(span1)); } @@ -220,24 +209,20 @@ void preferRulesInEnvVarOverRulesFromFile(String envVarRules, String fileRules, SingleSpanSampler sampler = SingleSpanSampler.Builder.forConfig(Config.get(properties)); - DDSpan span1 = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span1 = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); assertEquals(matched, sampler.setSamplingPriority(span1)); } @Test void throwNpeWhenPassedListOfRulesIsNull() { - NullPointerException exception = - assertThrows( - NullPointerException.class, - () -> new SingleSpanSampler.RuleBasedSingleSpanSampler(null)); + NullPointerException exception = assertThrows( + NullPointerException.class, () -> new SingleSpanSampler.RuleBasedSingleSpanSampler(null)); assertEquals("SpanSamplingRules can't be null.", exception.getMessage()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesFileTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesFileTest.java index 49941602be7..ac617c64204 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesFileTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesFileTest.java @@ -8,7 +8,8 @@ class SpanSamplingRulesFileTest extends SpanSamplingRulesTest { - @TempDir Path tempDir; + @TempDir + Path tempDir; String createRulesFile(String rules) throws IOException { Path tempFile = tempDir.resolve("single-span-sampling-rules.json"); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesTest.java index 021ab31171b..255d6f37559 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/SpanSamplingRulesTest.java @@ -25,28 +25,26 @@ void deserializeEmptyListOfSpanSamplingRulesFromJson() { @Test void deserializeSpanSamplingRulesFromJson() { - SpanSamplingRules result = - deserializeRules( - "[\n" - + " {\"service\": \"service-name\", \"name\": \"operation-name\", \"resource\": \"resource-name\", \"tags\":\n" - + " {\"tag-name1\": \"tag-pattern1\",\n" - + " \"tag-name2\": \"tag-pattern2\"},\n" - + " \"sample_rate\": 0.0, \"max_per_second\": 10.0},\n" - + " {},\n" - + " {\"service\": \"\", \"name\": \"\", \"resource\": \"\", \"tags\": {}},\n" - + " {\"service\": null, \"name\": null, \"resource\": null, \"tags\": null, \"sample_rate\": null, \"max_per_second\": null},\n" - + "\n" - + " {\"sample_rate\": 0.25},\n" - + " {\"sample_rate\": 0.5},\n" - + " {\"sample_rate\": 0.75},\n" - + " {\"sample_rate\": 1},\n" - + "\n" - + " {\"max_per_second\": 0.2},\n" - + " {\"max_per_second\": 1.0},\n" - + " {\"max_per_second\": 10},\n" - + " {\"max_per_second\": 10.123},\n" - + " {\"max_per_second\": 10000}\n" - + "]"); + SpanSamplingRules result = deserializeRules("[\n" + + " {\"service\": \"service-name\", \"name\": \"operation-name\", \"resource\": \"resource-name\", \"tags\":\n" + + " {\"tag-name1\": \"tag-pattern1\",\n" + + " \"tag-name2\": \"tag-pattern2\"},\n" + + " \"sample_rate\": 0.0, \"max_per_second\": 10.0},\n" + + " {},\n" + + " {\"service\": \"\", \"name\": \"\", \"resource\": \"\", \"tags\": {}},\n" + + " {\"service\": null, \"name\": null, \"resource\": null, \"tags\": null, \"sample_rate\": null, \"max_per_second\": null},\n" + + "\n" + + " {\"sample_rate\": 0.25},\n" + + " {\"sample_rate\": 0.5},\n" + + " {\"sample_rate\": 0.75},\n" + + " {\"sample_rate\": 1},\n" + + "\n" + + " {\"max_per_second\": 0.2},\n" + + " {\"max_per_second\": 1.0},\n" + + " {\"max_per_second\": 10},\n" + + " {\"max_per_second\": 10.123},\n" + + " {\"max_per_second\": 10000}\n" + + "]"); List rules = result.getRules(); int ruleIndex = 0; @@ -126,10 +124,8 @@ void skipSpanSamplingRulesWithInvalidSampleRateValues(String rate) { "\"\" | '\"\"' " }) void skipSpanSamplingRulesWithInvalidMaxPerSecondValues(String limit) { - String json = - "[{\"service\": \"usersvc\", \"name\": \"healthcheck\", \"max_per_second\": " - + limit - + "}]"; + String json = "[{\"service\": \"usersvc\", \"name\": \"healthcheck\", \"max_per_second\": " + + limit + "}]"; SpanSamplingRules result = deserializeRules(json); assertTrue(result.isEmpty()); @@ -161,12 +157,10 @@ void renderJsonRuleCorrectlyWhenToStringIsCalled() throws Exception { @Test void keepOnlyValidRulesWhenInvalidRulesArePresent() { - SpanSamplingRules rules = - SpanSamplingRules.deserialize( - "[\n" - + " {\"service\": \"usersvc\", \"name\": \"healthcheck\", \"sample_rate\": 0.5},\n" - + " {\"service\": \"usersvc\", \"name\": \"healthcheck2\", \"sample_rate\": 200}\n" - + "]"); + SpanSamplingRules rules = SpanSamplingRules.deserialize("[\n" + + " {\"service\": \"usersvc\", \"name\": \"healthcheck\", \"sample_rate\": 0.5},\n" + + " {\"service\": \"usersvc\", \"name\": \"healthcheck2\", \"sample_rate\": 200}\n" + + "]"); assertEquals(1, rules.getRules().size()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/common/sampling/TraceSamplingRulesTest.java b/dd-trace-core/src/test/java/datadog/trace/common/sampling/TraceSamplingRulesTest.java index f580b717bcf..bc9d1bdde68 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/sampling/TraceSamplingRulesTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/sampling/TraceSamplingRulesTest.java @@ -21,23 +21,21 @@ void deserializeEmptyListOfTraceSamplingRulesFromJson() { @Test void deserializeTraceSamplingRulesFromJson() { - List rules = - TraceSamplingRules.deserialize( - "[\n" - + " {\"service\": \"service-name\", \"name\": \"operation-name\", \"resource\": \"resource-name\", \"tags\":\n" - + " {\"tag-name1\": \"tag-pattern1\",\n" - + " \"tag-name2\": \"tag-pattern2\"},\n" - + " \"sample_rate\": 0.0},\n" - + " {},\n" - + " {\"service\": \"\", \"name\": \"\", \"resource\": \"\", \"tags\": {}},\n" - + " {\"service\": null, \"name\": null, \"resource\": null, \"tags\": null, \"sample_rate\": null},\n" - + "\n" - + " {\"sample_rate\": 0.25},\n" - + " {\"sample_rate\": 0.5},\n" - + " {\"sample_rate\": 0.75},\n" - + " {\"sample_rate\": 1}\n" - + "]") - .getRules(); + List rules = TraceSamplingRules.deserialize("[\n" + + " {\"service\": \"service-name\", \"name\": \"operation-name\", \"resource\": \"resource-name\", \"tags\":\n" + + " {\"tag-name1\": \"tag-pattern1\",\n" + + " \"tag-name2\": \"tag-pattern2\"},\n" + + " \"sample_rate\": 0.0},\n" + + " {},\n" + + " {\"service\": \"\", \"name\": \"\", \"resource\": \"\", \"tags\": {}},\n" + + " {\"service\": null, \"name\": null, \"resource\": null, \"tags\": null, \"sample_rate\": null},\n" + + "\n" + + " {\"sample_rate\": 0.25},\n" + + " {\"sample_rate\": 0.5},\n" + + " {\"sample_rate\": 0.75},\n" + + " {\"sample_rate\": 1}\n" + + "]") + .getRules(); int ruleIndex = 0; assertEquals(8, rules.size()); @@ -125,12 +123,10 @@ void renderJsonRuleCorrectlyWhenToStringIsCalled() throws Exception { @Test void keepOnlyValidRulesWhenInvalidRulesArePresent() { - TraceSamplingRules rules = - TraceSamplingRules.deserialize( - "[\n" - + " {\"service\": \"usersvc\", \"name\": \"healthcheck\", \"sample_rate\": 0.5},\n" - + " {\"service\": \"usersvc\", \"name\": \"healthcheck\", \"sample_rate\": 200}\n" - + "]"); + TraceSamplingRules rules = TraceSamplingRules.deserialize("[\n" + + " {\"service\": \"usersvc\", \"name\": \"healthcheck\", \"sample_rate\": 0.5},\n" + + " {\"service\": \"usersvc\", \"name\": \"healthcheck\", \"sample_rate\": 200}\n" + + "]"); assertEquals(1, rules.getRules().size()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/CompositePayloadDispatcherTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/CompositePayloadDispatcherTest.java index 17eb060e81d..48401e6f190 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/CompositePayloadDispatcherTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/CompositePayloadDispatcherTest.java @@ -19,8 +19,11 @@ @ExtendWith(MockitoExtension.class) class CompositePayloadDispatcherTest { - @Mock PayloadDispatcher dispatcherA; - @Mock PayloadDispatcher dispatcherB; + @Mock + PayloadDispatcher dispatcherA; + + @Mock + PayloadDispatcher dispatcherB; @Test void testOnDroppedTrace() { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentApiTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentApiTest.java index 4e0abf5fbab..bed675a266b 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentApiTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentApiTest.java @@ -75,23 +75,15 @@ public class DDAgentApiTest extends DDCoreJavaSpecification { // --- Helper: create a minimal agent server responding 200 to PUT latestVersion --- static JavaTestHttpServer newAgent(String latestVersion) { - return JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.put( - latestVersion, - api -> { - if (!"application/msgpack".equals(api.getRequest().getContentType())) { - api.getResponse() - .status(400) - .send("wrong type: " + api.getRequest().getContentType()); - } else if (api.getRequest().getContentLength() <= 0) { - api.getResponse().status(400).send("no content"); - } else { - api.getResponse().status(200).send(); - } - }))); + return JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.put(latestVersion, api -> { + if (!"application/msgpack".equals(api.getRequest().getContentType())) { + api.getResponse().status(400).send("wrong type: " + api.getRequest().getContentType()); + } else if (api.getRequest().getContentLength() <= 0) { + api.getResponse().status(400).send("no content"); + } else { + api.getResponse().status(200).send(); + } + }))); } // --- Tests --- @@ -121,14 +113,8 @@ void testSendingAnEmptyListOfTracesReturnsNoErrors( @Test void testResponseBodyPropagatedInCaseOfNon200Response() { - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.put( - "v0.4/traces", - api -> api.getResponse().status(400).send("Test error")))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer(s -> s.handlers( + h -> h.put("v0.4/traces", api -> api.getResponse().status(400).send("Test error")))); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; Payload payload = prepareTraces("v0.4/traces", emptyList()); @@ -144,14 +130,10 @@ void testResponseBodyPropagatedInCaseOfNon200Response() { @Test void testNon200Response() { - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> { - h.put("v0.4/traces", api -> api.getResponse().status(404).send()); - h.put("v0.3/traces", api -> api.getResponse().status(404).send()); - })); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer(s -> s.handlers(h -> { + h.put("v0.4/traces", api -> api.getResponse().status(404).send()); + h.put("v0.3/traces", api -> api.getResponse().status(404).send()); + })); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; Payload payload = prepareTraces("v0.3/traces", emptyList()); @@ -169,9 +151,8 @@ void testNon200Response() { void testContentIsSentAsMsgpackEmptyTraces() throws IOException { String agentVersion = "v0.3/traces"; List> traces = emptyList(); - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer( + s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; Payload payload = prepareTraces(agentVersion, traces); @@ -204,20 +185,18 @@ void testContentIsSentAsMsgpackEmptyTraces() throws IOException { @Test void testContentIsSentAsMsgpackServiceSpan() throws IOException { String agentVersion = "v0.4/traces"; - DDSpan span = - buildSpan( - 1L, - "service.name", - "my-service", - PropagationTags.factory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.usr=123")); + DDSpan span = buildSpan( + 1L, + "service.name", + "my-service", + PropagationTags.factory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.usr=123")); span.finish(); setDurationNano(span, 10L); List> traces = singletonList(singletonList(span)); - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer( + s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; Payload payload = prepareTraces(agentVersion, traces); @@ -281,20 +260,18 @@ void testContentIsSentAsMsgpackServiceSpan() throws IOException { @Test void testContentIsSentAsMsgpackResourceSpan() throws IOException { String agentVersion = "v0.4/traces"; - DDSpan span = - buildSpan( - 100L, - "resource.name", - "my-resource", - PropagationTags.factory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.usr=123")); + DDSpan span = buildSpan( + 100L, + "resource.name", + "my-resource", + PropagationTags.factory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.usr=123")); span.finish(); setDurationNano(span, 10L); List> traces = singletonList(singletonList(span)); - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer( + s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; Payload payload = prepareTraces(agentVersion, traces); @@ -366,16 +343,10 @@ void testApiResponseListenersSee200Responses(String agentVersion) { (endpoint, responseJson) -> agentResponse.set(responseJson); JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.put( - agentVersion, - api -> { - int status = api.getRequest().getContentLength() > 0 ? 200 : 500; - api.getResponse().status(status).send("{\"hello\":{}}"); - }))); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.put(agentVersion, api -> { + int status = api.getRequest().getContentLength() > 0 ? 200 : 500; + api.getResponse().status(status).send("{\"hello\":{}}"); + }))); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; client.addResponseListener(responseListener); @@ -410,16 +381,10 @@ void testApiResponseListenersSee200Responses(String agentVersion) { @Test void testApiDowngradesToV3IfV04NotAvailable() { JavaTestHttpServer v3Agent = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.put( - "v0.3/traces", - api -> { - int status = api.getRequest().getContentLength() > 0 ? 200 : 500; - api.getResponse().status(status).send(); - }))); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.put("v0.3/traces", api -> { + int status = api.getRequest().getContentLength() > 0 ? 200 : 500; + api.getResponse().status(status).send(); + }))); try { DDAgentApi client = createAgentApi(v3Agent.getAddress().toString()).api; Payload payload = prepareTraces("v0.4/traces", emptyList()); @@ -439,31 +404,23 @@ void testApiDowngradesToV3IfV04NotAvailable() { }) void testApiDowngradesToV3IfTimeoutExceeded( String endpointVersion, int delayTrace, boolean badPort) { - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> { - h.put( - "v0.3/traces", - api -> { - int status = api.getRequest().getContentLength() > 0 ? 200 : 500; - api.getResponse().status(status).send(); - }); - h.put( - "v0.4/traces", - api -> { - if (delayTrace > 0) { - try { - Thread.sleep(delayTrace); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - int status = api.getRequest().getContentLength() > 0 ? 200 : 500; - api.getResponse().status(status).send(); - }); - })); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer(s -> s.handlers(h -> { + h.put("v0.3/traces", api -> { + int status = api.getRequest().getContentLength() > 0 ? 200 : 500; + api.getResponse().status(status).send(); + }); + h.put("v0.4/traces", api -> { + if (delayTrace > 0) { + try { + Thread.sleep(delayTrace); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + int status = api.getRequest().getContentLength() > 0 ? 200 : 500; + api.getResponse().status(status).send(); + }); + })); try { int port = badPort ? 999 : agent.getAddress().getPort(); String url = "http://" + agent.getAddress().getHost() + ":" + port; @@ -502,16 +459,10 @@ void testVerifyContentLength(String agentVersion, long expectedLength, int trace List> traces = generateEmptyTraces(traceCount); AtomicLong receivedContentLength = new AtomicLong(); JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.put( - agentVersion, - api -> { - receivedContentLength.set(api.getRequest().getContentLength()); - api.getResponse().status(200).send(); - }))); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.put(agentVersion, api -> { + receivedContentLength.set(api.getRequest().getContentLength()); + api.getResponse().status(200).send(); + }))); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; Payload payload = prepareTraces(agentVersion, traces); @@ -542,9 +493,8 @@ void testEmbeddedHttpClientRejectsAsyncRequests() throws Exception { @Test void testMetaStructSupportOnTheEncodedSpans() throws IOException { String agentVersion = "v0.4/traces"; - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer( + s -> s.handlers(h -> h.put(agentVersion, api -> api.getResponse().send()))); try { DDAgentApi client = createAgentApi(agent.getAddress().toString()).api; DDSpan span = buildSpan(1L, "fakeType", Collections.emptyMap()); @@ -581,10 +531,8 @@ void testDatadogClientComputedStatsHeaderSetWhenEitherStatsPipelineIsEnabled( datadog.trace.test.junit.utils.config.WithConfigExtension.injectSysConfig( OtlpConfig.OTEL_TRACES_SPAN_METRICS_ENABLED, String.valueOf(otlpSpanMetrics)); - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - s -> - s.handlers(h -> h.put("v0.4/traces", api -> api.getResponse().status(200).send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer(s -> s.handlers( + h -> h.put("v0.4/traces", api -> api.getResponse().status(200).send()))); try { HttpUrl agentUrl = HttpUrl.get(agent.getAddress().toString()); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterCombinedTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterCombinedTest.java index ae9741fe827..da1fc109783 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterCombinedTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterCombinedTest.java @@ -96,13 +96,12 @@ List createMinimalTrace() { @Test void noInteractionsBecauseOfInitialFlush() { DDAgentApi api = Mockito.mock(DDAgentApi.class); - DDAgentWriter writer = - DDAgentWriter.builder() - .agentApi(api) - .traceBufferSize(8) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .agentApi(api) + .traceBufferSize(8) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .build(); writer.start(); writer.flush(); @@ -122,14 +121,13 @@ void noInteractionsBecauseOfInitialFlush() { void testHappyPath(String agentVersion) { DDAgentApi api = mock(DDAgentApi.class); DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .traceBufferSize(1024) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .traceBufferSize(1024) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .build(); writer.start(); DDSpan span = (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start(); List trace = Collections.singletonList(span); @@ -163,14 +161,13 @@ void testFloodOfTraces(String agentVersion) { DDAgentApi api = mock(DDAgentApi.class); DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .traceBufferSize(bufferSize) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .traceBufferSize(bufferSize) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .build(); writer.start(); DDSpan span = (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start(); List trace = Collections.singletonList(span); @@ -202,14 +199,13 @@ void testFlushByTime(String agentVersion) throws Exception { HealthMetrics healthMetrics = mock(HealthMetrics.class); DDAgentApi api = mock(DDAgentApi.class); DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .healthMetrics(healthMetrics) - .monitoring(monitoring) - .flushIntervalMilliseconds(1000) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .healthMetrics(healthMetrics) + .monitoring(monitoring) + .flushIntervalMilliseconds(1000) + .build(); writer.start(); DDSpan span = (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start(); List trace = Collections.nCopies(10, span); @@ -219,11 +215,10 @@ void testFlushByTime(String agentVersion) throws Exception { .thenReturn(RemoteApi.Response.success(200)); // stub onSend to arrive at phaser - doAnswer( - invocation -> { - phaser.arrive(); - return null; - }) + doAnswer(invocation -> { + phaser.arrive(); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); @@ -256,15 +251,14 @@ void testDefaultBufferSizeFor(String agentVersion) { List minimalTrace = createMinimalTrace(); DDAgentApi api = mock(DDAgentApi.class); DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .traceBufferSize(AGENT_WRITER_BUFFER_SIZE) - .prioritization(ENSURE_TRACE) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .traceBufferSize(AGENT_WRITER_BUFFER_SIZE) + .prioritization(ENSURE_TRACE) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .build(); writer.start(); TraceMapper mapper = @@ -300,13 +294,12 @@ void checkThatThereAreNoInteractionsAfterClose() { HealthMetrics healthMetrics = mock(HealthMetrics.class); DDAgentApi api = mock(DDAgentApi.class); DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .healthMetrics(healthMetrics) - .monitoring(monitoring) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .healthMetrics(healthMetrics) + .monitoring(monitoring) + .build(); writer.start(); // Clear invocations from start() (Spock only counts interactions in when: blocks) clearInvocations(healthMetrics, api, discovery); @@ -336,24 +329,20 @@ void monitorHappyPath(String agentVersion) { List minimalTrace = createMinimalTrace(); // DQH -- need to set-up a dummy agent for the final send callback to work - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - h -> h.put(agentVersion, api -> api.getResponse().status(200).send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer(server -> server.handlers( + h -> h.put(agentVersion, api -> api.getResponse().status(200).send()))); try { HttpUrl agentUrl = HttpUrl.get(agent.getAddress()); okhttp3.OkHttpClient client = OkHttpUtils.buildHttpClient(agentUrl, 1000); DDAgentFeaturesDiscovery discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, V0_5, true, false); DDAgentApi api = new DDAgentApi(client, agentUrl, discovery, monitoring, true); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .build(); // start writer.start(); @@ -371,11 +360,9 @@ void monitorHappyPath(String agentVersion) { .onSend( anyInt(), anyInt(), - argThat( - response -> - response.success() - && response.status().isPresent() - && response.status().getAsInt() == 200)); + argThat(response -> response.success() + && response.status().isPresent() + && response.status().getAsInt() == 200)); writer.close(); @@ -398,35 +385,28 @@ void monitorAgentReturnsError(String agentVersion) { // DQH -- need to set-up a dummy agent for the final send callback to work final boolean[] first = {true}; JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - h -> - h.put( - agentVersion, - api -> { - // DQH - DDApi sniffs for end point existence, so respond with 200 the - // first time - if (first[0]) { - api.getResponse().status(200).send(); - first[0] = false; - } else { - api.getResponse().status(500).send(); - } - }))); + JavaTestHttpServer.httpServer(server -> server.handlers(h -> h.put(agentVersion, api -> { + // DQH - DDApi sniffs for end point existence, so respond with 200 the + // first time + if (first[0]) { + api.getResponse().status(200).send(); + first[0] = false; + } else { + api.getResponse().status(500).send(); + } + }))); try { HttpUrl agentUrl = HttpUrl.get(agent.getAddress()); okhttp3.OkHttpClient client = OkHttpUtils.buildHttpClient(agentUrl, 1000); DDAgentFeaturesDiscovery discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, V0_5, true, false); DDAgentApi api = new DDAgentApi(client, agentUrl, discovery, monitoring, true); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .build(); // start writer.start(); @@ -444,11 +424,9 @@ void monitorAgentReturnsError(String agentVersion) { .onFailedSend( anyInt(), anyInt(), - argThat( - response -> - !response.success() - && response.status().isPresent() - && response.status().getAsInt() == 500)); + argThat(response -> !response.success() + && response.status().isPresent() + && response.status().getAsInt() == 500)); writer.close(); @@ -474,13 +452,12 @@ void unreachableAgentTest(String agentVersion) { when(api.sendSerializedTraces(any())) .thenReturn(RemoteApi.Response.failed(new IOException("comm error"))); - DDAgentWriter writer = - DDAgentWriter.builder() - .featureDiscovery(discovery) - .agentApi(api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .featureDiscovery(discovery) + .agentApi(api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .build(); // start writer.start(); @@ -520,69 +497,57 @@ void slowResponseTest(String agentVersion) throws Exception { // Need to set-up a dummy agent for the final send callback to work JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - h -> - h.put( - agentVersion, - api -> { - responseSemaphore.acquire(); - try { - api.getResponse().status(200).send(); - } finally { - responseSemaphore.release(); - } - }))); + JavaTestHttpServer.httpServer(server -> server.handlers(h -> h.put(agentVersion, api -> { + responseSemaphore.acquire(); + try { + api.getResponse().status(200).send(); + } finally { + responseSemaphore.release(); + } + }))); // This test focuses just on failed publish, so not verifying every callback HealthMetrics healthMetrics = mock(HealthMetrics.class); - doAnswer( - invocation -> { - numPublished.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numPublished.incrementAndGet(); + return null; + }) .when(healthMetrics) .onPublish(any(), anyInt()); - doAnswer( - invocation -> { - numFailedPublish.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFailedPublish.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFailedPublish(anyInt(), anyInt()); - doAnswer( - invocation -> { - numFlushes.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFlushes.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFlush(any(Boolean.class)); - doAnswer( - invocation -> { - numRequests.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numRequests.incrementAndGet(); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); - doAnswer( - invocation -> { - numFailedRequests.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFailedRequests.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFailedSend(anyInt(), anyInt(), any()); int bufferSize = 16; List minimalTrace = createMinimalTrace(); - DDAgentWriter writer = - DDAgentWriter.builder() - .traceAgentProtocolVersion(V0_5) - .traceAgentPort(agent.getAddress().getPort()) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .traceBufferSize(bufferSize) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .traceAgentProtocolVersion(V0_5) + .traceAgentPort(agent.getAddress().getPort()) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .traceBufferSize(bufferSize) + .build(); writer.start(); // gate responses @@ -647,53 +612,45 @@ void multiThreaded(String agentVersion) throws Exception { List minimalTrace = createMinimalTrace(); // Need to set-up a dummy agent for the final send callback to work - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - h -> h.put(agentVersion, api -> api.getResponse().status(200).send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer(server -> server.handlers( + h -> h.put(agentVersion, api -> api.getResponse().status(200).send()))); // This test focuses just on failed publish, so not verifying every callback HealthMetrics healthMetrics = mock(HealthMetrics.class); - doAnswer( - invocation -> { - numPublished.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numPublished.incrementAndGet(); + return null; + }) .when(healthMetrics) .onPublish(any(), anyInt()); - doAnswer( - invocation -> { - numFailedPublish.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFailedPublish.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFailedPublish(anyInt(), anyInt()); - doAnswer( - invocation -> { - int repCount = invocation.getArgument(0); - numRepSent.addAndGet(repCount); - return null; - }) + doAnswer(invocation -> { + int repCount = invocation.getArgument(0); + numRepSent.addAndGet(repCount); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); - DDAgentWriter writer = - DDAgentWriter.builder() - .traceAgentProtocolVersion(V0_5) - .traceAgentPort(agent.getAddress().getPort()) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .traceAgentProtocolVersion(V0_5) + .traceAgentPort(agent.getAddress().getPort()) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .build(); writer.start(); try { - Runnable producer = - () -> { - for (int i = 1; i <= 100; i++) { - writer.write(minimalTrace); - } - }; + Runnable producer = () -> { + for (int i = 1; i <= 100; i++) { + writer.write(minimalTrace); + } + }; Thread t1 = new Thread(producer); t1.start(); @@ -737,36 +694,30 @@ void statsdSuccess(String agentVersion) { List minimalTrace = createMinimalTrace(); // Need to set-up a dummy agent for the final send callback to work - JavaTestHttpServer agent = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - h -> h.put(agentVersion, api -> api.getResponse().status(200).send()))); + JavaTestHttpServer agent = JavaTestHttpServer.httpServer(server -> server.handlers( + h -> h.put(agentVersion, api -> api.getResponse().status(200).send()))); HealthMetrics healthMetrics = mock(HealthMetrics.class); - doAnswer( - invocation -> { - numTracesAccepted.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numTracesAccepted.incrementAndGet(); + return null; + }) .when(healthMetrics) .onPublish(any(), anyInt()); - doAnswer( - invocation -> { - numRequests.incrementAndGet(); - numResponses.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numRequests.incrementAndGet(); + numResponses.incrementAndGet(); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); - DDAgentWriter writer = - DDAgentWriter.builder() - .agentHost(agent.getAddress().getHost()) - .traceAgentProtocolVersion(V0_5) - .traceAgentPort(agent.getAddress().getPort()) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .agentHost(agent.getAddress().getHost()) + .traceAgentProtocolVersion(V0_5) + .traceAgentPort(agent.getAddress().getPort()) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .build(); writer.start(); try { @@ -793,22 +744,20 @@ void statsdCommFailure() throws Exception { CountDownLatch latch = new CountDownLatch(2); StatsDClient statsd = mock(StatsDClient.class); TracerHealthMetrics healthMetrics = new TracerHealthMetrics(statsd, 100, TimeUnit.MILLISECONDS); - DDAgentWriter writer = - DDAgentWriter.builder() - .traceAgentProtocolVersion(V0_5) - .agentApi(api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .build(); + DDAgentWriter writer = DDAgentWriter.builder() + .traceAgentProtocolVersion(V0_5) + .agentApi(api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .build(); healthMetrics.start(); writer.start(); // stub statsd.count for latch coordination - called with varargs String... tags - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(statsd) .count(anyString(), anyLong()); @@ -826,10 +775,8 @@ void statsdCommFailure() throws Exception { static int calculateSize(List trace, TraceMapper mapper) { AtomicInteger size = new AtomicInteger(); - MsgPackWriter packer = - new MsgPackWriter( - new FlushingBuffer( - 1024, (messageCount, buffer) -> size.set(buffer.limit() - buffer.position()))); + MsgPackWriter packer = new MsgPackWriter(new FlushingBuffer( + 1024, (messageCount, buffer) -> size.set(buffer.limit() - buffer.position()))); packer.format(trace, mapper); packer.flush(); return size.get(); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterTest.java index ec781ff4131..065f75e1ee9 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDAgentWriterTest.java @@ -117,9 +117,8 @@ void testWriterFlushClosed() { @Test void testWriterWritePublishSucceeds() { - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); // publish succeeds when(worker.publish(any(), anyInt(), eq(trace))).thenReturn(ENQUEUED_FOR_SERIALIZATION); @@ -133,9 +132,8 @@ void testWriterWritePublishSucceeds() { @Test void testWriterWritePublishForSingleSpanSampling() { - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); // publish succeeds (single span sampling) when(worker.publish(any(), anyInt(), eq(trace))).thenReturn(ENQUEUED_FOR_SINGLE_SPAN_SAMPLING); @@ -153,9 +151,8 @@ void testWriterWritePublishForSingleSpanSampling() { "dropped by policy | DROPPED_BY_POLICY " }) void testWriterWritePublishFails(PublishResult publishResult) { - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); // publish fails when(worker.publish(any(), anyInt(), eq(trace))).thenReturn(publishResult); @@ -181,9 +178,8 @@ void testEmptyTracesShouldBeReportedAsFailures() { void testWriterWriteClosed() { writer.close(); clearInvocations(monitor, worker, discovery, api); - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); writer.write(trace); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterCombinedTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterCombinedTest.java index c53286cb106..6fb11edd46e 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterCombinedTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterCombinedTest.java @@ -49,18 +49,17 @@ @Timeout(value = 10, unit = TimeUnit.SECONDS) class DDIntakeWriterCombinedTest extends DDCoreJavaSpecification { - private static final CiVisibilityWellKnownTags wellKnownTags = - new CiVisibilityWellKnownTags( - "my-runtime-id", - "my-env", - "my-language", - "my-runtime-name", - "my-runtime-version", - "my-runtime-vendor", - "my-os-arch", - "my-os-platform", - "my-os-version", - "false"); + private static final CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( + "my-runtime-id", + "my-env", + "my-language", + "my-runtime-name", + "my-runtime-version", + "my-runtime-vendor", + "my-os-arch", + "my-os-platform", + "my-os-version", + "false"); MonitoringImpl monitoring = new MonitoringImpl(StatsDClient.NO_OP, 1, TimeUnit.SECONDS); Phaser phaser = new Phaser(); @@ -92,14 +91,13 @@ List createMinimalTrace() { @Test void noInteractionsBecauseOfInitialFlush() { DDIntakeApi api = mock(DDIntakeApi.class); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(TrackType.NOOP, api) - .traceBufferSize(8) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(TrackType.NOOP, api) + .traceBufferSize(8) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .alwaysFlush(false) + .build(); writer.start(); // Clear setup-time interactions (e.g. isCompressionEnabled() called during build()) clearInvocations(api); @@ -116,14 +114,13 @@ void noInteractionsBecauseOfInitialFlush() { void testHappyPath() { TrackType trackType = TrackType.CITESTCYCLE; DDIntakeApi api = mock(DDIntakeApi.class); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .traceBufferSize(1024) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .traceBufferSize(1024) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .alwaysFlush(false) + .build(); writer.start(); // Clear setup-time interactions (e.g. isCompressionEnabled() called during build()) clearInvocations(api); @@ -151,14 +148,13 @@ void testFloodOfTraces() { int traceCount = 100; TrackType trackType = TrackType.CITESTCYCLE; DDIntakeApi api = mock(DDIntakeApi.class); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .traceBufferSize(1024) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .traceBufferSize(1024) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .alwaysFlush(false) + .build(); writer.start(); // Clear setup-time interactions (e.g. isCompressionEnabled() called during build()) clearInvocations(api); @@ -186,14 +182,13 @@ void testFlushByTime() throws Exception { TrackType trackType = TrackType.CITESTCYCLE; HealthMetrics healthMetrics = mock(HealthMetrics.class); DDIntakeApi api = mock(DDIntakeApi.class); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .healthMetrics(healthMetrics) - .monitoring(monitoring) - .flushIntervalMilliseconds(1000) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .healthMetrics(healthMetrics) + .monitoring(monitoring) + .flushIntervalMilliseconds(1000) + .alwaysFlush(false) + .build(); writer.start(); // Clear setup-time interactions (e.g. isCompressionEnabled() called during build(), onStart // from start()) @@ -206,11 +201,10 @@ void testFlushByTime() throws Exception { .sendSerializedTraces(argThat(payload -> payload.traceCount() == 5)); // stub onSend to arrive at phaser - doAnswer( - invocation -> { - phaser.arrive(); - return null; - }) + doAnswer(invocation -> { + phaser.arrive(); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); @@ -234,16 +228,15 @@ void testDefaultBufferSizeForCitestcycle() { TrackType trackType = TrackType.CITESTCYCLE; List minimalTrace = createMinimalTrace(); DDIntakeApi api = mock(DDIntakeApi.class); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .wellKnownTags(wellKnownTags) - .traceBufferSize(1024) - .prioritization(ENSURE_TRACE) - .monitoring(monitoring) - .flushIntervalMilliseconds(-1) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .wellKnownTags(wellKnownTags) + .traceBufferSize(1024) + .prioritization(ENSURE_TRACE) + .monitoring(monitoring) + .flushIntervalMilliseconds(-1) + .alwaysFlush(false) + .build(); writer.start(); // Clear setup-time interactions (e.g. isCompressionEnabled() called during build()) clearInvocations(api); @@ -283,13 +276,12 @@ void checkThatThereAreNoInteractionsAfterClose() { TrackType trackType = TrackType.CITESTCYCLE; DDIntakeApi api = mock(DDIntakeApi.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .healthMetrics(healthMetrics) - .monitoring(monitoring) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .healthMetrics(healthMetrics) + .monitoring(monitoring) + .alwaysFlush(false) + .build(); writer.start(); // Clear setup-time interactions (e.g. isCompressionEnabled() called during build(), onStart // from start()) @@ -317,27 +309,23 @@ void monitorHappyPath() { List minimalTrace = createMinimalTrace(); String path = buildIntakePath(trackType, apiVersion); - JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - server -> - server.handlers(h -> h.post(path, api -> api.getResponse().status(200).send()))); + JavaTestHttpServer intake = JavaTestHttpServer.httpServer(server -> + server.handlers(h -> h.post(path, api -> api.getResponse().status(200).send()))); try { HttpUrl hostUrl = HttpUrl.get(intake.getAddress()); OkHttpClient httpClient = OkHttpUtils.buildHttpClient(hostUrl, 1000); - DDIntakeApi api = - DDIntakeApi.builder() - .hostUrl(hostUrl) - .httpClient(httpClient) - .apiKey("my-api-key") - .trackType(trackType) - .build(); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .healthMetrics(healthMetrics) - .monitoring(monitoring) - .alwaysFlush(false) - .build(); + DDIntakeApi api = DDIntakeApi.builder() + .hostUrl(hostUrl) + .httpClient(httpClient) + .apiKey("my-api-key") + .trackType(trackType) + .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .healthMetrics(healthMetrics) + .monitoring(monitoring) + .alwaysFlush(false) + .build(); // start writer.start(); @@ -355,11 +343,9 @@ void monitorHappyPath() { .onSend( anyInt(), anyInt(), - argThat( - response -> - response.success() - && response.status().isPresent() - && response.status().getAsInt() == 200)); + argThat(response -> response.success() + && response.status().isPresent() + && response.status().getAsInt() == 200)); writer.close(); @@ -377,27 +363,23 @@ void monitorIntakeReturnsError() { List minimalTrace = createMinimalTrace(); String path = buildIntakePath(trackType, apiVersion); - JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - server -> - server.handlers(h -> h.post(path, api -> api.getResponse().status(500).send()))); + JavaTestHttpServer intake = JavaTestHttpServer.httpServer(server -> + server.handlers(h -> h.post(path, api -> api.getResponse().status(500).send()))); try { HttpUrl hostUrl = HttpUrl.get(intake.getAddress()); okhttp3.OkHttpClient httpClient = OkHttpUtils.buildHttpClient(hostUrl, 1000); - DDIntakeApi api = - DDIntakeApi.builder() - .hostUrl(hostUrl) - .httpClient(httpClient) - .apiKey("my-api-key") - .trackType(trackType) - .build(); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .healthMetrics(healthMetrics) - .monitoring(monitoring) - .alwaysFlush(false) - .build(); + DDIntakeApi api = DDIntakeApi.builder() + .hostUrl(hostUrl) + .httpClient(httpClient) + .apiKey("my-api-key") + .trackType(trackType) + .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .healthMetrics(healthMetrics) + .monitoring(monitoring) + .alwaysFlush(false) + .build(); // start writer.start(); @@ -415,11 +397,9 @@ void monitorIntakeReturnsError() { .onFailedSend( anyInt(), anyInt(), - argThat( - response -> - !response.success() - && response.status().isPresent() - && response.status().getAsInt() == 500)); + argThat(response -> !response.success() + && response.status().isPresent() + && response.status().getAsInt() == 500)); writer.close(); @@ -440,13 +420,12 @@ void unreachableIntakeTest() { .when(api) .sendSerializedTraces(any()); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .alwaysFlush(false) + .build(); // start writer.start(); @@ -486,75 +465,62 @@ void slowResponseTest() throws Exception { String path = buildIntakePath(trackType, apiVersion); JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - server -> - server.handlers( - h -> - h.post( - path, - api -> { - responseSemaphore.acquire(); - try { - api.getResponse().status(200).send(); - } finally { - responseSemaphore.release(); - } - }))); + JavaTestHttpServer.httpServer(server -> server.handlers(h -> h.post(path, api -> { + responseSemaphore.acquire(); + try { + api.getResponse().status(200).send(); + } finally { + responseSemaphore.release(); + } + }))); // This test focuses just on failed publish, so not verifying every callback HealthMetrics healthMetrics = mock(HealthMetrics.class); - doAnswer( - invocation -> { - numPublished.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numPublished.incrementAndGet(); + return null; + }) .when(healthMetrics) .onPublish(any(), anyInt()); - doAnswer( - invocation -> { - numFailedPublish.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFailedPublish.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFailedPublish(anyInt(), anyInt()); - doAnswer( - invocation -> { - numFlushes.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFlushes.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFlush(any(Boolean.class)); - doAnswer( - invocation -> { - numRequests.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numRequests.incrementAndGet(); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); - doAnswer( - invocation -> { - numFailedRequests.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFailedRequests.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFailedSend(anyInt(), anyInt(), any()); HttpUrl hostUrl = HttpUrl.get(intake.getAddress()); okhttp3.OkHttpClient httpClient = OkHttpUtils.buildHttpClient(hostUrl, 1000); - DDIntakeApi api = - DDIntakeApi.builder() - .hostUrl(hostUrl) - .httpClient(httpClient) - .apiKey("my-api-key") - .trackType(trackType) - .build(); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .healthMetrics(healthMetrics) - .traceBufferSize(bufferSize) - .alwaysFlush(false) - .build(); + DDIntakeApi api = DDIntakeApi.builder() + .hostUrl(hostUrl) + .httpClient(httpClient) + .apiKey("my-api-key") + .trackType(trackType) + .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .healthMetrics(healthMetrics) + .traceBufferSize(bufferSize) + .alwaysFlush(false) + .build(); writer.start(); // gate responses @@ -616,61 +582,53 @@ void multiThreaded() throws Exception { List minimalTrace = createMinimalTrace(); String path = buildIntakePath(trackType, apiVersion); - JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - server -> - server.handlers(h -> h.post(path, api -> api.getResponse().status(200).send()))); + JavaTestHttpServer intake = JavaTestHttpServer.httpServer(server -> + server.handlers(h -> h.post(path, api -> api.getResponse().status(200).send()))); // This test focuses just on failed publish, so not verifying every callback HealthMetrics healthMetrics = mock(HealthMetrics.class); - doAnswer( - invocation -> { - numPublished.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numPublished.incrementAndGet(); + return null; + }) .when(healthMetrics) .onPublish(any(), anyInt()); - doAnswer( - invocation -> { - numFailedPublish.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numFailedPublish.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFailedPublish(anyInt(), anyInt()); - doAnswer( - invocation -> { - int repCount = invocation.getArgument(0); - numRepSent.addAndGet(repCount); - return null; - }) + doAnswer(invocation -> { + int repCount = invocation.getArgument(0); + numRepSent.addAndGet(repCount); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); HttpUrl hostUrl = HttpUrl.get(intake.getAddress()); okhttp3.OkHttpClient httpClient = OkHttpUtils.buildHttpClient(hostUrl, 1000); - DDIntakeApi api = - DDIntakeApi.builder() - .hostUrl(hostUrl) - .httpClient(httpClient) - .apiKey("my-api-key") - .trackType(trackType) - .build(); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .alwaysFlush(false) - .build(); + DDIntakeApi api = DDIntakeApi.builder() + .hostUrl(hostUrl) + .httpClient(httpClient) + .apiKey("my-api-key") + .trackType(trackType) + .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .alwaysFlush(false) + .build(); writer.start(); try { - Runnable producer = - () -> { - for (int i = 1; i <= 100; i++) { - writer.write(minimalTrace); - } - }; + Runnable producer = () -> { + for (int i = 1; i <= 100; i++) { + writer.write(minimalTrace); + } + }; Thread t1 = new Thread(producer); t1.start(); @@ -711,44 +669,38 @@ void statsdSuccess() { List minimalTrace = createMinimalTrace(); String path = buildIntakePath(trackType, apiVersion); - JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - server -> - server.handlers(h -> h.post(path, api -> api.getResponse().status(200).send()))); + JavaTestHttpServer intake = JavaTestHttpServer.httpServer(server -> + server.handlers(h -> h.post(path, api -> api.getResponse().status(200).send()))); HealthMetrics healthMetrics = mock(HealthMetrics.class); - doAnswer( - invocation -> { - numTracesAccepted.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numTracesAccepted.incrementAndGet(); + return null; + }) .when(healthMetrics) .onPublish(any(), anyInt()); - doAnswer( - invocation -> { - numRequests.incrementAndGet(); - numResponses.incrementAndGet(); - return null; - }) + doAnswer(invocation -> { + numRequests.incrementAndGet(); + numResponses.incrementAndGet(); + return null; + }) .when(healthMetrics) .onSend(anyInt(), anyInt(), any()); HttpUrl hostUrl = HttpUrl.get(intake.getAddress()); okhttp3.OkHttpClient httpClient = OkHttpUtils.buildHttpClient(hostUrl, 1000); - DDIntakeApi api = - DDIntakeApi.builder() - .hostUrl(hostUrl) - .httpClient(httpClient) - .apiKey("my-api-key") - .trackType(trackType) - .build(); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .alwaysFlush(false) - .build(); + DDIntakeApi api = DDIntakeApi.builder() + .hostUrl(hostUrl) + .httpClient(httpClient) + .apiKey("my-api-key") + .trackType(trackType) + .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .alwaysFlush(false) + .build(); writer.start(); try { @@ -777,22 +729,20 @@ void statsdCommFailure() throws Exception { CountDownLatch latch = new CountDownLatch(2); StatsDClient statsd = mock(StatsDClient.class); TracerHealthMetrics healthMetrics = new TracerHealthMetrics(statsd, 100, TimeUnit.MILLISECONDS); - DDIntakeWriter writer = - DDIntakeWriter.builder() - .addTrack(trackType, api) - .monitoring(monitoring) - .healthMetrics(healthMetrics) - .alwaysFlush(false) - .build(); + DDIntakeWriter writer = DDIntakeWriter.builder() + .addTrack(trackType, api) + .monitoring(monitoring) + .healthMetrics(healthMetrics) + .alwaysFlush(false) + .build(); healthMetrics.start(); writer.start(); // Set up stubs with countDown BEFORE the action - doAnswer( - invocation -> { - latch.countDown(); - return null; - }) + doAnswer(invocation -> { + latch.countDown(); + return null; + }) .when(statsd) .count(anyString(), anyLong()); @@ -814,11 +764,9 @@ static String buildIntakePath(TrackType trackType, String apiVersion) { static int calculateSize(List trace, RemoteMapper mapper) { AtomicInteger size = new AtomicInteger(); - MsgPackWriter packer = - new MsgPackWriter( - new FlushingBuffer( - mapper.messageBufferSize(), - (messageCount, buffer) -> size.set(buffer.limit() - buffer.position()))); + MsgPackWriter packer = new MsgPackWriter(new FlushingBuffer( + mapper.messageBufferSize(), + (messageCount, buffer) -> size.set(buffer.limit() - buffer.position()))); packer.format(trace, mapper); packer.flush(); return size.get(); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterTest.java index 1a47599ee01..6aa0613dfda 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/DDIntakeWriterTest.java @@ -40,9 +40,8 @@ class DDIntakeWriterTest extends DDCoreJavaSpecification { DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); DDAgentApi api = mock(DDAgentApi.class); MonitoringImpl monitoring = new MonitoringImpl(StatsDClient.NO_OP, 1, TimeUnit.SECONDS); - PayloadDispatcherImpl dispatcher = - new PayloadDispatcherImpl( - new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); + PayloadDispatcherImpl dispatcher = new PayloadDispatcherImpl( + new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); DDIntakeWriter writer = new DDIntakeWriter(worker, dispatcher, healthMetrics, false); // Only used to create spans @@ -117,9 +116,8 @@ void testWriterFlushClosed() { @Test void testWriterWritePublishSucceeds() { - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); // publish succeeds when(worker.publish(any(), anyInt(), eq(trace))).thenReturn(ENQUEUED_FOR_SERIALIZATION); @@ -134,9 +132,8 @@ void testWriterWritePublishSucceeds() { @Test void testWriterWritePublishForSingleSpanSampling() { - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); // publish succeeds for single span sampling when(worker.publish(any(), anyInt(), eq(trace))).thenReturn(ENQUEUED_FOR_SINGLE_SPAN_SAMPLING); @@ -155,9 +152,8 @@ void testWriterWritePublishForSingleSpanSampling() { "dropped by policy | DROPPED_BY_POLICY " }) void testWriterWritePublishFails(PublishResult publishResult) { - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); // publish fails when(worker.publish(any(), anyInt(), eq(trace))).thenReturn(publishResult); @@ -185,9 +181,8 @@ void testEmptyTracesShouldBeReportedAsFailures() { void testWriterWriteClosed() { writer.close(); clearInvocations(healthMetrics, worker, discovery, api); - List trace = - Collections.singletonList( - (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); + List trace = Collections.singletonList( + (DDSpan) dummyTracer.buildSpan("datadog", "fakeOperation").start()); when(worker.flush(anyLong(), any(TimeUnit.class))).thenReturn(true); writer.write(trace); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/FileBasedPayloadDispatcherTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/FileBasedPayloadDispatcherTest.java index 2040f685fdc..71b4a0fbdf5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/FileBasedPayloadDispatcherTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/FileBasedPayloadDispatcherTest.java @@ -172,7 +172,8 @@ void citestcycleTruncatesMetaValuesAndPreservesMetricsAndTopLevelIds(@TempDir Pa longValue.substring(0, CIConstants.MAX_META_STRING_VALUE_LENGTH), meta.get("custom.tag").asText()); assertEquals( - CIConstants.MAX_META_STRING_VALUE_LENGTH, meta.get("custom.tag").asText().length()); + CIConstants.MAX_META_STRING_VALUE_LENGTH, + meta.get("custom.tag").asText().length()); assertEquals(exactValue, meta.get("exact.tag").asText()); assertEquals(42L, metrics.get("custom.metric").asLong()); assertFalse(meta.has(Tags.TEST_SESSION_ID)); @@ -188,22 +189,24 @@ void citestcycleAssignsEventTypesForSessionModuleSuiteTestSpanSpans(@TempDir Pat throws IOException { FileBasedPayloadDispatcher dispatcher = new FileBasedPayloadDispatcher(outputDir.toString(), "tests", TrackType.CITESTCYCLE); - List> spans = - Arrays.asList( - mockSpan(InternalSpanTypes.TEST_SESSION_END, Collections.emptyMap()), - mockSpan(InternalSpanTypes.TEST_MODULE_END, Collections.emptyMap()), - mockSpan(InternalSpanTypes.TEST_SUITE_END, Collections.emptyMap()), - mockSpan(InternalSpanTypes.TEST, Collections.emptyMap()), - mockSpan("other-span-type", Collections.emptyMap())); + List> spans = Arrays.asList( + mockSpan(InternalSpanTypes.TEST_SESSION_END, Collections.emptyMap()), + mockSpan(InternalSpanTypes.TEST_MODULE_END, Collections.emptyMap()), + mockSpan(InternalSpanTypes.TEST_SUITE_END, Collections.emptyMap()), + mockSpan(InternalSpanTypes.TEST, Collections.emptyMap()), + mockSpan("other-span-type", Collections.emptyMap())); dispatcher.addTrace(spans); dispatcher.flush(); JsonNode events = JSON.readTree(listFiles(outputDir).get(0).toFile()).get("events"); assertEquals(5, events.size()); - assertEquals(InternalSpanTypes.TEST_SESSION_END.toString(), events.get(0).get("type").asText()); - assertEquals(InternalSpanTypes.TEST_MODULE_END.toString(), events.get(1).get("type").asText()); - assertEquals(InternalSpanTypes.TEST_SUITE_END.toString(), events.get(2).get("type").asText()); + assertEquals( + InternalSpanTypes.TEST_SESSION_END.toString(), events.get(0).get("type").asText()); + assertEquals( + InternalSpanTypes.TEST_MODULE_END.toString(), events.get(1).get("type").asText()); + assertEquals( + InternalSpanTypes.TEST_SUITE_END.toString(), events.get(2).get("type").asText()); assertEquals(InternalSpanTypes.TEST.toString(), events.get(3).get("type").asText()); assertEquals("span", events.get(4).get("type").asText()); // session/module/suite events do not have trace/span/parent ids @@ -300,26 +303,24 @@ private static CoreSpan mockSpan(CharSequence type, Map tags) when(span.getTag(any(String.class))).thenAnswer(inv -> tags.get((String) inv.getArgument(0))); // processTagsAndBaggage invokes the consumer with a Metadata built from the tags map - Metadata metadata = - new Metadata( - Thread.currentThread().getId(), - null, - TagMap.fromMap(tags), - Collections.emptyMap(), - 0, - false, - false, - null, - null, - 0, - null, - null); - doAnswer( - inv -> { - MetadataConsumer consumer = inv.getArgument(0); - consumer.accept(metadata); - return null; - }) + Metadata metadata = new Metadata( + Thread.currentThread().getId(), + null, + TagMap.fromMap(tags), + Collections.emptyMap(), + 0, + false, + false, + null, + null, + 0, + null, + null); + doAnswer(inv -> { + MetadataConsumer consumer = inv.getArgument(0); + consumer.accept(metadata); + return null; + }) .when(span) .processTagsAndBaggage(any(MetadataConsumer.class)); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java index 280e37f0f41..bfa487457d3 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpPayloadDispatcherTest.java @@ -33,7 +33,8 @@ @ExtendWith(MockitoExtension.class) class OtlpPayloadDispatcherTest { - @Mock OtlpSender sender; + @Mock + OtlpSender sender; TestCollector collector = new TestCollector(); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterCombinedTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterCombinedTest.java index 3da45b1b1e4..b7b9e06b4cd 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterCombinedTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterCombinedTest.java @@ -23,25 +23,21 @@ void happyPathOverHttp() throws IOException, InterruptedException { CountDownLatch received = new CountDownLatch(1); HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 0), 0); - server.createContext( - "/v1/traces", - exchange -> { - received.countDown(); - exchange.sendResponseHeaders(200, -1); - exchange.close(); - }); + server.createContext("/v1/traces", exchange -> { + received.countDown(); + exchange.sendResponseHeaders(200, -1); + exchange.close(); + }); server.start(); - OtlpWriter writer = - OtlpWriter.builder() - .endpoint( - "http://" - + server.getAddress().getHostString() - + ":" - + server.getAddress().getPort() - + "/v1/traces") - .flushIntervalMilliseconds(-1) - .build(); + OtlpWriter writer = OtlpWriter.builder() + .endpoint("http://" + + server.getAddress().getHostString() + + ":" + + server.getAddress().getPort() + + "/v1/traces") + .flushIntervalMilliseconds(-1) + .build(); CoreTracer tracer = tracerBuilder().writer(writer).build(); try { tracer.buildSpan("test", "fakeOperation").start().finish(); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java index df86d4384e3..d6880eb4d89 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/OtlpWriterTest.java @@ -17,7 +17,8 @@ @ExtendWith(MockitoExtension.class) class OtlpWriterTest { - @Mock OtlpSender sender; + @Mock + OtlpSender sender; @Test void closeShutsDownSender() { @@ -48,7 +49,8 @@ void builderRespectsInjectedSenderAcrossProtocols() { writer.close(); } // One shutdown per writer we built. - verify(sender, org.mockito.Mockito.times(OtlpConfig.Protocol.values().length)).shutdown(); + verify(sender, org.mockito.Mockito.times(OtlpConfig.Protocol.values().length)) + .shutdown(); } @Test @@ -56,21 +58,19 @@ void buildWithDefaultsDoesNotThrow() { // Exercises the default-path sender construction (real OtlpHttpSender) without // actually sending anything — start/close only. Guards against a default config // that would otherwise fail at construction time. - assertDoesNotThrow( - () -> { - OtlpWriter writer = OtlpWriter.builder().build(); - writer.start(); - writer.close(); - }); + assertDoesNotThrow(() -> { + OtlpWriter writer = OtlpWriter.builder().build(); + writer.start(); + writer.close(); + }); } @Test void grpcProtocolUsesGrpcMethodPath() { - OtlpWriter writer = - OtlpWriter.builder() - .protocol(OtlpConfig.Protocol.GRPC) - .endpoint("http://localhost:4317") - .build(); + OtlpWriter writer = OtlpWriter.builder() + .protocol(OtlpConfig.Protocol.GRPC) + .endpoint("http://localhost:4317") + .build(); try { OtlpGrpcSender grpcSender = assertInstanceOf(OtlpGrpcSender.class, writer.getSender()); assertEquals( diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java index cf756003e7c..d52c7e63895 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java @@ -56,15 +56,12 @@ void testFlushAutomaticallyWhenDataLimitIsBreached(String traceEndpoint) throws DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); when(discovery.getTraceEndpoint()).thenReturn(traceEndpoint); DDAgentApi api = mock(DDAgentApi.class); - when(api.sendSerializedTraces(any())) - .thenAnswer( - inv -> { - flushed.set(true); - return RemoteApi.Response.success(200); - }); - PayloadDispatcherImpl dispatcher = - new PayloadDispatcherImpl( - new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); + when(api.sendSerializedTraces(any())).thenAnswer(inv -> { + flushed.set(true); + return RemoteApi.Response.success(200); + }); + PayloadDispatcherImpl dispatcher = new PayloadDispatcherImpl( + new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); List trace = Collections.singletonList(realSpan()); while (!flushed.get()) { @@ -90,9 +87,8 @@ void testShouldFlushBufferOnDemand(String traceEndpoint, int traceCount) throws DDAgentApi api = mock(DDAgentApi.class); when(discovery.getTraceEndpoint()).thenReturn(traceEndpoint); when(api.sendSerializedTraces(any())).thenReturn(RemoteApi.Response.success(200)); - PayloadDispatcherImpl dispatcher = - new PayloadDispatcherImpl( - new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); + PayloadDispatcherImpl dispatcher = new PayloadDispatcherImpl( + new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); List trace = Collections.singletonList(realSpan()); for (int i = 0; i < traceCount; ++i) { @@ -121,9 +117,8 @@ void testShouldReportFailedRequestToMonitor(String traceEndpoint, int traceCount DDAgentApi api = mock(DDAgentApi.class); when(discovery.getTraceEndpoint()).thenReturn(traceEndpoint); when(api.sendSerializedTraces(any())).thenReturn(RemoteApi.Response.failed(400)); - PayloadDispatcherImpl dispatcher = - new PayloadDispatcherImpl( - new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); + PayloadDispatcherImpl dispatcher = new PayloadDispatcherImpl( + new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); List trace = Collections.singletonList(realSpan()); for (int i = 0; i < traceCount; ++i) { @@ -142,9 +137,8 @@ void testShouldDropTraceWhenThereIsNoAgentConnectivity() throws Exception { DDAgentApi api = mock(DDAgentApi.class); DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); when(discovery.getTraceEndpoint()).thenReturn(null); - PayloadDispatcherImpl dispatcher = - new PayloadDispatcherImpl( - new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); + PayloadDispatcherImpl dispatcher = new PayloadDispatcherImpl( + new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); List trace = Collections.singletonList(realSpan()); dispatcher.addTrace(trace); @@ -158,9 +152,8 @@ void testTraceAndSpanCountsAreResetAfterAccess() { DDAgentApi api = mock(DDAgentApi.class); DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class); when(discovery.getTraceEndpoint()).thenReturn("v0.4/traces"); - PayloadDispatcherImpl dispatcher = - new PayloadDispatcherImpl( - new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); + PayloadDispatcherImpl dispatcher = new PayloadDispatcherImpl( + new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); // add traces and dropped counts dispatcher.addTrace(Collections.emptyList()); @@ -183,50 +176,45 @@ void testTraceAndSpanCountsAreResetAfterAccess() { DDSpan realSpan() throws Exception { // getTracer() and mapServiceName() are package-private in TraceCollector; use a custom // Answer to handle them at runtime without compile-time accessibility issues - PendingTrace trace = - mock( - PendingTrace.class, - invocation -> { - Class returnType = invocation.getMethod().getReturnType(); - if (CoreTracer.class.isAssignableFrom(returnType)) { - // Use RETURNS_DEFAULTS so getTagInterceptor() returns null (matching Groovy Stub - // behavior) - return mock(CoreTracer.class); - } - if (returnType == String.class) { - Object[] args = invocation.getArguments(); - // mapServiceName(String) - return the argument unchanged - if (args.length > 0 && args[0] instanceof String) { - return args[0]; - } - return ""; - } - return org.mockito.Mockito.RETURNS_DEFAULTS.answer(invocation); - }); - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1L, - DDSpanId.ZERO, - null, - "", - "", - "", - PrioritySampling.UNSET, - "", - Collections.emptyMap(), - false, - "", - 0, - trace, - null, - null, - NoopPathwayContext.INSTANCE, - false, - PropagationTags.factory().empty()); - Constructor ctor = - DDSpan.class.getDeclaredConstructor( - String.class, long.class, DDSpanContext.class, List.class); + PendingTrace trace = mock(PendingTrace.class, invocation -> { + Class returnType = invocation.getMethod().getReturnType(); + if (CoreTracer.class.isAssignableFrom(returnType)) { + // Use RETURNS_DEFAULTS so getTagInterceptor() returns null (matching Groovy Stub + // behavior) + return mock(CoreTracer.class); + } + if (returnType == String.class) { + Object[] args = invocation.getArguments(); + // mapServiceName(String) - return the argument unchanged + if (args.length > 0 && args[0] instanceof String) { + return args[0]; + } + return ""; + } + return org.mockito.Mockito.RETURNS_DEFAULTS.answer(invocation); + }); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1L, + DDSpanId.ZERO, + null, + "", + "", + "", + PrioritySampling.UNSET, + "", + Collections.emptyMap(), + false, + "", + 0, + trace, + null, + null, + NoopPathwayContext.INSTANCE, + false, + PropagationTags.factory().empty()); + Constructor ctor = DDSpan.class.getDeclaredConstructor( + String.class, long.class, DDSpanContext.class, List.class); ctor.setAccessible(true); return ctor.newInstance("test", 0L, context, null); } diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/RemoteWriterLoggingTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/RemoteWriterLoggingTest.java index aa8f267cc0a..770268e693b 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/RemoteWriterLoggingTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/RemoteWriterLoggingTest.java @@ -122,7 +122,8 @@ void sampledOutOverflowDoesNotSuppressAKeptTraceWarning() { } private void write(byte priority, PublishResult result) { - DDSpan root = buildSpan(0L, "test.tag", "test.value", PropagationTags.factory().empty()); + DDSpan root = + buildSpan(0L, "test.tag", "test.value", PropagationTags.factory().empty()); root.setSamplingPriority(priority); List trace = Collections.singletonList(root); when(worker.publish(any(), anyInt(), eq(trace))).thenReturn(result); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/SpanSamplingWorkerTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/SpanSamplingWorkerTest.java index f03ecc985df..f56a441300a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/SpanSamplingWorkerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/SpanSamplingWorkerTest.java @@ -33,9 +33,8 @@ void testSendOnlySampledSpansToTheSampledSpanQueue() throws InterruptedException BlockingQueue secondaryQueue = new LinkedBlockingDeque<>(10); SingleSpanSampler singleSpanSampler = mock(SingleSpanSampler.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - SpanSamplingWorker worker = - SpanSamplingWorker.build( - 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); + SpanSamplingWorker worker = SpanSamplingWorker.build( + 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); worker.start(); DDSpan span1 = mock(DDSpan.class); DDSpan span2 = mock(DDSpan.class); @@ -58,9 +57,8 @@ void testHandleMultipleTraces() throws InterruptedException { BlockingQueue secondaryQueue = new LinkedBlockingDeque<>(10); SingleSpanSampler singleSpanSampler = mock(SingleSpanSampler.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - SpanSamplingWorker worker = - SpanSamplingWorker.build( - 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); + SpanSamplingWorker worker = SpanSamplingWorker.build( + 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); worker.start(); DDSpan span1 = mock(DDSpan.class); DDSpan span2 = mock(DDSpan.class); @@ -90,9 +88,8 @@ void testSkipTracesWithNoSampledSpans() throws InterruptedException { BlockingQueue secondaryQueue = new LinkedBlockingDeque<>(10); SingleSpanSampler singleSpanSampler = mock(SingleSpanSampler.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - SpanSamplingWorker worker = - SpanSamplingWorker.build( - 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); + SpanSamplingWorker worker = SpanSamplingWorker.build( + 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); worker.start(); DDSpan span1 = mock(DDSpan.class); DDSpan span2 = mock(DDSpan.class); @@ -127,9 +124,8 @@ void testIgnoreEmptyTraces() throws InterruptedException { BlockingQueue secondaryQueue = new LinkedBlockingDeque<>(10); SingleSpanSampler singleSpanSampler = mock(SingleSpanSampler.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - SpanSamplingWorker worker = - SpanSamplingWorker.build( - 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); + SpanSamplingWorker worker = SpanSamplingWorker.build( + 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); worker.start(); DDSpan span1 = mock(DDSpan.class); when(singleSpanSampler.setSamplingPriority(span1)).thenReturn(true); @@ -222,9 +218,8 @@ void testUpdatePublishedTracesMetricWhenAllTraceSpansHaveBeenSampled() BlockingQueue secondaryQueue = new LinkedBlockingDeque<>(10); SingleSpanSampler singleSpanSampler = mock(SingleSpanSampler.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - SpanSamplingWorker worker = - SpanSamplingWorker.build( - 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); + SpanSamplingWorker worker = SpanSamplingWorker.build( + 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); worker.start(); DDSpan span1 = mock(DDSpan.class); DDSpan span2 = mock(DDSpan.class); @@ -253,9 +248,8 @@ void testUpdatePartialTracesMetricWhenSomeSpansDroppedAndSentToSecondaryQueue() BlockingQueue secondaryQueue = new LinkedBlockingDeque<>(10); SingleSpanSampler singleSpanSampler = mock(SingleSpanSampler.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - SpanSamplingWorker worker = - SpanSamplingWorker.build( - 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); + SpanSamplingWorker worker = SpanSamplingWorker.build( + 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> false); worker.start(); DDSpan span1 = mock(DDSpan.class); DDSpan span2 = mock(DDSpan.class); @@ -294,14 +288,8 @@ void testUpdatePartialTracesMetricWhenSpansDroppedAndSecondaryQueueFullOrDroppin } SingleSpanSampler singleSpanSampler = mock(SingleSpanSampler.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - SpanSamplingWorker worker = - new SpanSamplingWorker.DefaultSpanSamplingWorker( - 10, - primaryQueue, - secondaryQueue, - singleSpanSampler, - healthMetrics, - () -> droppingPolicy); + SpanSamplingWorker worker = new SpanSamplingWorker.DefaultSpanSamplingWorker( + 10, primaryQueue, secondaryQueue, singleSpanSampler, healthMetrics, () -> droppingPolicy); worker.start(); DDSpan span1 = mock(DDSpan.class); DDSpan span2 = mock(DDSpan.class); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceGenerator.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceGenerator.java index c8fad4ab0ee..a3e649a590f 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceGenerator.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceGenerator.java @@ -229,20 +229,19 @@ public PojoSpan( this.measured = measured; this.samplingPriority = samplingPriority; this.httpStatusCode = (short) statusCode; - this.metadata = - new Metadata( - Thread.currentThread().getId(), - UTF8BytesString.create(Thread.currentThread().getName()), - TagMap.fromMap(tags), - baggage, - samplingPriority, - measured, - isTopLevel(), - statusCode == 0 ? null : UTF8BytesString.create(Integer.toString(statusCode)), - origin, - 0, - ProcessTags.getTagsForSerialization(), - spanLinks); + this.metadata = new Metadata( + Thread.currentThread().getId(), + UTF8BytesString.create(Thread.currentThread().getName()), + TagMap.fromMap(tags), + baggage, + samplingPriority, + measured, + isTopLevel(), + statusCode == 0 ? null : UTF8BytesString.create(Integer.toString(statusCode)), + origin, + 0, + ProcessTags.getTagsForSerialization(), + spanLinks); } @Override diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceMapperTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceMapperTest.java index a88d7d9000f..7092695e9b7 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceMapperTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceMapperTest.java @@ -27,13 +27,11 @@ class TraceMapperTest extends DDCoreJavaSpecification { @Test void testTraceMapperV05() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", null) - .withTag("service.name", "my-service") - .withTag("elasticsearch.version", "7.0") - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", null) + .withTag("service.name", "my-service") + .withTag("elasticsearch.version", "7.0") + .start(); span.setBaggageItem("baggage", "item"); span.spanContext().setDataTop("mydata", "[1,2,3]"); List trace = Collections.singletonList(span); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceProcessingWorkerTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceProcessingWorkerTest.java index 86dbfa61b22..b1ed80a78c5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceProcessingWorkerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/TraceProcessingWorkerTest.java @@ -40,11 +40,10 @@ class TraceProcessingWorkerTest extends DDJavaSpecification { private PayloadDispatcherImpl flushCountingPayloadDispatcher(AtomicInteger flushCounter) { PayloadDispatcherImpl dispatcher = mock(PayloadDispatcherImpl.class); - doAnswer( - inv -> { - flushCounter.incrementAndGet(); - return null; - }) + doAnswer(inv -> { + flushCounter.incrementAndGet(); + return null; + }) .when(dispatcher) .flush(); return dispatcher; @@ -57,16 +56,15 @@ private PayloadDispatcherImpl flushCountingPayloadDispatcher(AtomicInteger flush @Test void testHeartbeatsShouldBeTriggeredAutomaticallyWhenEnabled() throws Exception { AtomicInteger flushCount = new AtomicInteger(); - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - mock(HealthMetrics.class), - flushCountingPayloadDispatcher(flushCount), - () -> false, - FAST_LANE, - 1, - TimeUnit.NANOSECONDS, // stop heartbeats from being throttled - null)) { + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + mock(HealthMetrics.class), + flushCountingPayloadDispatcher(flushCount), + () -> false, + FAST_LANE, + 1, + TimeUnit.NANOSECONDS, // stop heartbeats from being throttled + null)) { // processor is started worker.start(); @@ -88,16 +86,15 @@ void testHeartbeatsShouldBeTriggeredAutomaticallyWhenEnabled() throws Exception @Test void testHeartbeatsShouldOccurAtLeastOncePerSecondWhenNotThrottled() throws Exception { AtomicInteger flushCount = new AtomicInteger(); - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - mock(HealthMetrics.class), - flushCountingPayloadDispatcher(flushCount), - () -> false, - FAST_LANE, - 1, - TimeUnit.NANOSECONDS, // stop heartbeats from being throttled - null)) { + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + mock(HealthMetrics.class), + flushCountingPayloadDispatcher(flushCount), + () -> false, + FAST_LANE, + 1, + TimeUnit.NANOSECONDS, // stop heartbeats from being throttled + null)) { // processor is started worker.start(); @@ -123,16 +120,15 @@ void testAFlushShouldClearThePrimaryQueue() { AtomicInteger flushCount = new AtomicInteger(); // prevent heartbeats from helping the flush happen - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - mock(HealthMetrics.class), - flushCountingPayloadDispatcher(flushCount), - () -> false, - FAST_LANE, - 100, - TimeUnit.SECONDS, // prevent heartbeats from helping the flush happen - null)) { + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + mock(HealthMetrics.class), + flushCountingPayloadDispatcher(flushCount), + () -> false, + FAST_LANE, + 100, + TimeUnit.SECONDS, // prevent heartbeats from helping the flush happen + null)) { // there is pending work it is completed before a flush // processing this span will throw an exception, but it should be caught // and not disrupt the flush @@ -164,10 +160,9 @@ void testShouldReportFailureIfSerializationFails( @ConvertWith(PrioritySamplingConverter.class) int priority) throws Exception { Throwable theError = new IllegalStateException("thrown by test"); PayloadDispatcherImpl throwingDispatcher = mock(PayloadDispatcherImpl.class); - doAnswer( - inv -> { - throw theError; - }) + doAnswer(inv -> { + throw theError; + }) .when(throwingDispatcher) .addTrace(any()); @@ -176,26 +171,24 @@ void testShouldReportFailureIfSerializationFails( // do this manually with a counter, despite mockito's lovely syntactical sugar so we don't have // a race condition induced flaky test. All we care about is that an error was reported and that // it was the right one - doAnswer( - inv -> { - errorReported.incrementAndGet(); - return null; - }) + doAnswer(inv -> { + errorReported.incrementAndGet(); + return null; + }) .when(healthMetrics) .onFailedSerialize(any(), any()); // prevent heartbeats from helping the flush happen - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - healthMetrics, - throwingDispatcher, - () -> false, - FAST_LANE, - 100, - TimeUnit.SECONDS, // prevent heartbeats from helping the flush happen - null)) { + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + healthMetrics, + throwingDispatcher, + () -> false, + FAST_LANE, + 100, + TimeUnit.SECONDS, // prevent heartbeats from helping the flush happen + null)) { worker.start(); // a trace is processed but can't be passed on worker.publish(mock(DDSpan.class), priority, Collections.singletonList(mock(DDSpan.class))); @@ -218,19 +211,17 @@ void testShouldReportFailureIfSerializationFails( void testTraceShouldBePostProcessed() throws Exception { AtomicInteger acceptedCount = new AtomicInteger(); PayloadDispatcherImpl countingDispatcher = mock(PayloadDispatcherImpl.class); - doAnswer( - inv -> { - acceptedCount.getAndIncrement(); - return null; - }) + doAnswer(inv -> { + acceptedCount.getAndIncrement(); + return null; + }) .when(countingDispatcher) .addTrace(any()); HealthMetrics healthMetrics = mock(HealthMetrics.class); // Create real DDSpan instances via reflection (DDSpan.create is package-private) - Method createMethod = - DDSpan.class.getDeclaredMethod( - "create", String.class, long.class, DDSpanContext.class, List.class); + Method createMethod = DDSpan.class.getDeclaredMethod( + "create", String.class, long.class, DDSpanContext.class, List.class); createMethod.setAccessible(true); DDSpanContext ctx1 = mock(DDSpanContext.class); @@ -250,28 +241,26 @@ void testTraceShouldBePostProcessed() throws Exception { AtomicBoolean processedSpan2 = new AtomicBoolean(false); SpanPostProcessor mockProcessor = mock(SpanPostProcessor.class); - doAnswer( - inv -> { - Object spanArg = inv.getArgument(0); - if (spanArg == span1) processedSpan1.set(true); - if (spanArg == span2) processedSpan2.set(true); - return null; - }) + doAnswer(inv -> { + Object spanArg = inv.getArgument(0); + if (spanArg == span1) processedSpan1.set(true); + if (spanArg == span2) processedSpan2.set(true); + return null; + }) .when(mockProcessor) .process(any(), any()); SpanPostProcessor.Holder.INSTANCE = mockProcessor; - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - healthMetrics, - countingDispatcher, - () -> false, - FAST_LANE, - 100, - TimeUnit.SECONDS, - null)) { + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + healthMetrics, + countingDispatcher, + () -> false, + FAST_LANE, + 100, + TimeUnit.SECONDS, + null)) { worker.start(); // traces are submitted List trace = new ArrayList<>(); @@ -324,33 +313,30 @@ void testTracesShouldBeProcessed( @ConvertWith(PrioritySamplingConverter.class) int priority, int traceCount) throws Exception { AtomicInteger acceptedCount = new AtomicInteger(); PayloadDispatcherImpl countingDispatcher = mock(PayloadDispatcherImpl.class); - doAnswer( - inv -> { - acceptedCount.getAndIncrement(); - return null; - }) + doAnswer(inv -> { + acceptedCount.getAndIncrement(); + return null; + }) .when(countingDispatcher) .addTrace(any()); HealthMetrics healthMetrics = mock(HealthMetrics.class); // prevent heartbeats from helping the flush happen - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - healthMetrics, - countingDispatcher, - () -> false, - FAST_LANE, - 100, - TimeUnit.SECONDS, // prevent heartbeats from helping the flush happen - null)) { + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + healthMetrics, + countingDispatcher, + () -> false, + FAST_LANE, + 100, + TimeUnit.SECONDS, // prevent heartbeats from helping the flush happen + null)) { worker.start(); // traces are submitted int submitted = 0; for (int i = 0; i < traceCount; ++i) { - PublishResult publishResult = - worker.publish( - mock(DDSpan.class), priority, Collections.singletonList(mock(DDSpan.class))); + PublishResult publishResult = worker.publish( + mock(DDSpan.class), priority, Collections.singletonList(mock(DDSpan.class))); submitted += publishResult == ENQUEUED_FOR_SERIALIZATION ? 1 : 0; } @@ -374,16 +360,8 @@ void testTracesShouldBeProcessed( void testFlushOfFullQueueAfterWorkerThreadStoppedWillNotFlushButWillReturn() { PayloadDispatcherImpl countingDispatcher = mock(PayloadDispatcherImpl.class); HealthMetrics healthMetrics = mock(HealthMetrics.class); - TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - healthMetrics, - countingDispatcher, - () -> false, - FAST_LANE, - 100, - TimeUnit.SECONDS, - null); + TraceProcessingWorker worker = new TraceProcessingWorker( + 10, healthMetrics, countingDispatcher, () -> false, FAST_LANE, 100, TimeUnit.SECONDS, null); worker.start(); worker.close(); @@ -444,42 +422,39 @@ void testSendUnsampledTracesDroppingPolicyIsActive( AtomicInteger acceptedCount = new AtomicInteger(); AtomicInteger acceptedSpanCount = new AtomicInteger(); PayloadDispatcherImpl countingDispatcher = mock(PayloadDispatcherImpl.class); - doAnswer( - inv -> { - List traceList = inv.getArgument(0); - acceptedSpanCount.getAndAdd(traceList.size()); - acceptedCount.getAndIncrement(); - return null; - }) + doAnswer(inv -> { + List traceList = inv.getArgument(0); + acceptedSpanCount.getAndAdd(traceList.size()); + acceptedCount.getAndIncrement(); + return null; + }) .when(countingDispatcher) .addTrace(any()); AtomicInteger sampledSpansCount = new AtomicInteger(); // drop every other span - SingleSpanSampler singleSpanSampler = - new SingleSpanSampler() { - int counter = 0; - - @Override - public > boolean setSamplingPriority(T span) { - if (counter++ % 2 == 0) { - sampledSpansCount.incrementAndGet(); - return true; - } - return false; - } - }; - - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - healthMetrics, - countingDispatcher, - () -> true, - FAST_LANE, - 100, - TimeUnit.SECONDS, - singleSpanSampler)) { + SingleSpanSampler singleSpanSampler = new SingleSpanSampler() { + int counter = 0; + + @Override + public > boolean setSamplingPriority(T span) { + if (counter++ % 2 == 0) { + sampledSpansCount.incrementAndGet(); + return true; + } + return false; + } + }; + + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + healthMetrics, + countingDispatcher, + () -> true, + FAST_LANE, + 100, + TimeUnit.SECONDS, + singleSpanSampler)) { worker.start(); // traces are submitted for (int i = 0; i < traceCount; ++i) { @@ -553,42 +528,39 @@ void testSendUnsampledTracesDroppingPolicyIsInactive( AtomicInteger chunksCount = new AtomicInteger(); AtomicInteger spansCount = new AtomicInteger(); PayloadDispatcherImpl countingDispatcher = mock(PayloadDispatcherImpl.class); - doAnswer( - inv -> { - List traceList = inv.getArgument(0); - spansCount.getAndAdd(traceList.size()); - chunksCount.getAndIncrement(); - return null; - }) + doAnswer(inv -> { + List traceList = inv.getArgument(0); + spansCount.getAndAdd(traceList.size()); + chunksCount.getAndIncrement(); + return null; + }) .when(countingDispatcher) .addTrace(any()); AtomicInteger sampledSpansCount = new AtomicInteger(); // drop every other span - SingleSpanSampler singleSpanSampler = - new SingleSpanSampler() { - int counter = 0; - - @Override - public > boolean setSamplingPriority(T span) { - if (counter++ % 2 == 0) { - sampledSpansCount.incrementAndGet(); - return true; - } - return false; - } - }; - - try (TraceProcessingWorker worker = - new TraceProcessingWorker( - 10, - healthMetrics, - countingDispatcher, - () -> false, - FAST_LANE, - 100, - TimeUnit.SECONDS, - singleSpanSampler)) { + SingleSpanSampler singleSpanSampler = new SingleSpanSampler() { + int counter = 0; + + @Override + public > boolean setSamplingPriority(T span) { + if (counter++ % 2 == 0) { + sampledSpansCount.incrementAndGet(); + return true; + } + return false; + } + }; + + try (TraceProcessingWorker worker = new TraceProcessingWorker( + 10, + healthMetrics, + countingDispatcher, + () -> false, + FAST_LANE, + 100, + TimeUnit.SECONDS, + singleSpanSampler)) { worker.start(); // traces are submitted for (int i = 0; i < traceCount; ++i) { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java index bb52f69806a..0c85fb5bc9b 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/WriterFactoryTest.java @@ -83,20 +83,17 @@ void testWriterCreationForCiVisibility( when(config.isCiVisibilityAgentlessEnabled()).thenReturn(isCiVisibilityAgentlessEnabled); // Mock agent info response - Response response = - buildHttpResponse( - hasEvpProxy, evpProxySupportsCompression, HttpUrl.parse("http://my-agent.url/info")); + Response response = buildHttpResponse( + hasEvpProxy, evpProxySupportsCompression, HttpUrl.parse("http://my-agent.url/info")); // Mock HTTP client that simulates delayed response for async feature discovery Call mockCall = mock(Call.class); OkHttpClient mockHttpClient = mock(OkHttpClient.class); - when(mockCall.execute()) - .thenAnswer( - inv -> { - // Add a delay - Thread.sleep(400); - return response; - }); + when(mockCall.execute()).thenAnswer(inv -> { + // Add a delay + Thread.sleep(400); + return response; + }); when(mockHttpClient.newCall(any(Request.class))).thenReturn(mockCall); // Create SharedCommunicationObjects with mocked HTTP client @@ -106,9 +103,8 @@ void testWriterCreationForCiVisibility( sharedComm.createRemaining(config); Sampler sampler = mock(Sampler.class); - Writer writer = - WriterFactory.createWriter( - config, sharedComm, sampler, null, HealthMetrics.NO_OP, configuredType); + Writer writer = WriterFactory.createWriter( + config, sharedComm, sampler, null, HealthMetrics.NO_OP, configuredType); List> expectedApiClasses = expectedApiClass != null ? singletonList(expectedApiClass) : null; @@ -124,9 +120,8 @@ void testWriterCreationForCiVisibility( assertEquals(expectedWriterClass, writer.getClass()); assertTrue(expectedApiClasses == null || apiClasses.equals(expectedApiClasses)); - assertTrue( - expectedApiClasses == null - || apis.stream().allMatch(api -> api.isCompressionEnabled() == isCompressionEnabled)); + assertTrue(expectedApiClasses == null + || apis.stream().allMatch(api -> api.isCompressionEnabled() == isCompressionEnabled)); } @TableTest({ @@ -171,13 +166,11 @@ void testWriterCreationForLlmObservability( // Mock HTTP client that simulates delayed response for async feature discovery Call mockCall = mock(Call.class); OkHttpClient mockHttpClient = mock(OkHttpClient.class); - when(mockCall.execute()) - .thenAnswer( - inv -> { - // Add a delay - Thread.sleep(400); - return response; - }); + when(mockCall.execute()).thenAnswer(inv -> { + // Add a delay + Thread.sleep(400); + return response; + }); when(mockHttpClient.newCall(any(Request.class))).thenReturn(mockCall); // Create SharedCommunicationObjects with mocked HTTP client @@ -187,24 +180,21 @@ void testWriterCreationForLlmObservability( sharedComm.createRemaining(config); Sampler sampler = mock(Sampler.class); - Writer writer = - WriterFactory.createWriter( - config, sharedComm, sampler, null, HealthMetrics.NO_OP, configuredType); - List> llmObsApiClasses = - ((RemoteWriter) writer) - .getApis().stream() - .filter( - api -> { - try { - Field trackTypeField = api.getClass().getDeclaredField("trackType"); - trackTypeField.setAccessible(true); - return trackTypeField.get(api) == TrackType.LLMOBS; - } catch (Exception e) { - return false; - } - }) - .map(Object::getClass) - .collect(Collectors.toList()); + Writer writer = WriterFactory.createWriter( + config, sharedComm, sampler, null, HealthMetrics.NO_OP, configuredType); + List> llmObsApiClasses = ((RemoteWriter) writer) + .getApis().stream() + .filter(api -> { + try { + Field trackTypeField = api.getClass().getDeclaredField("trackType"); + trackTypeField.setAccessible(true); + return trackTypeField.get(api) == TrackType.LLMOBS; + } catch (Exception e) { + return false; + } + }) + .map(Object::getClass) + .collect(Collectors.toList()); assertEquals(expectedWriterClass, writer.getClass()); assertEquals(singletonList(expectedLlmObsApiClass), llmObsApiClasses); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV04PayloadTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV04PayloadTest.java index 15483b94c95..9f2e949b916 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV04PayloadTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV04PayloadTest.java @@ -101,24 +101,23 @@ private static Stream tracesWrittenCorrectlyArguments() { @MethodSource("fullSixtyFourBitTraceAndSpanIdentifiersArguments") void fullSixtyFourBitTraceAndSpanIdentifiers( String scenario, DDTraceId traceId, long spanId, long parentId) { - PojoSpan span = - new PojoSpan( - "service", - "operation", - "resource", - traceId, - spanId, - parentId, - 123L, - 456L, - 0, - Collections.emptyMap(), - Collections.emptyMap(), - "type", - false, - 0, - 0, - "origin"); + PojoSpan span = new PojoSpan( + "service", + "operation", + "resource", + traceId, + spanId, + parentId, + 123L, + 456L, + 0, + Collections.emptyMap(), + Collections.emptyMap(), + "type", + false, + 0, + 0, + "origin"); List> traces = Collections.singletonList(Collections.singletonList(span)); TraceMapperV0_4 traceMapper = new TraceMapperV0_4(); PayloadVerifier verifier = new PayloadVerifier(traces, traceMapper); @@ -139,24 +138,23 @@ private static Stream fullSixtyFourBitTraceAndSpanIdentifiersArgument @Test void metaStructSupport() { - PojoSpan span = - new PojoSpan( - "service", - "operation", - "resource", - DDTraceId.ONE, - 1L, - -1L, - 123L, - 456L, - 0, - Collections.emptyMap(), - Collections.emptyMap(), - "type", - false, - 0, - 0, - "origin"); + PojoSpan span = new PojoSpan( + "service", + "operation", + "resource", + DDTraceId.ONE, + 1L, + -1L, + 123L, + 456L, + 0, + Collections.emptyMap(), + Collections.emptyMap(), + "type", + false, + 0, + 0, + "origin"); List> stack = new ArrayList<>(); for (StackTraceElement element : Thread.currentThread().getStackTrace()) { Map frame = new HashMap<>(); @@ -168,25 +166,21 @@ void metaStructSupport() { span.setMetaStruct("stack", stack); List> traces = Collections.singletonList(Collections.singletonList(span)); TraceMapperV0_4 traceMapper = new TraceMapperV0_4(); - PayloadVerifier verifier = - new PayloadVerifier( - traces, - traceMapper, - (expected, received) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(received); - List expectedStack = (List) expected; - int size = unpacker.unpackArrayHeader(); - assertEquals(expectedStack.size(), size); - for (Object entry : expectedStack) { - @SuppressWarnings("unchecked") - Map stackEntry = (Map) entry; - int fields = unpacker.unpackMapHeader(); - for (int f = 0; f < fields; ++f) { - String field = unpacker.unpackString(); - assertEquals(stackEntry.get(field), unpacker.unpackString()); - } - } - }); + PayloadVerifier verifier = new PayloadVerifier(traces, traceMapper, (expected, received) -> { + MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(received); + List expectedStack = (List) expected; + int size = unpacker.unpackArrayHeader(); + assertEquals(expectedStack.size(), size); + for (Object entry : expectedStack) { + @SuppressWarnings("unchecked") + Map stackEntry = (Map) entry; + int fields = unpacker.unpackMapHeader(); + for (int f = 0; f < fields; ++f) { + String field = unpacker.unpackString(); + assertEquals(stackEntry.get(field), unpacker.unpackString()); + } + } + }); MsgPackWriter packer = new MsgPackWriter(new FlushingBuffer(20 << 10, verifier)); packer.format(Collections.singletonList(span), traceMapper); @@ -200,24 +194,23 @@ void processTagsSerialization() { assertNotNull(ProcessTags.getTagsForSerialization()); List spans = new ArrayList<>(); for (long spanId = 1; spanId <= 2; ++spanId) { - spans.add( - new PojoSpan( - "service", - "operation", - "resource", - DDTraceId.ONE, - spanId, - -1L, - 123L, - 456L, - 0, - Collections.emptyMap(), - Collections.emptyMap(), - "type", - false, - 0, - 0, - "origin")); + spans.add(new PojoSpan( + "service", + "operation", + "resource", + DDTraceId.ONE, + spanId, + -1L, + 123L, + 456L, + 0, + Collections.emptyMap(), + Collections.emptyMap(), + "type", + false, + 0, + 0, + "origin")); } List> traces = Collections.singletonList(spans); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV05PayloadTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV05PayloadTest.java index 6dedd2e9ef6..dd6eee4e7a5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV05PayloadTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV05PayloadTest.java @@ -76,25 +76,23 @@ void bodyOverflowCausesAFlush() { // enough space for two traces with distinct string values, plus the header int dictionarySize = dictionarySpacePerTrace * 2 + 5; TraceMapperV0_5 traceMapper = new TraceMapperV0_5(dictionarySize); - List repeatedTrace = - Collections.singletonList( - new PojoSpan( - UUID.randomUUID().toString(), - UUID.randomUUID().toString(), - UUID.randomUUID().toString(), - DDTraceId.ZERO, - DDSpanId.ZERO, - DDSpanId.ZERO, - 10000, - 100, - 0, - Collections.emptyMap(), - Collections.emptyMap(), - UUID.randomUUID().toString(), - false, - PrioritySampling.UNSET, - 0, - null)); + List repeatedTrace = Collections.singletonList(new PojoSpan( + UUID.randomUUID().toString(), + UUID.randomUUID().toString(), + UUID.randomUUID().toString(), + DDTraceId.ZERO, + DDSpanId.ZERO, + DDSpanId.ZERO, + 10000, + 100, + 0, + Collections.emptyMap(), + Collections.emptyMap(), + UUID.randomUUID().toString(), + false, + PrioritySampling.UNSET, + 0, + null)); int traceSize = calculateSize(repeatedTrace); // 30KB body int bufferSize = 30 << 10; @@ -174,24 +172,23 @@ void processTagsSerialization() { assertNotNull(ProcessTags.getTagsForSerialization()); List spans = new ArrayList<>(); for (long spanId = 1; spanId <= 2; ++spanId) { - spans.add( - new PojoSpan( - "service", - "operation", - "resource", - DDTraceId.ONE, - spanId, - -1L, - 123L, - 456L, - 0, - Collections.emptyMap(), - Collections.emptyMap(), - "type", - false, - 0, - 0, - "origin")); + spans.add(new PojoSpan( + "service", + "operation", + "resource", + DDTraceId.ONE, + spanId, + -1L, + 123L, + 456L, + 0, + Collections.emptyMap(), + Collections.emptyMap(), + "type", + false, + 0, + 0, + "origin")); } List> traces = Collections.singletonList(spans); @@ -348,16 +345,12 @@ void verifyTracesConsumed() { private static int calculateSize(List trace) { AtomicInteger size = new AtomicInteger(); - MsgPackWriter packer = - new MsgPackWriter( - new FlushingBuffer( - 1024, - new ByteBufferConsumer() { - @Override - public void accept(int messageCount, ByteBuffer buffer) { - size.set(buffer.limit() - buffer.position()); - } - })); + MsgPackWriter packer = new MsgPackWriter(new FlushingBuffer(1024, new ByteBufferConsumer() { + @Override + public void accept(int messageCount, ByteBuffer buffer) { + size.set(buffer.limit() - buffer.position()); + } + })); packer.format(trace, new TraceMapperV0_5(1024)); packer.flush(); return size.get(); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.java index 1eacd903b96..69149890d0b 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.java @@ -84,40 +84,36 @@ class TraceMapperV1PayloadTest { private static final String DECISION_MAKER_TAG = "_dd.p.dm"; /** Every field the v1 payload header carries, mirroring {@code TraceMapperV1.buildHeader}. */ - private static final Set EXPECTED_PAYLOAD_FIELD_IDS = - new HashSet<>( - asList( - PayloadField.CONTAINER_ID, - PayloadField.LANGUAGE_NAME, - PayloadField.LANGUAGE_VERSION, - PayloadField.TRACER_VERSION, - PayloadField.RUNTIME_ID, - PayloadField.ENV, - PayloadField.HOSTNAME, - PayloadField.APP_VERSION, - PayloadField.ATTRIBUTES, - PayloadField.CHUNKS)); + private static final Set EXPECTED_PAYLOAD_FIELD_IDS = new HashSet<>(asList( + PayloadField.CONTAINER_ID, + PayloadField.LANGUAGE_NAME, + PayloadField.LANGUAGE_VERSION, + PayloadField.TRACER_VERSION, + PayloadField.RUNTIME_ID, + PayloadField.ENV, + PayloadField.HOSTNAME, + PayloadField.APP_VERSION, + PayloadField.ATTRIBUTES, + PayloadField.CHUNKS)); /** Every field a v1 span carries, mirroring {@code TraceMapperV1.encodeSpans}. */ - private static final Set EXPECTED_SPAN_FIELD_IDS = - new HashSet<>( - asList( - SpanField.SERVICE, - SpanField.NAME, - SpanField.RESOURCE, - SpanField.SPAN_ID, - SpanField.PARENT_ID, - SpanField.START, - SpanField.DURATION, - SpanField.ERROR, - SpanField.ATTRIBUTES, - SpanField.TYPE, - SpanField.LINKS, - SpanField.EVENTS, - SpanField.ENV, - SpanField.VERSION, - SpanField.COMPONENT, - SpanField.KIND)); + private static final Set EXPECTED_SPAN_FIELD_IDS = new HashSet<>(asList( + SpanField.SERVICE, + SpanField.NAME, + SpanField.RESOURCE, + SpanField.SPAN_ID, + SpanField.PARENT_ID, + SpanField.START, + SpanField.DURATION, + SpanField.ERROR, + SpanField.ATTRIBUTES, + SpanField.TYPE, + SpanField.LINKS, + SpanField.EVENTS, + SpanField.ENV, + SpanField.VERSION, + SpanField.COMPONENT, + SpanField.KIND)); // Keep the ProcessTags static in sync with the (per-test rebuilt) Config, the way DDSpecification // did for the original Spock tests. Runs after WithConfigExtension has rebuilt Config. @@ -189,24 +185,23 @@ void payloadContainsExpectedHeaderAndChunkFields() throws IOException { tags.put("attr.string", "value"); tags.put("attr.bool", true); tags.put("attr.number", 12.5d); - PojoSpan span = - new PojoSpan( - "service-a", - "operation-a", - "resource-a", - DDTraceId.ONE, - 123L, - 0L, - 1000L, - 2000L, - 1, - singletonMap(DECISION_MAKER_TAG, "-3"), - tags, - "web", - false, - SAMPLER_KEEP, - 200, - "rum"); + PojoSpan span = new PojoSpan( + "service-a", + "operation-a", + "resource-a", + DDTraceId.ONE, + 123L, + 0L, + 1000L, + 2000L, + 1, + singletonMap(DECISION_MAKER_TAG, "-3"), + tags, + "web", + false, + SAMPLER_KEEP, + 200, + "rum"); byte[] encoded = serializeV1Payload(span); List stringTable = newStringTable(); @@ -326,17 +321,17 @@ void spanLinksAreEncodedFromStructuredSpanLinks() throws IOException { DDTraceId secondLinkTraceId = DDTraceId.fromHex("00000000000000000000000000000001"); long secondLinkSpanId = DDSpanId.fromHex("0000000000000002"); List spanLinks = new ArrayList<>(); - spanLinks.add( - new TestSpanLink( - firstLinkTraceId, - firstLinkSpanId, - (byte) 1, - "dd=s:1", - SpanAttributes.fromMap(firstLinkAttributes))); + spanLinks.add(new TestSpanLink( + firstLinkTraceId, + firstLinkSpanId, + (byte) 1, + "dd=s:1", + SpanAttributes.fromMap(firstLinkAttributes))); spanLinks.add( new TestSpanLink(secondLinkTraceId, secondLinkSpanId, (byte) 0, "", SpanAttributes.EMPTY)); - List links = readFirstSpan(serializeV1Payload(spanWithLinks(spanLinks))).getLinks(); + List links = + readFirstSpan(serializeV1Payload(spanWithLinks(spanLinks))).getLinks(); assertEquals(2, links.size()); V1SpanLink firstLink = links.get(0); diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.java index c3464d47d36..3ada93cfeb5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.java @@ -47,18 +47,17 @@ @Timeout(20) class DDEvpProxyApiTest extends DDCoreJavaSpecification { - static final CiVisibilityWellKnownTags WELL_KNOWN_TAGS = - new CiVisibilityWellKnownTags( - "my-runtime-id", - "my-env", - "my-language", - "my-runtime-name", - "my-runtime-version", - "my-runtime-vendor", - "my-os-arch", - "my-os-platform", - "my-os-version", - "false"); + static final CiVisibilityWellKnownTags WELL_KNOWN_TAGS = new CiVisibilityWellKnownTags( + "my-runtime-id", + "my-env", + "my-language", + "my-runtime-name", + "my-runtime-version", + "my-runtime-vendor", + "my-os-arch", + "my-os-platform", + "my-os-version", + "false"); static final String INTAKE_SUBDOMAIN = "citestcycle-intake"; static final ObjectMapper MSG_PACK_MAPPER = new ObjectMapper(new MessagePackFactory()); @@ -71,25 +70,15 @@ void testSendingAnEmptyListOfTracesReturnsNoErrors() { String evpProxyEndpoint = V2_EVP_PROXY_ENDPOINT; String path = buildAgentEvpProxyPath(evpProxyEndpoint, trackType, apiVersion); JavaTestHttpServer agentEvpProxy = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - path, - api -> { - if (!"application/msgpack" - .equals(api.getRequest().getContentType())) { - api.getResponse() - .status(400) - .send("wrong type: " + api.getRequest().getContentType()); - } else { - api.getResponse().status(200).send(); - } - }))); - DDEvpProxyApi client = - createEvpProxyApi( - agentEvpProxy.getAddress().toString(), evpProxyEndpoint, trackType, false); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.post(path, api -> { + if (!"application/msgpack".equals(api.getRequest().getContentType())) { + api.getResponse().status(400).send("wrong type: " + api.getRequest().getContentType()); + } else { + api.getResponse().status(200).send(); + } + }))); + DDEvpProxyApi client = createEvpProxyApi( + agentEvpProxy.getAddress().toString(), evpProxyEndpoint, trackType, false); Payload payload = prepareTraces(trackType, false, Collections.emptyList()); try { @@ -113,23 +102,16 @@ void testRetriesWhenBackendReturns5xx() { String path = buildAgentEvpProxyPath(evpProxyEndpoint, trackType, apiVersion); int[] retry = {1}; JavaTestHttpServer agentEvpProxy = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - path, - api -> { - if (retry[0] < 5) { - api.getResponse().status(503).send(); - retry[0]++; - } else { - api.getResponse().status(200).send(); - } - }))); - DDEvpProxyApi client = - createEvpProxyApi( - agentEvpProxy.getAddress().toString(), evpProxyEndpoint, trackType, false); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.post(path, api -> { + if (retry[0] < 5) { + api.getResponse().status(503).send(); + retry[0]++; + } else { + api.getResponse().status(200).send(); + } + }))); + DDEvpProxyApi client = createEvpProxyApi( + agentEvpProxy.getAddress().toString(), evpProxyEndpoint, trackType, false); Payload payload = prepareTraces(trackType, false, Collections.emptyList()); try { @@ -301,12 +283,10 @@ private void runContentIsSentAsMsgpackTest( Map expectedRequestBody) throws IOException { String path = buildAgentEvpProxyPath(evpProxyEndpoint, trackType, apiVersion); - JavaTestHttpServer agentEvpProxy = - JavaTestHttpServer.httpServer( - s -> s.handlers(h -> h.post(path, api -> api.getResponse().send()))); - DDEvpProxyApi client = - createEvpProxyApi( - agentEvpProxy.getAddress().toString(), evpProxyEndpoint, trackType, compressionEnabled); + JavaTestHttpServer agentEvpProxy = JavaTestHttpServer.httpServer( + s -> s.handlers(h -> h.post(path, api -> api.getResponse().send()))); + DDEvpProxyApi client = createEvpProxyApi( + agentEvpProxy.getAddress().toString(), evpProxyEndpoint, trackType, compressionEnabled); Payload payload = prepareTraces(trackType, compressionEnabled, traces); try { diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDIntakeApiTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDIntakeApiTest.java index c00f322d9da..7551aff73ab 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDIntakeApiTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/ddintake/DDIntakeApiTest.java @@ -44,18 +44,17 @@ @Timeout(20) class DDIntakeApiTest extends DDCoreJavaSpecification { - static final CiVisibilityWellKnownTags WELL_KNOWN_TAGS = - new CiVisibilityWellKnownTags( - "my-runtime-id", - "my-env", - "my-language", - "my-runtime-name", - "my-runtime-version", - "my-runtime-vendor", - "my-os-arch", - "my-os-platform", - "my-os-version", - "false"); + static final CiVisibilityWellKnownTags WELL_KNOWN_TAGS = new CiVisibilityWellKnownTags( + "my-runtime-id", + "my-env", + "my-language", + "my-runtime-name", + "my-runtime-version", + "my-runtime-vendor", + "my-os-arch", + "my-os-platform", + "my-os-version", + "false"); static final String API_KEY = "my-secret-apikey"; static final ObjectMapper MSG_PACK_MAPPER = new ObjectMapper(new MessagePackFactory()); @@ -66,22 +65,13 @@ void testSendingAnEmptyListOfTracesReturnsNoErrors() { String apiVersion = "v2"; String path = buildIntakePath(trackType, apiVersion); JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - path, - api -> { - if (!"application/msgpack" - .equals(api.getRequest().getContentType())) { - api.getResponse() - .status(400) - .send("wrong type: " + api.getRequest().getContentType()); - } else { - api.getResponse().status(200).send(); - } - }))); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.post(path, api -> { + if (!"application/msgpack".equals(api.getRequest().getContentType())) { + api.getResponse().status(400).send("wrong type: " + api.getRequest().getContentType()); + } else { + api.getResponse().status(200).send(); + } + }))); DDIntakeApi client = createIntakeApi(intake.getAddress().toString(), trackType); Payload payload = prepareTraces(trackType, Collections.emptyList()); @@ -103,20 +93,14 @@ void testRetriesWhenBackendReturns5xx() { String path = buildIntakePath(trackType, apiVersion); int[] retry = {1}; JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - path, - api -> { - if (retry[0] < 5) { - api.getResponse().status(503).send(); - retry[0]++; - } else { - api.getResponse().status(200).send(); - } - }))); + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.post(path, api -> { + if (retry[0] < 5) { + api.getResponse().status(503).send(); + retry[0]++; + } else { + api.getResponse().status(200).send(); + } + }))); DDIntakeApi client = createIntakeApi(intake.getAddress().toString(), trackType); Payload payload = prepareTraces(trackType, Collections.emptyList()); @@ -138,23 +122,14 @@ void testRetriesWhenBackendReturns429TooManyRequests() { String path = buildIntakePath(trackType, apiVersion); int[] retry = {0}; try (JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - path, - api -> { - if (retry[0] < 1) { - api.getResponse() - .status(429) - .addHeader("x-ratelimit-reset", "0") - .send(); - retry[0]++; - } else { - api.getResponse().status(200).send(); - } - })))) { + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.post(path, api -> { + if (retry[0] < 1) { + api.getResponse().status(429).addHeader("x-ratelimit-reset", "0").send(); + retry[0]++; + } else { + api.getResponse().status(200).send(); + } + })))) { DDIntakeApi client = createIntakeApi(intake.getAddress().toString(), trackType); Payload payload = prepareTraces(trackType, Collections.emptyList()); @@ -278,11 +253,8 @@ void testContentIsSentAsMsgpackTestSuiteEndSpan() throws IOException { @Test void testContentIsSentAsMsgpackTestModuleEndSpan() throws IOException { - DDSpan span = - buildSpan( - 1L, - InternalSpanTypes.TEST_MODULE_END, - Collections.singletonMap("test_module_id", 456L)); + DDSpan span = buildSpan( + 1L, InternalSpanTypes.TEST_MODULE_END, Collections.singletonMap("test_module_id", 456L)); span.finish(); setDurationNano(span, 10L); List> traces = Collections.singletonList(Collections.singletonList(span)); @@ -319,9 +291,8 @@ private void runContentIsSentAsMsgpackTest( Map expectedRequestBody) throws IOException { String path = buildIntakePath(trackType, apiVersion); - JavaTestHttpServer intake = - JavaTestHttpServer.httpServer( - s -> s.handlers(h -> h.post(path, api -> api.getResponse().send()))); + JavaTestHttpServer intake = JavaTestHttpServer.httpServer( + s -> s.handlers(h -> h.post(path, api -> api.getResponse().send()))); DDIntakeApi client = createIntakeApi(intake.getAddress().toString(), trackType); Payload payload = prepareTraces(trackType, traces); @@ -383,7 +354,11 @@ static byte[] decompress(byte[] bytes) throws IOException { private DDIntakeApi createIntakeApi(String url, TrackType trackType) { HttpUrl hostUrl = HttpUrl.get(url); - return DDIntakeApi.builder().hostUrl(hostUrl).trackType(trackType).apiKey(API_KEY).build(); + return DDIntakeApi.builder() + .hostUrl(hostUrl) + .trackType(trackType) + .apiKey(API_KEY) + .build(); } private RemoteMapper discoverMapper(TrackType trackType) { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/ApmTracingDisabledChunkMarkerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/ApmTracingDisabledChunkMarkerTest.java index 2450882f4dc..0f5cdde9a67 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/ApmTracingDisabledChunkMarkerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/ApmTracingDisabledChunkMarkerTest.java @@ -49,7 +49,8 @@ void cleanup() { @Test void everyExportedChunkCarriesApmDisabledMarker() throws InterruptedException, TimeoutException { DDSpan root = (DDSpan) tracer.buildSpan("test", "root").start(); - DDSpan child = (DDSpan) tracer.buildSpan("test", "child").asChildOf(root.spanContext()).start(); + DDSpan child = + (DDSpan) tracer.buildSpan("test", "child").asChildOf(root.spanContext()).start(); PendingTrace trace = (PendingTrace) root.spanContext().getTraceCollector(); @@ -89,7 +90,8 @@ void singleChunkTraceCarriesApmDisabledMarker() throws InterruptedException, Tim // Positive control: when the whole trace is exported as a single chunk (child finishes before // the root, so nothing is written until the root closes), the marker is present on every span. DDSpan root = (DDSpan) tracer.buildSpan("test", "root").start(); - DDSpan child = (DDSpan) tracer.buildSpan("test", "child").asChildOf(root.spanContext()).start(); + DDSpan child = + (DDSpan) tracer.buildSpan("test", "child").asChildOf(root.spanContext()).start(); child.finish(); assertTrue(writer.isEmpty(), "trace must not be written while the root is still open"); @@ -108,10 +110,10 @@ void rootlessMultiSpanChunkMarksEverySpan() throws InterruptedException, Timeout // root is written first, then its descendants flush together in a later, root-less chunk. Every // span in that chunk must still carry the marker. DDSpan root = (DDSpan) tracer.buildSpan("test", "root").start(); - DDSpan childA = - (DDSpan) tracer.buildSpan("test", "childA").asChildOf(root.spanContext()).start(); - DDSpan grandchild = - (DDSpan) tracer.buildSpan("test", "grandchild").asChildOf(childA.spanContext()).start(); + DDSpan childA = (DDSpan) + tracer.buildSpan("test", "childA").asChildOf(root.spanContext()).start(); + DDSpan grandchild = (DDSpan) + tracer.buildSpan("test", "grandchild").asChildOf(childA.spanContext()).start(); PendingTrace trace = (PendingTrace) root.spanContext().getTraceCollector(); @@ -146,7 +148,8 @@ void apmTracingEnabledLeavesChunkUnmarked() throws InterruptedException, Timeout // stamped on any span. Guards against a regression that marks unconditionally, ignoring the // apm.tracing.enabled flag. DDSpan root = (DDSpan) tracer.buildSpan("test", "root").start(); - DDSpan child = (DDSpan) tracer.buildSpan("test", "child").asChildOf(root.spanContext()).start(); + DDSpan child = + (DDSpan) tracer.buildSpan("test", "child").asChildOf(root.spanContext()).start(); child.finish(); root.finish(); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/CoreSpanBuilderTest.java b/dd-trace-core/src/test/java/datadog/trace/core/CoreSpanBuilderTest.java index 9d9367551a7..88e2724be59 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/CoreSpanBuilderTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/CoreSpanBuilderTest.java @@ -66,7 +66,8 @@ void setup() { @Test void buildSimpleSpan() { - DDSpan span = (DDSpan) tracer.buildSpan("test", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("test", "op name").withServiceName("foo").start(); assertEquals("op name", span.getOperationName()); } @@ -91,7 +92,8 @@ void buildComplexSpan() { assertEquals(entry.getValue(), span.getTags().get(entry.getKey())); } - span = (DDSpan) tracer.buildSpan("test", expectedName).withServiceName("foo").start(); + span = + (DDSpan) tracer.buildSpan("test", expectedName).withServiceName("foo").start(); Map expectedTags = new HashMap<>(); expectedTags.put(THREAD_NAME, Thread.currentThread().getName()); @@ -107,16 +109,14 @@ void buildComplexSpan() { String expectedService = "fakeService"; String expectedType = "fakeType"; - span = - (DDSpan) - tracer - .buildSpan("test", expectedName) - .withServiceName("foo") - .withResourceName(expectedResource) - .withServiceName(expectedService) - .withErrorFlag() - .withSpanType(expectedType) - .start(); + span = (DDSpan) tracer + .buildSpan("test", expectedName) + .withServiceName("foo") + .withResourceName(expectedResource) + .withServiceName(expectedService) + .withErrorFlag() + .withSpanType(expectedType) + .start(); DDSpanContext spanContext = span.spanContext(); @@ -134,13 +134,11 @@ void buildComplexSpan() { "empty tag | empty.tag | '' " }) void settingNameShouldRemove(String name, String value) { - DDSpan span = - (DDSpan) - tracer - .buildSpan("test", "op name") - .withTag(name, "tag value") - .withTag(name, value) - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("test", "op name") + .withTag(name, "tag value") + .withTag(name, value) + .start(); assertNull(span.getTags().get(name)); @@ -156,18 +154,17 @@ void shouldBuildSpanTimestampInNano() { long expectedTimestamp = 487517802L * 1000 * 1000L; String expectedName = "fakeName"; - DDSpan span = - (DDSpan) - tracer - .buildSpan("test", expectedName) - .withServiceName("foo") - .withStartTimestamp(expectedTimestamp) - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("test", expectedName) + .withServiceName("foo") + .withStartTimestamp(expectedTimestamp) + .start(); assertEquals(expectedTimestamp * 1000L, span.getStartTime()); long start = System.currentTimeMillis(); - span = (DDSpan) tracer.buildSpan("test", expectedName).withServiceName("foo").start(); + span = + (DDSpan) tracer.buildSpan("test", expectedName).withServiceName("foo").start(); long stop = System.currentTimeMillis(); assertTrue(span.getStartTime() >= MILLISECONDS.toNanos(start - 1)); @@ -188,13 +185,11 @@ void shouldLinkToParentSpan() { when(mockedContext.getTraceCollector()).thenReturn(tracer.createTraceCollector(DDTraceId.ONE)); when(mockedContext.getPathwayContext()).thenReturn(NoopPathwayContext.INSTANCE); - DDSpan span = - (DDSpan) - tracer - .buildSpan("test", "fakeName") - .withServiceName("foo") - .asChildOf(mockedContext) - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("test", "fakeName") + .withServiceName("foo") + .asChildOf(mockedContext) + .start(); DDSpanContext actualSpanContext = span.spanContext(); assertEquals(expectedParentId, actualSpanContext.getParentId()); @@ -210,15 +205,15 @@ void shouldLinkToParentSpan() { }) void shouldLinkToParentSpanImplicitly( boolean noopParent, String serviceName, boolean expectTopLevel) { - try (AgentScope parent = - tracer.activateSpan( - noopParent - ? noopSpan() - : tracer.buildSpan("test", "parent").withServiceName("service").start())) { - long expectedParentId = noopParent ? DDSpanId.ZERO : parent.span().spanContext().getSpanId(); + try (AgentScope parent = tracer.activateSpan( + noopParent + ? noopSpan() + : tracer.buildSpan("test", "parent").withServiceName("service").start())) { + long expectedParentId = + noopParent ? DDSpanId.ZERO : parent.span().spanContext().getSpanId(); - DDSpan span = - (DDSpan) tracer.buildSpan("test", "fakeName").withServiceName(serviceName).start(); + DDSpan span = (DDSpan) + tracer.buildSpan("test", "fakeName").withServiceName(serviceName).start(); DDSpanContext actualSpanContext = span.spanContext(); assertEquals(expectedParentId, actualSpanContext.getParentId()); @@ -238,25 +233,21 @@ void shouldInheritTheDDParentAttributes() { String expectedBaggageItemKey = "fakeKey"; String expectedBaggageItemValue = "fakeValue"; - DDSpan parent = - (DDSpan) - tracer - .buildSpan("test", expectedName) - .withServiceName("foo") - .withResourceName(expectedParentResourceName) - .withSpanType(expectedParentType) - .start(); + DDSpan parent = (DDSpan) tracer + .buildSpan("test", expectedName) + .withServiceName("foo") + .withResourceName(expectedParentResourceName) + .withSpanType(expectedParentType) + .start(); parent.setBaggageItem(expectedBaggageItemKey, expectedBaggageItemValue); // ServiceName and SpanType are always set by the parent if they are not present in the child - DDSpan span = - (DDSpan) - tracer - .buildSpan("test", expectedName) - .withServiceName(expectedParentServiceName) - .asChildOf(parent) - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("test", expectedName) + .withServiceName(expectedParentServiceName) + .asChildOf(parent) + .start(); assertEquals(expectedName, span.getOperationName()); assertEquals(expectedBaggageItemValue, span.getBaggageItem(expectedBaggageItemKey)); @@ -266,15 +257,13 @@ void shouldInheritTheDDParentAttributes() { assertTrue(span.isTopLevel()); // service names differ between parent and child // ServiceName and SpanType are always overwritten by the child if they are present - span = - (DDSpan) - tracer - .buildSpan("test", expectedName) - .withServiceName(expectedChildServiceName) - .withResourceName(expectedChildResourceName) - .withSpanType(expectedChildType) - .asChildOf(parent) - .start(); + span = (DDSpan) tracer + .buildSpan("test", expectedName) + .withServiceName(expectedChildServiceName) + .withResourceName(expectedChildResourceName) + .withSpanType(expectedChildType) + .asChildOf(parent) + .start(); assertEquals(expectedName, span.getOperationName()); assertEquals(expectedBaggageItemValue, span.getBaggageItem(expectedBaggageItemKey)); @@ -288,17 +277,16 @@ void shouldTrackAllSpansInTrace() { int nbSamples = 10; List spans = new ArrayList<>(); - DDSpan root = (DDSpan) tracer.buildSpan("test", "fake_O").withServiceName("foo").start(); + DDSpan root = + (DDSpan) tracer.buildSpan("test", "fake_O").withServiceName("foo").start(); DDSpan lastSpan = root; for (int i = 1; i <= 10; i++) { - lastSpan = - (DDSpan) - tracer - .buildSpan("test", "fake_" + i) - .withServiceName("foo") - .asChildOf(lastSpan) - .start(); + lastSpan = (DDSpan) tracer + .buildSpan("test", "fake_" + i) + .withServiceName("foo") + .asChildOf(lastSpan) + .start(); spans.add(lastSpan); lastSpan.finish(); } @@ -308,10 +296,9 @@ void shouldTrackAllSpansInTrace() { assertEquals(nbSamples, traceCollector.size()); assertTrue(traceCollector.getSpans().containsAll(spans)); DDSpan randomSpan = spans.get((int) (Math.random() * nbSamples)); - assertTrue( - ((PendingTrace) randomSpan.spanContext().getTraceCollector()) - .getSpans() - .containsAll(spans)); + assertTrue(((PendingTrace) randomSpan.spanContext().getTraceCollector()) + .getSpans() + .containsAll(spans)); } static Stream extractedContextShouldPopulateNewSpanDetailsArguments() { @@ -348,7 +335,8 @@ static Stream extractedContextShouldPopulateNewSpanDetailsArgu @MethodSource("extractedContextShouldPopulateNewSpanDetailsArguments") void extractedContextShouldPopulateNewSpanDetails(ExtractedContext extractedContext) { Thread thread = Thread.currentThread(); - DDSpan span = (DDSpan) tracer.buildSpan("test", "op name").asChildOf(extractedContext).start(); + DDSpan span = + (DDSpan) tracer.buildSpan("test", "op name").asChildOf(extractedContext).start(); assertEquals(extractedContext.getTraceId(), span.getTraceId()); assertEquals(extractedContext.getSpanId(), span.getParentId()); @@ -365,22 +353,22 @@ void extractedContextShouldPopulateNewSpanDetails(ExtractedContext extractedCont @Test @WithConfig(key = "trace.propagation.behavior.extract", value = "restart") void buildContextFromExtractedContextWithRestartBehavior() { - ExtractedContext extractedContext = - new ExtractedContext( - DDTraceId.ONE, - 2, - PrioritySampling.SAMPLER_DROP, - null, - 0, - Collections.emptyMap(), - Collections.emptyMap(), - null, - PropagationTags.factory() - .fromHeaderValue( - PropagationTags.HeaderType.DATADOG, "_dd.p.dm=934086a686-4,_dd.p.anytag=value"), - null, - DATADOG); - DDSpan span = (DDSpan) tracer.buildSpan("test", "op name").asChildOf(extractedContext).start(); + ExtractedContext extractedContext = new ExtractedContext( + DDTraceId.ONE, + 2, + PrioritySampling.SAMPLER_DROP, + null, + 0, + Collections.emptyMap(), + Collections.emptyMap(), + null, + PropagationTags.factory() + .fromHeaderValue( + PropagationTags.HeaderType.DATADOG, "_dd.p.dm=934086a686-4,_dd.p.anytag=value"), + null, + DATADOG); + DDSpan span = + (DDSpan) tracer.buildSpan("test", "op name").asChildOf(extractedContext).start(); assertNotEquals(extractedContext.getTraceId(), span.getTraceId()); assertNotEquals(extractedContext.getSpanId(), span.getParentId()); @@ -399,22 +387,22 @@ void buildContextFromExtractedContextWithRestartBehavior() { @Test @WithConfig(key = "trace.propagation.behavior.extract", value = "ignore") void buildContextFromExtractedContextWithIgnoreBehavior() { - ExtractedContext extractedContext = - new ExtractedContext( - DDTraceId.ONE, - 2, - PrioritySampling.SAMPLER_DROP, - null, - 0, - Collections.emptyMap(), - Collections.emptyMap(), - null, - PropagationTags.factory() - .fromHeaderValue( - PropagationTags.HeaderType.DATADOG, "_dd.p.dm=934086a686-4,_dd.p.anytag=value"), - null, - DATADOG); - DDSpan span = (DDSpan) tracer.buildSpan("test", "op name").asChildOf(extractedContext).start(); + ExtractedContext extractedContext = new ExtractedContext( + DDTraceId.ONE, + 2, + PrioritySampling.SAMPLER_DROP, + null, + 0, + Collections.emptyMap(), + Collections.emptyMap(), + null, + PropagationTags.factory() + .fromHeaderValue( + PropagationTags.HeaderType.DATADOG, "_dd.p.dm=934086a686-4,_dd.p.anytag=value"), + null, + DATADOG); + DDSpan span = + (DDSpan) tracer.buildSpan("test", "op name").asChildOf(extractedContext).start(); assertNotEquals(extractedContext.getTraceId(), span.getTraceId()); assertNotEquals(extractedContext.getSpanId(), span.getParentId()); @@ -427,12 +415,12 @@ void buildContextFromExtractedContextWithIgnoreBehavior() { void appSecContextPreservedFromTagContextWithIgnoreBehavior() { Object appSecData = new Object(); Object iastData = new Object(); - TagContext tagContext = - new TagContext() - .withRequestContextDataAppSec(appSecData) - .withRequestContextDataIast(iastData); + TagContext tagContext = new TagContext() + .withRequestContextDataAppSec(appSecData) + .withRequestContextDataIast(iastData); - DDSpan span = (DDSpan) tracer.buildSpan("test", "op name").asChildOf(tagContext).start(); + DDSpan span = + (DDSpan) tracer.buildSpan("test", "op name").asChildOf(tagContext).start(); assertEquals(appSecData, span.getRequestContext().getData(RequestContextSlot.APPSEC)); assertEquals(iastData, span.getRequestContext().getData(RequestContextSlot.IAST)); @@ -444,12 +432,12 @@ void appSecContextPreservedFromTagContextWithIgnoreBehavior() { void appSecContextPreservedFromTagContextWithRestartBehavior() { Object appSecData = new Object(); Object iastData = new Object(); - TagContext tagContext = - new TagContext() - .withRequestContextDataAppSec(appSecData) - .withRequestContextDataIast(iastData); + TagContext tagContext = new TagContext() + .withRequestContextDataAppSec(appSecData) + .withRequestContextDataIast(iastData); - DDSpan span = (DDSpan) tracer.buildSpan("test", "op name").asChildOf(tagContext).start(); + DDSpan span = + (DDSpan) tracer.buildSpan("test", "op name").asChildOf(tagContext).start(); assertEquals(appSecData, span.getRequestContext().getData(RequestContextSlot.APPSEC)); assertEquals(iastData, span.getRequestContext().getData(RequestContextSlot.IAST)); @@ -465,7 +453,8 @@ void tagContextShouldPopulateDefaultSpanDetails( String scenario, String origin, Map tagMap) { Thread thread = Thread.currentThread(); TagContext tagContext = new TagContext(origin, TagMap.fromMap(tagMap)); - DDSpan span = (DDSpan) tracer.buildSpan("test", "op name").asChildOf(tagContext).start(); + DDSpan span = + (DDSpan) tracer.buildSpan("test", "op name").asChildOf(tagContext).start(); assertNotEquals(DDTraceId.ZERO, span.getTraceId()); assertEquals(DDSpanId.ZERO, span.getParentId()); @@ -507,7 +496,8 @@ static Stream globalSpanTagsPopulatedOnEachSpanArguments() { void globalSpanTagsPopulatedOnEachSpan(String tagString, Map tags) { injectSysConfig("dd.trace.span.tags", tagString); CoreTracer customTracer = tracerBuilder().writer(writer).build(); - DDSpan span = (DDSpan) customTracer.buildSpan("test", "op name").withServiceName("foo").start(); + DDSpan span = (DDSpan) + customTracer.buildSpan("test", "op name").withServiceName("foo").start(); Map expectedTags = new HashMap<>(tags); expectedTags.put(THREAD_NAME, Thread.currentThread().getName()); @@ -528,14 +518,13 @@ void canOverwriteRequestContextDataWithBuilderFromEmpty() { assertNull(span1.getRequestContext().getData(RequestContextSlot.CI_VISIBILITY)); assertNull(span1.getRequestContext().getData(RequestContextSlot.IAST)); - AgentSpan span2 = - tracer - .buildSpan("test", "span2") - .asChildOf(span1.spanContext()) - .withRequestContextData(RequestContextSlot.APPSEC, "override") - .withRequestContextData(RequestContextSlot.CI_VISIBILITY, "override") - .withRequestContextData(RequestContextSlot.IAST, "override") - .start(); + AgentSpan span2 = tracer + .buildSpan("test", "span2") + .asChildOf(span1.spanContext()) + .withRequestContextData(RequestContextSlot.APPSEC, "override") + .withRequestContextData(RequestContextSlot.CI_VISIBILITY, "override") + .withRequestContextData(RequestContextSlot.IAST, "override") + .start(); assertEquals("override", span2.getRequestContext().getData(RequestContextSlot.APPSEC)); assertEquals("override", span2.getRequestContext().getData(RequestContextSlot.CI_VISIBILITY)); @@ -547,27 +536,26 @@ void canOverwriteRequestContextDataWithBuilderFromEmpty() { @Test void canOverwriteRequestContextDataWithBuilder() { - TagContext context = - new TagContext() - .withCiVisibilityContextData("value") - .withRequestContextDataIast("value") - .withRequestContextDataAppSec("value"); + TagContext context = new TagContext() + .withCiVisibilityContextData("value") + .withRequestContextDataIast("value") + .withRequestContextDataAppSec("value"); AgentSpan span1 = tracer.buildSpan("test", "span1").asChildOf(context).start(); - AgentSpan span2 = tracer.buildSpan("test", "span2").asChildOf(span1.spanContext()).start(); + AgentSpan span2 = + tracer.buildSpan("test", "span2").asChildOf(span1.spanContext()).start(); assertEquals("value", span2.getRequestContext().getData(RequestContextSlot.APPSEC)); assertEquals("value", span2.getRequestContext().getData(RequestContextSlot.CI_VISIBILITY)); assertEquals("value", span2.getRequestContext().getData(RequestContextSlot.IAST)); - AgentSpan span3 = - tracer - .buildSpan("test", "span3") - .asChildOf(span2.spanContext()) - .withRequestContextData(RequestContextSlot.APPSEC, "override") - .withRequestContextData(RequestContextSlot.CI_VISIBILITY, "override") - .withRequestContextData(RequestContextSlot.IAST, "override") - .start(); + AgentSpan span3 = tracer + .buildSpan("test", "span3") + .asChildOf(span2.spanContext()) + .withRequestContextData(RequestContextSlot.APPSEC, "override") + .withRequestContextData(RequestContextSlot.CI_VISIBILITY, "override") + .withRequestContextData(RequestContextSlot.IAST, "override") + .start(); assertEquals("override", span3.getRequestContext().getData(RequestContextSlot.APPSEC)); assertEquals("override", span3.getRequestContext().getData(RequestContextSlot.CI_VISIBILITY)); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java index db850470da0..7ec82f164b2 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest.java @@ -91,7 +91,8 @@ void verifyDefaultsOnTracer() { // even though wall-clock time has moved on by hours. Without a resync, span timestamps // computed from that near-frozen nanoTicks stay anchored to construction time. SnapStartTimeSource timeSource = new SnapStartTimeSource(SNAPSTART_CONSTRUCTION_TIME_NANOS); - CoreTracer tracer = tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); + CoreTracer tracer = + tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); try { long constructionTimeNanoTicks = timeSource.getNanoTicks(); @@ -112,7 +113,8 @@ void verifyDefaultsOnTracer() { void maybeResyncClockForLambdaInvocation_whenEnabledAndCalledAfterSimulatedRestore_thenTimestampReflectsPostRestoreTime() { SnapStartTimeSource timeSource = new SnapStartTimeSource(SNAPSTART_CONSTRUCTION_TIME_NANOS); - CoreTracer tracer = tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); + CoreTracer tracer = + tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); try { // The restore happens: wall-clock jumps forward by 2 hours, nanoTicks barely moves. timeSource.simulateSnapStartRestore(TimeUnit.HOURS.toNanos(2)); @@ -137,7 +139,8 @@ void notifyLambdaStart_whenExplicitlyEnabled_thenResyncsClockToCurrentTime() { // created - the actual trigger point for the resync in production, not just the extracted // maybeResyncClockForLambdaInvocation() logic exercised directly above. SnapStartTimeSource timeSource = new SnapStartTimeSource(SNAPSTART_CONSTRUCTION_TIME_NANOS); - CoreTracer tracer = tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); + CoreTracer tracer = + tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); try { timeSource.simulateSnapStartRestore(TimeUnit.HOURS.toNanos(2)); long postRestoreNanos = timeSource.getCurrentTimeNanos(); @@ -156,7 +159,8 @@ void notifyLambdaStart_whenExplicitlyEnabled_thenResyncsClockToCurrentTime() { void notifyLambdaStart_whenResyncDefaultsToDisabled_thenTimestampStaysAnchoredToConstructionTime() { SnapStartTimeSource timeSource = new SnapStartTimeSource(SNAPSTART_CONSTRUCTION_TIME_NANOS); - CoreTracer tracer = tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); + CoreTracer tracer = + tracerBuilder().writer(new ListWriter()).timeSource(timeSource).build(); try { long constructionTimeNanoTicks = timeSource.getNanoTicks(); timeSource.simulateSnapStartRestore(TimeUnit.HOURS.toNanos(2)); @@ -333,7 +337,8 @@ void rootTagsAppliedOnlyToRootSpans() { localRootSpanTags.put("only_root", "value"); CoreTracer tracer = tracerBuilder().localRootSpanTags(localRootSpanTags).build(); AgentSpan root = tracer.buildSpan("datadog", "my_root").start(); - AgentSpan child = tracer.buildSpan("datadog", "my_child").asChildOf(root.spanContext()).start(); + AgentSpan child = + tracer.buildSpan("datadog", "my_child").asChildOf(root.spanContext()).start(); try { assertTrue(root.getTags().containsKey("only_root")); assertFalse(child.getTags().containsKey("only_root")); @@ -364,8 +369,8 @@ void prioritySamplingSetWhenChildSpanComplete() throws Exception { CoreTracer tracer = tracerBuilder().writer(writer).build(); try { DDSpan root = (DDSpan) tracer.buildSpan("datadog", "operation").start(); - DDSpan child = - (DDSpan) tracer.buildSpan("datadog", "my_child").asChildOf(root.spanContext()).start(); + DDSpan child = (DDSpan) + tracer.buildSpan("datadog", "my_child").asChildOf(root.spanContext()).start(); root.finish(); assertNull(root.getSamplingPriority()); @@ -387,16 +392,17 @@ void verifyConfigurationPolling() throws Exception { SharedCommunicationObjects sco = createScoWithPoller(poller); ProductListener[] capturedUpdater = {null}; - doAnswer( - inv -> { - capturedUpdater[0] = inv.getArgument(1, ProductListener.class); - return null; - }) + doAnswer(inv -> { + capturedUpdater[0] = inv.getArgument(1, ProductListener.class); + return null; + }) .when(poller) .addListener(eq(Product.APM_TRACING), any(ProductListener.class)); - CoreTracer tracer = - CoreTracer.builder().sharedCommunicationObjects(sco).pollForTracingConfiguration().build(); + CoreTracer tracer = CoreTracer.builder() + .sharedCommunicationObjects(sco) + .pollForTracingConfiguration() + .build(); unclosedTracers.add(tracer); try { @@ -407,40 +413,39 @@ void verifyConfigurationPolling() throws Exception { assertEquals(Collections.emptyMap(), tracer.captureTraceConfig().getResponseHeaderTags()); assertNull(tracer.captureTraceConfig().getTraceSampleRate()); - String json = - "{\n" - + " \"lib_config\":\n" - + " {\n" - + " \"tracing_service_mapping\":\n" - + " [{\n" - + " \"from_key\": \"foobar\",\n" - + " \"to_name\": \"bar\"\n" - + " }, {\n" - + " \"from_key\": \"snafu\",\n" - + " \"to_name\": \"foo\"\n" - + " }]\n" - + " ,\n" - + " \"tracing_header_tags\":\n" - + " [{\n" - + " \"header\": \"Cookie\",\n" - + " \"tag_name\": \"\"\n" - + " }, {\n" - + " \"header\": \"Referer\",\n" - + " \"tag_name\": \"http.referer\"\n" - + " }, {\n" - + " \"header\": \" Some.Header \",\n" - + " \"tag_name\": \"\"\n" - + " }, {\n" - + " \"header\": \"C!!!ont_____ent----tYp!/!e\",\n" - + " \"tag_name\": \"\"\n" - + " }, {\n" - + " \"header\": \"this.header\",\n" - + " \"tag_name\": \"whatever.the.user.wants.this.header\"\n" - + " }]\n" - + " ,\n" - + " \"tracing_sampling_rate\": 0.5\n" - + " }\n" - + "}"; + String json = "{\n" + + " \"lib_config\":\n" + + " {\n" + + " \"tracing_service_mapping\":\n" + + " [{\n" + + " \"from_key\": \"foobar\",\n" + + " \"to_name\": \"bar\"\n" + + " }, {\n" + + " \"from_key\": \"snafu\",\n" + + " \"to_name\": \"foo\"\n" + + " }]\n" + + " ,\n" + + " \"tracing_header_tags\":\n" + + " [{\n" + + " \"header\": \"Cookie\",\n" + + " \"tag_name\": \"\"\n" + + " }, {\n" + + " \"header\": \"Referer\",\n" + + " \"tag_name\": \"http.referer\"\n" + + " }, {\n" + + " \"header\": \" Some.Header \",\n" + + " \"tag_name\": \"\"\n" + + " }, {\n" + + " \"header\": \"C!!!ont_____ent----tYp!/!e\",\n" + + " \"tag_name\": \"\"\n" + + " }, {\n" + + " \"header\": \"this.header\",\n" + + " \"tag_name\": \"whatever.the.user.wants.this.header\"\n" + + " }]\n" + + " ,\n" + + " \"tracing_sampling_rate\": 0.5\n" + + " }\n" + + "}"; capturedUpdater[0].accept(key, json.getBytes(StandardCharsets.UTF_8), null); capturedUpdater[0].commit(null); @@ -448,22 +453,20 @@ void verifyConfigurationPolling() throws Exception { Map expectedServiceMapping = buildStringMap("foobar", "bar", "snafu", "foo"); assertEquals(expectedServiceMapping, tracer.captureTraceConfig().getServiceMapping()); - Map expectedRequestHeaderTags = - buildStringMap( - "cookie", "http.request.headers.cookie", - "referer", "http.referer", - "some.header", "http.request.headers.some_header", - "c!!!ont_____ent----typ!/!e", "http.request.headers.c___ont_____ent----typ_/_e", - "this.header", "whatever.the.user.wants.this.header"); + Map expectedRequestHeaderTags = buildStringMap( + "cookie", "http.request.headers.cookie", + "referer", "http.referer", + "some.header", "http.request.headers.some_header", + "c!!!ont_____ent----typ!/!e", "http.request.headers.c___ont_____ent----typ_/_e", + "this.header", "whatever.the.user.wants.this.header"); assertEquals(expectedRequestHeaderTags, tracer.captureTraceConfig().getRequestHeaderTags()); - Map expectedResponseHeaderTags = - buildStringMap( - "cookie", "http.response.headers.cookie", - "referer", "http.referer", - "some.header", "http.response.headers.some_header", - "c!!!ont_____ent----typ!/!e", "http.response.headers.c___ont_____ent----typ_/_e", - "this.header", "whatever.the.user.wants.this.header"); + Map expectedResponseHeaderTags = buildStringMap( + "cookie", "http.response.headers.cookie", + "referer", "http.referer", + "some.header", "http.response.headers.some_header", + "c!!!ont_____ent----typ!/!e", "http.response.headers.c___ont_____ent----typ_/_e", + "this.header", "whatever.the.user.wants.this.header"); assertEquals(expectedResponseHeaderTags, tracer.captureTraceConfig().getResponseHeaderTags()); assertEquals(0.5, tracer.captureTraceConfig().getTraceSampleRate(), 0.0001); @@ -496,16 +499,17 @@ void verifyConfigurationPollingWithCustomTags( SharedCommunicationObjects sco = createScoWithPoller(poller); ProductListener[] capturedUpdater = {null}; - doAnswer( - inv -> { - capturedUpdater[0] = inv.getArgument(1, ProductListener.class); - return null; - }) + doAnswer(inv -> { + capturedUpdater[0] = inv.getArgument(1, ProductListener.class); + return null; + }) .when(poller) .addListener(eq(Product.APM_TRACING), any(ProductListener.class)); - CoreTracer tracer = - CoreTracer.builder().sharedCommunicationObjects(sco).pollForTracingConfiguration().build(); + CoreTracer tracer = CoreTracer.builder() + .sharedCommunicationObjects(sco) + .pollForTracingConfiguration() + .build(); unclosedTracers.add(tracer); try { @@ -529,18 +533,17 @@ void verifyConfigurationPollingWithCustomTags( } } - static final String ACTION_JSON = - "'{\"action\": \"enable\", \"lib_config\":" - + "{\"tracing_sampling_rate\": null," - + " \"log_injection_enabled\": null, " - + "\"tracing_header_tags\": null," - + " \"runtime_metrics_enabled\": null," - + "\"tracing_debug\": null," - + " \"tracing_service_mapping\": null," - + "\"tracing_sampling_rules\": null," - + " \"span_sampling_rules\": null," - + "\"data_streams_enabled\": null," - + " \"tracing_enabled\": false}}'"; + static final String ACTION_JSON = "'{\"action\": \"enable\", \"lib_config\":" + + "{\"tracing_sampling_rate\": null," + + " \"log_injection_enabled\": null, " + + "\"tracing_header_tags\": null," + + " \"runtime_metrics_enabled\": null," + + "\"tracing_debug\": null," + + " \"tracing_service_mapping\": null," + + "\"tracing_sampling_rules\": null," + + " \"span_sampling_rules\": null," + + "\"data_streams_enabled\": null," + + " \"tracing_enabled\": false}}'"; @TableTest({ "scenario | json | expectedValue", @@ -556,16 +559,17 @@ void verifyConfigurationPollingWithTracingEnabled( SharedCommunicationObjects sco = createScoWithPoller(poller); ProductListener[] capturedUpdater = {null}; - doAnswer( - inv -> { - capturedUpdater[0] = inv.getArgument(1, ProductListener.class); - return null; - }) + doAnswer(inv -> { + capturedUpdater[0] = inv.getArgument(1, ProductListener.class); + return null; + }) .when(poller) .addListener(eq(Product.APM_TRACING), any(ProductListener.class)); - CoreTracer tracer = - CoreTracer.builder().sharedCommunicationObjects(sco).pollForTracingConfiguration().build(); + CoreTracer tracer = CoreTracer.builder() + .sharedCommunicationObjects(sco) + .pollForTracingConfiguration() + .build(); unclosedTracers.add(tracer); try { @@ -588,7 +592,8 @@ void verifyConfigurationPollingWithTracingEnabled( "with pref | some | some " }) void testLocalRootServiceNameOverride(String preferred, String expected) { - CoreTracer tracer = tracerBuilder().writer(new ListWriter()).serviceName("test").build(); + CoreTracer tracer = + tracerBuilder().writer(new ListWriter()).serviceName("test").build(); tracer.updatePreferredServiceName(preferred, preferred); try { DDSpan span = (DDSpan) tracer.startSpan("", "test"); @@ -609,9 +614,10 @@ void testDdVersionExistsOnlyIfServiceEqDdService() { TagsPostProcessorFactory.withAddInternalTags(true); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); try { - DDSpan span = - (DDSpan) - tracer.buildSpan("datadog", "def").withTag(GeneralConfig.SERVICE_NAME, "foo").start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "def") + .withTag(GeneralConfig.SERVICE_NAME, "foo") + .start(); span.finish(); assertEquals("foo", span.getServiceName()); assertFalse(span.getTags().containsKey("version")); @@ -650,16 +656,17 @@ void verifyNoFilteringOfServiceEnvWhenMismatchedWithDdServiceDdEnv( SharedCommunicationObjects sco = createScoWithPoller(poller); ProductListener[] capturedUpdater = {null}; - doAnswer( - inv -> { - capturedUpdater[0] = inv.getArgument(1, ProductListener.class); - return null; - }) + doAnswer(inv -> { + capturedUpdater[0] = inv.getArgument(1, ProductListener.class); + return null; + }) .when(poller) .addListener(eq(Product.APM_TRACING), any(ProductListener.class)); - CoreTracer tracer = - CoreTracer.builder().sharedCommunicationObjects(sco).pollForTracingConfiguration().build(); + CoreTracer tracer = CoreTracer.builder() + .sharedCommunicationObjects(sco) + .pollForTracingConfiguration() + .build(); unclosedTracers.add(tracer); try { @@ -667,12 +674,11 @@ void verifyNoFilteringOfServiceEnvWhenMismatchedWithDdServiceDdEnv( assertNotNull(capturedUpdater[0]); assertEquals(Collections.emptyMap(), tracer.captureTraceConfig().getServiceMapping()); - String json = - String.format( - "{\"service_target\":{\"service\":\"%s\",\"env\":\"%s\"}," - + "\"lib_config\":{\"tracing_service_mapping\":" - + "[{\"from_key\":\"foobar\",\"to_name\":\"bar\"}]}}", - targetService, targetEnv); + String json = String.format( + "{\"service_target\":{\"service\":\"%s\",\"env\":\"%s\"}," + + "\"lib_config\":{\"tracing_service_mapping\":" + + "[{\"from_key\":\"foobar\",\"to_name\":\"bar\"}]}}", + targetService, targetEnv); capturedUpdater[0].accept(key, json.getBytes(StandardCharsets.UTF_8), null); capturedUpdater[0].commit(null); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest2.java b/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest2.java index 7e6ddaf8d71..04354a3ec71 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest2.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/CoreTracerTest2.java @@ -233,15 +233,12 @@ public void interceptAlteredList() { // This is an unlikely case and arguably not something we need to support DDSpan substituteSpan = (DDSpan) TRACER.startSpan("sub", "sub"); - TraceInterceptors interceptors = - interceptors( - (list) -> list, - (list) -> { - List erasedList = (List) list; - erasedList.clear(); - erasedList.add(substituteSpan); - return erasedList; - }); + TraceInterceptors interceptors = interceptors((list) -> list, (list) -> { + List erasedList = (List) list; + erasedList.clear(); + erasedList.add(substituteSpan); + return erasedList; + }); DDSpan span = (DDSpan) TRACER.startSpan("foo", "foo"); SpanList list = SpanList.of(span); @@ -257,19 +254,18 @@ static final TraceInterceptors interceptors(TestInterceptor... interceptors) { int priority = i; TestInterceptor interceptor = interceptors[i]; - traceInterceptors.add( - new TraceInterceptor() { - @Override - public int priority() { - return priority; - } - - @Override - public Collection onTraceComplete( - Collection trace) { - return interceptor.onTraceComplete(trace); - } - }); + traceInterceptors.add(new TraceInterceptor() { + @Override + public int priority() { + return priority; + } + + @Override + public Collection onTraceComplete( + Collection trace) { + return interceptor.onTraceComplete(trace); + } + }); } return traceInterceptors; } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java b/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java index c3122aa6a31..dd121ccf90a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java @@ -99,33 +99,32 @@ protected DDSpan buildSpan( byte prioritySampling, Object ciVisibilityContextData) { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1L, - DDSpanId.ZERO, - null, - null, - "fakeService", - "fakeOperation", - "fakeResource", - prioritySampling, - null, - Collections.emptyMap(), - null, - false, - spanType, - 0, - tracer.createTraceCollector(DDTraceId.ONE), - null, - null, - ciVisibilityContextData, - NoopPathwayContext.INSTANCE, - false, - propagationTags, - ProfilingContextIntegration.NoOp.INSTANCE, - true, - true); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1L, + DDSpanId.ZERO, + null, + null, + "fakeService", + "fakeOperation", + "fakeResource", + prioritySampling, + null, + Collections.emptyMap(), + null, + false, + spanType, + 0, + tracer.createTraceCollector(DDTraceId.ONE), + null, + null, + ciVisibilityContextData, + NoopPathwayContext.INSTANCE, + false, + propagationTags, + ProfilingContextIntegration.NoOp.INSTANCE, + true, + true); DDSpan span = DDSpan.create("test", timestamp, context, null); for (Map.Entry entry : tags.entrySet()) { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextPropagationTagsTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextPropagationTagsTest.java index 522b0da3463..ea484ad4876 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextPropagationTagsTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextPropagationTagsTest.java @@ -50,14 +50,14 @@ void updateSpanPropagationTags( int newMechanism, String newHeader, Map tagMap) { - PropagationTags propagationTags = - tracer - .getPropagationTagsFactory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); - AgentSpanContext extracted = - new ExtractedContext(DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) - .withRequestContextDataAppSec("dummy"); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); + PropagationTags propagationTags = tracer + .getPropagationTagsFactory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); + AgentSpanContext extracted = new ExtractedContext( + DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) + .withRequestContextDataAppSec("dummy"); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); PropagationTags dd = span.spanContext().getPropagationTags(); span.setSamplingPriority(newPriority, newMechanism); @@ -82,17 +82,17 @@ void updateTracePropagationTags( int newMechanism, String rootHeader, Map rootTagMap) { - PropagationTags propagationTags = - tracer - .getPropagationTagsFactory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); - AgentSpanContext extracted = - new ExtractedContext(DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) - .withRequestContextDataAppSec("dummy"); - DDSpan rootSpan = (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); + PropagationTags propagationTags = tracer + .getPropagationTagsFactory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); + AgentSpanContext extracted = new ExtractedContext( + DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) + .withRequestContextDataAppSec("dummy"); + DDSpan rootSpan = + (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); PropagationTags ddRoot = rootSpan.spanContext().getPropagationTags(); - DDSpan span = - (DDSpan) tracer.buildSpan("datadog", "current").asChildOf(rootSpan.spanContext()).start(); + DDSpan span = (DDSpan) + tracer.buildSpan("datadog", "current").asChildOf(rootSpan.spanContext()).start(); span.setSamplingPriority(newPriority, newMechanism); @@ -108,14 +108,14 @@ void updateTracePropagationTags( }) void forceKeepSpanPropagationTags( String scenario, int priority, String header, String newHeader, Map tagMap) { - PropagationTags propagationTags = - tracer - .getPropagationTagsFactory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); - AgentSpanContext extracted = - new ExtractedContext(DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) - .withRequestContextDataAppSec("dummy"); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); + PropagationTags propagationTags = tracer + .getPropagationTagsFactory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); + AgentSpanContext extracted = new ExtractedContext( + DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) + .withRequestContextDataAppSec("dummy"); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); PropagationTags dd = span.spanContext().getPropagationTags(); span.spanContext().forceKeep(); @@ -136,17 +136,17 @@ void forceKeepTracePropagationTags( String header, String rootHeader, Map rootTagMap) { - PropagationTags propagationTags = - tracer - .getPropagationTagsFactory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); - AgentSpanContext extracted = - new ExtractedContext(DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) - .withRequestContextDataAppSec("dummy"); - DDSpan rootSpan = (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); + PropagationTags propagationTags = tracer + .getPropagationTagsFactory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, header); + AgentSpanContext extracted = new ExtractedContext( + DDTraceId.from(123), 456, priority, "789", propagationTags, DATADOG) + .withRequestContextDataAppSec("dummy"); + DDSpan rootSpan = + (DDSpan) tracer.buildSpan("datadog", "top").asChildOf(extracted).start(); PropagationTags ddRoot = rootSpan.spanContext().getPropagationTags(); - DDSpan span = - (DDSpan) tracer.buildSpan("datadog", "current").asChildOf(rootSpan.spanContext()).start(); + DDSpan span = (DDSpan) + tracer.buildSpan("datadog", "current").asChildOf(rootSpan.spanContext()).start(); span.spanContext().forceKeep(); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextTest.java index 030687c06ec..0102a80aca6 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanContextTest.java @@ -63,23 +63,21 @@ public class DDSpanContextTest extends DDCoreJavaSpecification { void setup() { writer = new ListWriter(); profilingContextIntegration = mock(ProfilingContextIntegration.class); - tracer = - tracerBuilder() - .writer(writer) - .profilingContextIntegration(profilingContextIntegration) - .build(); + tracer = tracerBuilder() + .writer(writer) + .profilingContextIntegration(profilingContextIntegration) + .build(); } @ParameterizedTest @ValueSource(strings = {DDTags.SERVICE_NAME, DDTags.RESOURCE_NAME, DDTags.SPAN_TYPE, "some.tag"}) void nullValuesForTagsDeleteExistingTags(String name) throws Exception { - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .withSpanType("fakeType") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanType("fakeType") + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); context.setTag("some.tag", "asdf"); @@ -118,13 +116,12 @@ private static Map createExpectedTagsFromCurrentThread() { //spotless:on void specialTagsSetCertainValues(String scenario, String name, String expected, String method) throws Exception { - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .withSpanType("fakeType") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanType("fakeType") + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); context.setTag(name, expected); @@ -163,13 +160,12 @@ static Object[][] tagsCanBeAddedToContextArguments() { @ParameterizedTest @MethodSource("tagsCanBeAddedToContextArguments") void tagsCanBeAddedToContext(String name, Object value) throws Exception { - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .withSpanType("fakeType") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanType("fakeType") + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); context.setTag(name, value); @@ -200,12 +196,11 @@ void tagsCanBeAddedToContext(String name, Object value) throws Exception { }) void metricsUseExpectedTypes(Class expectedType, Number value) { // floats should be converted to doubles. - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); context.setMetric("test", value); @@ -217,12 +212,11 @@ void metricsUseExpectedTypes(Class expectedType, Number value) { @Test void forceKeepReallyKeepsTrace() { - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); context.setSamplingPriority(SAMPLER_DROP, DEFAULT); @@ -240,23 +234,24 @@ void forceKeepReallyKeepsTrace() { @Test void setTraceSegmentTagsAndDataOnCorrectSpan() { - ExtractedContext extracted = - (ExtractedContext) - new ExtractedContext( - DDTraceId.from(123), - 456, - SAMPLER_KEEP, - "789", - tracer.getPropagationTagsFactory().empty(), - DATADOG) - .withRequestContextDataAppSec("dummy"); - - AgentSpan top = - tracer.buildSpan("datadog", "top").asChildOf((AgentSpanContext) extracted).start(); + ExtractedContext extracted = (ExtractedContext) new ExtractedContext( + DDTraceId.from(123), + 456, + SAMPLER_KEEP, + "789", + tracer.getPropagationTagsFactory().empty(), + DATADOG) + .withRequestContextDataAppSec("dummy"); + + AgentSpan top = tracer + .buildSpan("datadog", "top") + .asChildOf((AgentSpanContext) extracted) + .start(); DDSpanContext topC = (DDSpanContext) top.spanContext(); TraceSegment topTS = top.getRequestContext().getTraceSegment(); - AgentSpan current = tracer.buildSpan("datadog", "current").asChildOf(top.spanContext()).start(); + AgentSpan current = + tracer.buildSpan("datadog", "current").asChildOf(top.spanContext()).start(); TraceSegment currentTS = current.getRequestContext().getTraceSegment(); DDSpanContext currentC = (DDSpanContext) current.spanContext(); @@ -294,12 +289,11 @@ void setTraceSegmentTagsAndDataOnCorrectSpan() { "0.25 | Integer.MAX_VALUE" }) void setSingleSpanSamplingTags(double rate, int limit) { - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); assertEquals(UNSET, context.getSamplingPriority()); @@ -320,12 +314,11 @@ void setSingleSpanSamplingTags(double rate, int limit) { @Test void settingResourceNameToNullIsIgnored() { - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .start(); span.setResourceName(null); @@ -339,12 +332,11 @@ void settingOperationNameTriggersConstantEncoding() { when(profilingContextIntegration.encodeOperationName("fakeOperation")).thenReturn(1); when(profilingContextIntegration.encodeResourceName("fakeResource")).thenReturn(-1); - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .start(); verify(profilingContextIntegration, times(1)).encodeOperationName("fakeOperation"); verify(profilingContextIntegration, times(1)).encodeResourceName("fakeResource"); @@ -368,22 +360,20 @@ void settingOperationNameTriggersConstantEncoding() { @Test void spanIdsPrintedAsUnsignedLong() { - AgentSpan parent = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .withSpanId(-987654321) - .start(); - - AgentSpan span = - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .withSpanId(-123456789) - .asChildOf(parent.spanContext()) - .start(); + AgentSpan parent = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanId(-987654321) + .start(); + + AgentSpan span = tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanId(-123456789) + .asChildOf(parent.spanContext()) + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); @@ -398,11 +388,15 @@ void spanIdsPrintedAsUnsignedLong() { @Test void serviceNameSourceIsPropagatedFromParentToChildSpan() { - AgentSpan parent = - tracer.buildSpan("datadog", "parentOperation").withServiceName("fakeService").start(); - - AgentSpan child = - tracer.buildSpan("datadog", "childOperation").asChildOf(parent.spanContext()).start(); + AgentSpan parent = tracer + .buildSpan("datadog", "parentOperation") + .withServiceName("fakeService") + .start(); + + AgentSpan child = tracer + .buildSpan("datadog", "childOperation") + .asChildOf(parent.spanContext()) + .start(); DDSpanContext childContext = (DDSpanContext) child.spanContext(); assertEquals(ServiceNameSources.MANUAL, childContext.getServiceNameSource()); @@ -456,12 +450,11 @@ void builderLedgerRemovalOfSpanKindClearsCachedOrdinal() { // setAllTags(TagMap.Ledger) at construction time. The removal path must // keep the cached ordinal in sync with unsafeTags, otherwise eligibility // checks that read the cached byte see a stale kind. - AgentSpan span = - tracer - .buildSpan("datadog", "test") - .withTag(SPAN_KIND, Tags.SPAN_KIND_CLIENT) - .withTag(SPAN_KIND, (Object) null) - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "test") + .withTag(SPAN_KIND, Tags.SPAN_KIND_CLIENT) + .withTag(SPAN_KIND, (Object) null) + .start(); DDSpanContext context = (DDSpanContext) span.spanContext(); assertNull(context.getTag(SPAN_KIND)); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanLinkTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanLinkTest.java index 5c16dc08e1f..d38c0f4cb35 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanLinkTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanLinkTest.java @@ -73,9 +73,8 @@ void createSpanLinkFromExtractedContext(boolean sampled, String traceFlags, Stri Map headers = new HashMap<>(); headers.put(TRACE_PARENT_KEY.toUpperCase(), "00-" + traceId + "-" + spanId + "-" + traceFlags); headers.put(TRACE_STATE_KEY.toUpperCase(), traceState); - HttpCodec.Extractor extractor = - newW3cHttpCodecExtractor( - Config.get(), () -> DynamicConfig.create().apply().captureTraceConfig()); + HttpCodec.Extractor extractor = newW3cHttpCodecExtractor( + Config.get(), () -> DynamicConfig.create().apply().captureTraceConfig()); ExtractedContext context = (ExtractedContext) extractor.extract(headers, stringValuesMap()); SpanLink link = DDSpanLink.from(context); @@ -90,11 +89,10 @@ void createSpanLinkFromExtractedContext(boolean sampled, String traceFlags, Stri void testSpanLinkEncodingTagMaxSize() throws Exception { int tooManyLinkCount = 300; SpanBuilder builder = tracer.buildSpan("test", "operation"); - List links = - IntStream.range(0, tooManyLinkCount) - .mapToObj(this::createLink) - .peek(builder::withLink) - .collect(toList()); + List links = IntStream.range(0, tooManyLinkCount) + .mapToObj(this::createLink) + .peek(builder::withLink) + .collect(toList()); AgentSpan span = builder.start(); span.finish(); this.writer.waitForTraces(1); @@ -119,9 +117,8 @@ void testSpanLinksEncodingPadsSpanId() throws Exception { // 15-character id, which consumers expecting fixed-width hex reject. String traceId = "11223344556677889900aabbccddeeff"; String spanId = "0a2b3c4d5e6f7a8b"; - SpanLink link = - new DDSpanLink( - DDTraceId.fromHex(traceId), DDSpanId.fromHex(spanId), DEFAULT_FLAGS, "", EMPTY); + SpanLink link = new DDSpanLink( + DDTraceId.fromHex(traceId), DDSpanId.fromHex(spanId), DEFAULT_FLAGS, "", EMPTY); this.tracer.buildSpan("test", "operation").withLink(link).start().finish(); this.writer.waitForTraces(1); @@ -133,13 +130,12 @@ void testSpanLinksEncodingPadsSpanId() throws Exception { @Test void testSpanLinksEncodingOmittedEmptyKeys() throws Exception { - SpanLink link = - new DDSpanLink( - DDTraceId.fromHex("11223344556677889900aabbccddeeff"), - DDSpanId.fromHex("123456789abcdef0"), - DEFAULT_FLAGS, - "", - EMPTY); + SpanLink link = new DDSpanLink( + DDTraceId.fromHex("11223344556677889900aabbccddeeff"), + DDSpanId.fromHex("123456789abcdef0"), + DEFAULT_FLAGS, + "", + EMPTY); this.tracer.buildSpan("test", "operation").withLink(link).start().finish(); this.writer.waitForTraces(1); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java index 839abe61a39..5877d42b4af 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java @@ -200,29 +200,28 @@ void serializeTraceWithBaggageAndTagsCorrectlyV04( throws Exception { ListWriter writer = new ListWriter(); CoreTracer tracer = tracerBuilder().writer(writer).build(); - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1, - DDSpanId.ZERO, - null, - "fakeService", - "fakeOperation", - "fakeResource", - PrioritySampling.UNSET, - null, - baggage, - false, - null, - tags.size(), - tracer.createTraceCollector(DDTraceId.ONE), - null, - null, - NoopPathwayContext.INSTANCE, - false, - null, - injectBaggage, - true); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1, + DDSpanId.ZERO, + null, + "fakeService", + "fakeOperation", + "fakeResource", + PrioritySampling.UNSET, + null, + baggage, + false, + null, + tags.size(), + tracer.createTraceCollector(DDTraceId.ONE), + null, + null, + NoopPathwayContext.INSTANCE, + false, + null, + injectBaggage, + true); context.setAllTags(tags); DDSpan span = DDSpan.create("test", 0, context, null); CaptureBuffer capture = new CaptureBuffer(); @@ -277,29 +276,28 @@ void serializeTraceWithBaggageAndTagsCorrectlyV05( throws Exception { ListWriter writer = new ListWriter(); CoreTracer tracer = tracerBuilder().writer(writer).build(); - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1, - DDSpanId.ZERO, - null, - "fakeService", - "fakeOperation", - "fakeResource", - PrioritySampling.UNSET, - null, - baggage, - false, - null, - tags.size(), - tracer.createTraceCollector(DDTraceId.ONE), - null, - null, - NoopPathwayContext.INSTANCE, - false, - null, - injectBaggage, - true); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1, + DDSpanId.ZERO, + null, + "fakeService", + "fakeOperation", + "fakeResource", + PrioritySampling.UNSET, + null, + baggage, + false, + null, + tags.size(), + tracer.createTraceCollector(DDTraceId.ONE), + null, + null, + NoopPathwayContext.INSTANCE, + false, + null, + injectBaggage, + true); context.setAllTags(tags); DDSpan span = DDSpan.create("test", 0, context, null); CaptureBuffer capture = new CaptureBuffer(); @@ -379,13 +377,12 @@ void serializeTraceWithSpanLinksAsStructuredLinksOnlyV1() throws Exception { Map linkAttributes = new HashMap<>(); linkAttributes.put("link.source", "unit-test"); - DDSpanLink link = - new DDSpanLink( - DDTraceId.fromHex("11223344556677889900aabbccddeeff"), - DDSpanId.fromHex("123456789abcdef0"), - (byte) 1, - "dd=s:1", - SpanAttributes.fromMap(linkAttributes)); + DDSpanLink link = new DDSpanLink( + DDTraceId.fromHex("11223344556677889900aabbccddeeff"), + DDSpanId.fromHex("123456789abcdef0"), + (byte) 1, + "dd=s:1", + SpanAttributes.fromMap(linkAttributes)); span.addLink(link); V1PayloadReader.V1Span payload = V1PayloadReader.readFirstSpan(serializeV1Payload(span)); @@ -459,16 +456,15 @@ void serializeTraceWithMalformedJsonSpanEventsAsEmptyV1() throws Exception { void serializePropagationTagsOnFirstSpanOfChunk(String protocol, boolean rootFirst) throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - PropagationTags propagationTags = - tracer - .getPropagationTagsFactory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.dm=-3,_dd.p.any=value"); - ExtractedContext extracted = - new ExtractedContext( - DDTraceId.ONE, 42, PrioritySampling.SAMPLER_KEEP, null, propagationTags, DATADOG); + PropagationTags propagationTags = tracer + .getPropagationTagsFactory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.dm=-3,_dd.p.any=value"); + ExtractedContext extracted = new ExtractedContext( + DDTraceId.ONE, 42, PrioritySampling.SAMPLER_KEEP, null, propagationTags, DATADOG); DDSpan root = (DDSpan) tracer.buildSpan("test", "root").asChildOf(extracted).start(); DDSpan child = (DDSpan) tracer.buildSpan("test", "child").asChildOf(root).start(); - DDSpan grandchild = (DDSpan) tracer.buildSpan("test", "grandchild").asChildOf(child).start(); + DDSpan grandchild = + (DDSpan) tracer.buildSpan("test", "grandchild").asChildOf(child).start(); root.setTag("root.only", "root-value"); List chunk = rootFirst ? Arrays.asList(root, child) : Arrays.asList(child, grandchild); @@ -497,8 +493,10 @@ void serializePropagationTagsOnFirstSpanOfChunk(String protocol, boolean rootFir assertEquals("value", metadata.get(0).get("_dd.p.any")); assertFalse(metadata.get(1).containsKey("_dd.p.dm")); assertFalse(metadata.get(1).containsKey("_dd.p.any")); - assertEquals(1L, metadata.stream().filter(span -> span.containsKey("_dd.p.dm")).count()); - assertEquals(1L, metadata.stream().filter(span -> span.containsKey("_dd.p.any")).count()); + assertEquals( + 1L, metadata.stream().filter(span -> span.containsKey("_dd.p.dm")).count()); + assertEquals( + 1L, metadata.stream().filter(span -> span.containsKey("_dd.p.any")).count()); assertEquals(rootFirst, metadata.get(0).containsKey("root.only")); assertFalse(metadata.get(1).containsKey("root.only")); if ("v1".equals(protocol)) { @@ -510,27 +508,26 @@ void serializePropagationTagsOnFirstSpanOfChunk(String protocol, boolean rootFir @Test void serializeTraceWithFlatMapTagV04() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1, - DDSpanId.ZERO, - null, - "fakeService", - "fakeOperation", - "fakeResource", - PrioritySampling.UNSET, - null, - null, - false, - null, - 0, - tracer.createTraceCollector(DDTraceId.ONE), - null, - null, - NoopPathwayContext.INSTANCE, - false, - null); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1, + DDSpanId.ZERO, + null, + "fakeService", + "fakeOperation", + "fakeResource", + PrioritySampling.UNSET, + null, + null, + false, + null, + 0, + tracer.createTraceCollector(DDTraceId.ONE), + null, + null, + NoopPathwayContext.INSTANCE, + false, + null); context.setTag("key1", "value1"); Map nested = new HashMap<>(); nested.put("sub1", "v1"); @@ -577,27 +574,26 @@ void serializeTraceWithFlatMapTagV04() throws Exception { @Test void serializeTraceWithFlatMapTagV05() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1, - DDSpanId.ZERO, - null, - "fakeService", - "fakeOperation", - "fakeResource", - PrioritySampling.UNSET, - null, - null, - false, - null, - 0, - tracer.createTraceCollector(DDTraceId.ONE), - null, - null, - NoopPathwayContext.INSTANCE, - false, - null); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1, + DDSpanId.ZERO, + null, + "fakeService", + "fakeOperation", + "fakeResource", + PrioritySampling.UNSET, + null, + null, + false, + null, + 0, + tracer.createTraceCollector(DDTraceId.ONE), + null, + null, + NoopPathwayContext.INSTANCE, + false, + null); context.setTag("key1", "value1"); Map nested = new HashMap<>(); nested.put("sub1", "v1"); @@ -713,27 +709,26 @@ private DDSpanContext createSpanContext( String spanType, CoreTracer tracer, DDTraceId traceId, long spanId) { Map baggage = new HashMap<>(); baggage.put("a-baggage", "value"); - DDSpanContext ctx = - new DDSpanContext( - traceId, - spanId, - DDSpanId.ZERO, - null, - "fakeService", - "fakeOperation", - "fakeResource", - PrioritySampling.UNSET, - null, - baggage, - false, - spanType, - 1, - tracer.createTraceCollector(DDTraceId.ONE), - null, - null, - NoopPathwayContext.INSTANCE, - false, - null); + DDSpanContext ctx = new DDSpanContext( + traceId, + spanId, + DDSpanId.ZERO, + null, + "fakeService", + "fakeOperation", + "fakeResource", + PrioritySampling.UNSET, + null, + baggage, + false, + spanType, + 1, + tracer.createTraceCollector(DDTraceId.ONE), + null, + null, + NoopPathwayContext.INSTANCE, + false, + null); Map tags = new HashMap<>(); tags.put("k1", "v1"); ctx.setAllTags(tags); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java index a05e9d982c4..a4c8a3ad348 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java @@ -58,19 +58,18 @@ public class DDSpanTest extends DDCoreJavaSpecification { @BeforeEach void setup() { writer = new ListWriter(); - tracer = tracerBuilder().writer(writer).sampler(new RateByServiceTraceSampler()).build(); + tracer = + tracerBuilder().writer(writer).sampler(new RateByServiceTraceSampler()).build(); } @Test void gettersAndSetters() { - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("fakeService") - .withResourceName("fakeResource") - .withSpanType("fakeType") - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanType("fakeType") + .start(); span.setServiceName("service"); assertEquals("service", span.getServiceName()); @@ -104,13 +103,11 @@ void resourceNameEqualsOperationNameIfNull() { String resourceName = "fake"; String serviceName = "myService"; - span = - (DDSpan) - tracer - .buildSpan("datadog", opName) - .withResourceName(resourceName) - .withServiceName(serviceName) - .start(); + span = (DDSpan) tracer + .buildSpan("datadog", opName) + .withResourceName(resourceName) + .withServiceName(serviceName) + .start(); assertEquals(resourceName, span.getResourceName().toString()); assertEquals(serviceName, span.getServiceName()); } @@ -126,11 +123,9 @@ void durationMeasuredInNanoseconds() { long total = System.nanoTime() - start; // Generous 5 seconds to execute this test - assertTrue( - Math.abs( - TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) - - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) - < 5); + assertTrue(Math.abs(TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) + - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) + < 5); assertTrue(span.getDurationNano() > betweenDur); assertTrue(span.getDurationNano() < total); assertTrue(span.getDurationNano() % mod > 0); @@ -161,11 +156,9 @@ void phasedFinishCapturesDurationButDoesNotPublishImmediately() throws Exception assertTrue(span.getDurationNano() < 0); long actualDurationNano = span.getDurationNano() & Long.MAX_VALUE; // Generous 5 seconds to execute this test - assertTrue( - Math.abs( - TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) - - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) - < 5); + assertTrue(Math.abs(TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) + - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) + < 5); assertTrue(actualDurationNano > betweenDur); assertTrue(actualDurationNano < total); assertTrue(actualDurationNano % mod > 0); // Very slim chance of a false negative. @@ -195,23 +188,19 @@ void phasedFinishCapturesDurationButDoesNotPublishImmediately() throws Exception void startingWithTimestampDisablesNanotime() { long mod = TimeUnit.MILLISECONDS.toNanos(1); long start = System.currentTimeMillis(); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "test") - .withStartTimestamp(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())) - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "test") + .withStartTimestamp(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())) + .start(); long between = System.currentTimeMillis(); long betweenDur = System.currentTimeMillis() - between; span.finish(); long total = Math.max(1, System.currentTimeMillis() - start); // Generous 5 seconds to execute this test - assertTrue( - Math.abs( - TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) - - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) - < 5); + assertTrue(Math.abs(TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) + - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) + < 5); assertTrue(span.getDurationNano() >= TimeUnit.MILLISECONDS.toNanos(betweenDur)); assertTrue(span.getDurationNano() <= TimeUnit.MILLISECONDS.toNanos(total)); assertTrue(span.getDurationNano() % mod == 0 || span.getDurationNano() == 1); @@ -228,11 +217,9 @@ void stoppingWithTimestampDisablesNanotime() { long total = System.currentTimeMillis() - start + 1; // Generous 5 seconds to execute this test - assertTrue( - Math.abs( - TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) - - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) - < 5); + assertTrue(Math.abs(TimeUnit.NANOSECONDS.toSeconds(span.getStartTime()) + - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())) + < 5); assertTrue(span.getDurationNano() >= TimeUnit.MILLISECONDS.toNanos(betweenDur)); assertTrue(span.getDurationNano() <= TimeUnit.MILLISECONDS.toNanos(total)); // true span duration can be <1ms if clock was about to tick over, so allow for that @@ -252,15 +239,19 @@ void stoppingWithTimestampBeforeStartTimeYieldsMinDurationOfOne() { @Test void prioritySamplingMetricSetOnlyOnRootSpan() { DDSpan parent = (DDSpan) tracer.buildSpan("datadog", "testParent").start(); - DDSpan child1 = - (DDSpan) tracer.buildSpan("datadog", "testChild1").asChildOf(parent.spanContext()).start(); + DDSpan child1 = (DDSpan) tracer + .buildSpan("datadog", "testChild1") + .asChildOf(parent.spanContext()) + .start(); child1.setSamplingPriority(PrioritySampling.SAMPLER_KEEP); child1.spanContext().lockSamplingPriority(); parent.setSamplingPriority(PrioritySampling.SAMPLER_DROP); child1.finish(); - DDSpan child2 = - (DDSpan) tracer.buildSpan("datadog", "testChild2").asChildOf(parent.spanContext()).start(); + DDSpan child2 = (DDSpan) tracer + .buildSpan("datadog", "testChild2") + .asChildOf(parent.spanContext()) + .start(); child2.finish(); parent.finish(); @@ -291,16 +282,13 @@ static Stream originSetOnlyOnRootSpanArguments() { @MethodSource("originSetOnlyOnRootSpanArguments") void originSetOnlyOnRootSpan(String scenario, AgentSpanContext extractedContext) throws Exception { - DDSpanContext parent = - (DDSpanContext) - tracer - .buildSpan("datadog", "testParent") - .asChildOf(extractedContext) - .start() - .spanContext(); - DDSpanContext child = - (DDSpanContext) - tracer.buildSpan("datadog", "testChild1").asChildOf(parent).start().spanContext(); + DDSpanContext parent = (DDSpanContext) tracer + .buildSpan("datadog", "testParent") + .asChildOf(extractedContext) + .start() + .spanContext(); + DDSpanContext child = (DDSpanContext) + tracer.buildSpan("datadog", "testChild1").asChildOf(parent).start().spanContext(); assertEquals("some-origin", parent.getOrigin().toString()); // Access field directly instead of getter. @@ -331,9 +319,10 @@ static Stream isRootSpanArguments() { @MethodSource("isRootSpanArguments") void isRootSpanInAndNotInContextOfDistributedTracing( String scenario, AgentSpanContext extractedContext, boolean isTraceRootSpan) { - DDSpan root = (DDSpan) tracer.buildSpan("datadog", "root").asChildOf(extractedContext).start(); - DDSpan child = - (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(root.spanContext()).start(); + DDSpan root = + (DDSpan) tracer.buildSpan("datadog", "root").asChildOf(extractedContext).start(); + DDSpan child = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(root.spanContext()).start(); assertEquals(isTraceRootSpan, root.isRootSpan()); assertFalse(child.isRootSpan()); @@ -360,9 +349,10 @@ static Stream getApplicationRootSpanArguments() { @MethodSource("getApplicationRootSpanArguments") void getApplicationRootSpanInAndNotInContextOfDistributedTracing( String scenario, AgentSpanContext extractedContext) { - DDSpan root = (DDSpan) tracer.buildSpan("datadog", "root").asChildOf(extractedContext).start(); - DDSpan child = - (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(root.spanContext()).start(); + DDSpan root = + (DDSpan) tracer.buildSpan("datadog", "root").asChildOf(extractedContext).start(); + DDSpan child = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(root.spanContext()).start(); assertEquals(root, root.getLocalRootSpan()); assertEquals(root, child.getLocalRootSpan()); @@ -378,9 +368,10 @@ void getApplicationRootSpanInAndNotInContextOfDistributedTracing( void publishingOfRootSpanClosesRequestContextData() throws Exception { Closeable reqContextData = mock(Closeable.class); TagContext context = new TagContext().withRequestContextDataAppSec(reqContextData); - DDSpan root = (DDSpan) tracer.buildSpan("datadog", "root").asChildOf(context).start(); - DDSpan child = - (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(root.spanContext()).start(); + DDSpan root = + (DDSpan) tracer.buildSpan("datadog", "root").asChildOf(context).start(); + DDSpan child = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(root.spanContext()).start(); assertEquals(reqContextData, root.getRequestContext().getData(RequestContextSlot.APPSEC)); assertEquals(reqContextData, child.getRequestContext().getData(RequestContextSlot.APPSEC)); @@ -406,27 +397,26 @@ static Stream inferTopLevelFromParentServiceNameArguments() { @MethodSource("inferTopLevelFromParentServiceNameArguments") void inferTopLevelFromParentServiceName( String scenario, CharSequence parentServiceName, boolean expectTopLevel) { - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1, - DDSpanId.ZERO, - parentServiceName, - "fakeService", - "fakeOperation", - "fakeResource", - PrioritySampling.UNSET, - null, - Collections.emptyMap(), - false, - "fakeType", - 0, - tracer.createTraceCollector(DDTraceId.ONE), - null, - null, - NoopPathwayContext.INSTANCE, - false, - PropagationTags.factory().empty()); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1, + DDSpanId.ZERO, + parentServiceName, + "fakeService", + "fakeOperation", + "fakeResource", + PrioritySampling.UNSET, + null, + Collections.emptyMap(), + false, + "fakeType", + 0, + tracer.createTraceCollector(DDTraceId.ONE), + null, + null, + NoopPathwayContext.INSTANCE, + false, + PropagationTags.factory().empty()); assertEquals(expectTopLevel, context.isTopLevel()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/KnuthSamplingRateTest.java b/dd-trace-core/src/test/java/datadog/trace/core/KnuthSamplingRateTest.java index 324b50ecfe2..dd608242390 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/KnuthSamplingRateTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/KnuthSamplingRateTest.java @@ -73,14 +73,12 @@ void agentRateSamplerSetsKsrPropagatedTag(String scenario, double rate, String e response.put("rate_by_service", rates); serviceSampler.onResponse("traces", response); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("spock") - .withTag("env", "test") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("spock") + .withTag("env", "test") + .ignoreActiveSpan() + .start(); serviceSampler.setSamplingPriority(span); Map propagationMap = span.spanContext().getPropagationTags().createTagMap(); @@ -104,14 +102,12 @@ void ruleBasedSamplerSetsKsrPropagatedTagWhenRuleMatches( CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); Sampler sampler = Sampler.Builder.forConfig(properties); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span); Map propagationMap = span.spanContext().getPropagationTags().createTagMap(); @@ -131,14 +127,12 @@ void ruleBasedSamplerFallbackToAgentSamplerSetsKsr() { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); Sampler sampler = Sampler.Builder.forConfig(properties); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span); Map propagationMap = span.spanContext().getPropagationTags().createTagMap(); @@ -157,14 +151,12 @@ void serviceRuleSamplerSetsKsrPropagatedTag() { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); Sampler sampler = Sampler.Builder.forConfig(properties); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span); Map propagationMap = span.spanContext().getPropagationTags().createTagMap(); @@ -182,14 +174,12 @@ void defaultRateSamplerSetsKsrPropagatedTag() { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); Sampler sampler = Sampler.Builder.forConfig(properties); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "operation") - .withServiceName("service") - .withTag("env", "bar") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "operation") + .withServiceName("service") + .withTag("env", "bar") + .ignoreActiveSpan() + .start(); ((PrioritySampler) sampler).setSamplingPriority(span); Map propagationMap = span.spanContext().getPropagationTags().createTagMap(); @@ -210,14 +200,12 @@ void ksrIsPropagatedViaXDatadogTagsHeader() { response.put("rate_by_service", rates); serviceSampler.onResponse("traces", response); - DDSpan span = - (DDSpan) - tracer - .buildSpan("datadog", "fakeOperation") - .withServiceName("spock") - .withTag("env", "test") - .ignoreActiveSpan() - .start(); + DDSpan span = (DDSpan) tracer + .buildSpan("datadog", "fakeOperation") + .withServiceName("spock") + .withTag("env", "test") + .ignoreActiveSpan() + .start(); serviceSampler.setSamplingPriority(span); String headerValue = diff --git a/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java index 27c8156e27f..9e5b17a9ae8 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java @@ -76,13 +76,12 @@ void setup() { when(traceConfig.getServiceMapping()).thenReturn(Collections.emptyMap()); when(sharedCommunicationObjects.featuresDiscovery(any())).thenReturn(features); - buffer = - new PendingTraceBuffer.DelayingPendingTraceBuffer( - MAX_TRACKED_TRACES, - timeSource, - Config.get(), - sharedCommunicationObjects, - HealthMetrics.NO_OP); + buffer = new PendingTraceBuffer.DelayingPendingTraceBuffer( + MAX_TRACKED_TRACES, + timeSource, + Config.get(), + sharedCommunicationObjects, + HealthMetrics.NO_OP); tracker = buffer.getRunningTracesTracker(); factory = new PendingTrace.Factory(tracer, buffer, timeSource, false, HealthMetrics.NO_OP); } @@ -101,13 +100,12 @@ void traceWithNoSpanIsNotAdded() { @Test void traceWithoutRightStateAreNotTracked() { - List statesToTest = - Arrays.asList( - LongRunningTracesTracker.NOT_TRACKED, - LongRunningTracesTracker.UNDEFINED, - LongRunningTracesTracker.TRACKED, - LongRunningTracesTracker.WRITE_RUNNING_SPANS, - LongRunningTracesTracker.EXPIRED); + List statesToTest = Arrays.asList( + LongRunningTracesTracker.NOT_TRACKED, + LongRunningTracesTracker.UNDEFINED, + LongRunningTracesTracker.TRACKED, + LongRunningTracesTracker.WRITE_RUNNING_SPANS, + LongRunningTracesTracker.EXPIRED); for (int stateToTest : statesToTest) { PendingTrace trace = newTraceToTrack(); trace.setLongRunningTrackedState(stateToTest); @@ -214,27 +212,26 @@ private PendingTrace newTraceToTrack() { } private static DDSpan newSpanOf(PendingTrace trace, int samplingPriority, long timestampMicro) { - DDSpanContext context = - new DDSpanContext( - DDTraceId.ONE, - 1, - DDSpanId.ZERO, - null, - "fakeService", - "fakeOperation", - "fakeResource", - samplingPriority, - null, - Collections.emptyMap(), - false, - "fakeType", - 0, - trace, - null, - null, - NoopPathwayContext.INSTANCE, - false, - PropagationTags.factory().empty()); + DDSpanContext context = new DDSpanContext( + DDTraceId.ONE, + 1, + DDSpanId.ZERO, + null, + "fakeService", + "fakeOperation", + "fakeResource", + samplingPriority, + null, + Collections.emptyMap(), + false, + "fakeType", + 0, + trace, + null, + null, + NoopPathwayContext.INSTANCE, + false, + PropagationTags.factory().empty()); return DDSpan.create("test", timestampMicro, context, null); } } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java index b94a8e0898e..f183ea9319b 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java @@ -88,9 +88,8 @@ void setup() { bufferSpy = spy(buffer); delayingBuffer = (PendingTraceBuffer.DelayingPendingTraceBuffer) buffer; scopeManager = new ContinuableScopeManager(10, true); - factory = - new PendingTrace.Factory( - tracer, bufferSpy, SystemTimeSource.INSTANCE, false, HealthMetrics.NO_OP); + factory = new PendingTrace.Factory( + tracer, bufferSpy, SystemTimeSource.INSTANCE, false, HealthMetrics.NO_OP); continuations = new ArrayList<>(); when(tracer.captureTraceConfig()).thenReturn(traceConfig); @@ -177,12 +176,11 @@ void unfinishedChildBuffersRoot() { @Test void prioritySamplingIsAlwaysSent() { SamplingPriorityMetadataChecker metadataChecker = new SamplingPriorityMetadataChecker(); - doAnswer( - invocation -> { - List spans = invocation.getArgument(0); - spans.get(0).processTagsAndBaggage(metadataChecker); - return null; - }) + doAnswer(invocation -> { + List spans = invocation.getArgument(0); + spans.get(0).processTagsAndBaggage(metadataChecker); + return null; + }) .when(tracer) .write(any()); @@ -295,16 +293,14 @@ void lateArrivalSpanRequeuesPendingTrace() throws InterruptedException { PendingTrace trace = factory.create(DDTraceId.ONE); DDSpan parent = newSpanOf(trace); - doAnswer( - invocation -> { - parentLatch.countDown(); - return null; - }) - .doAnswer( - invocation -> { - childLatch.countDown(); - return null; - }) + doAnswer(invocation -> { + parentLatch.countDown(); + return null; + }) + .doAnswer(invocation -> { + childLatch.countDown(); + return null; + }) .when(tracer) .write(any()); @@ -335,38 +331,37 @@ void flushClearsTheBuffer() throws InterruptedException { buffer.start(); AtomicInteger counter = new AtomicInteger(0); // Create a fake element that newer gets written - PendingTraceBuffer.Element element = - new PendingTraceBuffer.Element() { - @Override - public long oldestFinishedTime() { - return TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); - } - - @Override - public boolean lastReferencedNanosAgo(long nanos) { - return false; - } - - @Override - public void write() { - counter.incrementAndGet(); - } - - @Override - public DDSpan getRootSpan() { - return null; - } - - @Override - public boolean setEnqueued(boolean enqueued) { - return true; - } - - @Override - public boolean writeOnBufferFull() { - return true; - } - }; + PendingTraceBuffer.Element element = new PendingTraceBuffer.Element() { + @Override + public long oldestFinishedTime() { + return TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()); + } + + @Override + public boolean lastReferencedNanosAgo(long nanos) { + return false; + } + + @Override + public void write() { + counter.incrementAndGet(); + } + + @Override + public DDSpan getRootSpan() { + return null; + } + + @Override + public boolean setEnqueued(boolean enqueued) { + return true; + } + + @Override + public boolean writeOnBufferFull() { + return true; + } + }; bufferSpy.enqueue(element); bufferSpy.enqueue(element); @@ -451,9 +446,8 @@ void testingTracerFlareDumpWithMultipleTraces() throws IOException, InterruptedE assertEquals(2, parsedTraces1.size()); assertEquals(1L, ((Number) parsedTraces1.get(0).get("trace_id")).longValue()); assertEquals(2L, ((Number) parsedTraces1.get(1).get("trace_id")).longValue()); - assertTrue( - ((Number) parsedTraces1.get(0).get("start")).longValue() - < ((Number) parsedTraces1.get(1).get("start")).longValue()); + assertTrue(((Number) parsedTraces1.get(0).get("start")).longValue() + < ((Number) parsedTraces1.get(1).get("start")).longValue()); clearInvocations(dumpReporter); @@ -515,53 +509,51 @@ private static DDSpan newSpanOf(PendingTrace trace) { } private static DDSpan newSpanOf(PendingTrace trace, int samplingPriority, long timestampMicro) { - DDSpanContext context = - new DDSpanContext( - trace.getTraceId(), - 1, - DDSpanId.ZERO, - null, - "fakeService", - "fakeOperation", - "fakeResource", - samplingPriority, - null, - Collections.emptyMap(), - false, - "fakeType", - 0, - trace, - null, - null, - NoopPathwayContext.INSTANCE, - false, - PropagationTags.factory().empty()); + DDSpanContext context = new DDSpanContext( + trace.getTraceId(), + 1, + DDSpanId.ZERO, + null, + "fakeService", + "fakeOperation", + "fakeResource", + samplingPriority, + null, + Collections.emptyMap(), + false, + "fakeType", + 0, + trace, + null, + null, + NoopPathwayContext.INSTANCE, + false, + PropagationTags.factory().empty()); return DDSpan.create("test", timestampMicro, context, null); } private static DDSpan newSpanOf(DDSpan parent) { TraceCollector traceCollector = parent.spanContext().getTraceCollector(); - DDSpanContext context = - new DDSpanContext( - parent.spanContext().getTraceId(), - 2, - parent.spanContext().getSpanId(), - null, - "fakeService", - "fakeOperation", - "fakeResource", - UNSET, - null, - Collections.emptyMap(), - false, - "fakeType", - 0, - traceCollector, - null, - null, - NoopPathwayContext.INSTANCE, - false, - PropagationTags.factory().empty()); + DDSpanContext context = new DDSpanContext( + parent.spanContext().getTraceId(), + 2, + parent.spanContext().getSpanId(), + null, + "fakeService", + "fakeOperation", + "fakeResource", + UNSET, + null, + Collections.emptyMap(), + false, + "fakeType", + 0, + traceCollector, + null, + null, + NoopPathwayContext.INSTANCE, + false, + PropagationTags.factory().empty()); return DDSpan.create("test", 0, context, null); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java index 0020fa3a157..8b40b294982 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java @@ -106,15 +106,8 @@ void verifyHealthMetricsCalled() { when(stubTracer.captureTraceConfig()).thenReturn(traceConfig); when(traceConfig.getServiceMapping()).thenReturn(Collections.emptyMap()); - PendingTrace trace = - new PendingTrace( - stubTracer, - DDTraceId.from(0), - buffer, - mock(TimeSource.class), - null, - false, - healthMetrics); + PendingTrace trace = new PendingTrace( + stubTracer, DDTraceId.from(0), buffer, mock(TimeSource.class), null, false, healthMetrics); DDSpan span = createSimpleSpan(trace); trace.registerSpan(span); @@ -137,15 +130,8 @@ void writeWhenRunningSpansDisabledOnlyCompletedSpansWritten() { when(traceConfig.getServiceMapping()).thenReturn(Collections.emptyMap()); when(buffer.longRunningSpansEnabled()).thenReturn(true); - PendingTrace trace = - new PendingTrace( - stubTracer, - DDTraceId.from(0), - buffer, - mock(TimeSource.class), - null, - false, - healthMetrics); + PendingTrace trace = new PendingTrace( + stubTracer, DDTraceId.from(0), buffer, mock(TimeSource.class), null, false, healthMetrics); DDSpan span1 = createSimpleSpanWithID(trace, 39); span1.setDurationNano(31); @@ -180,15 +166,8 @@ void writeWhenRunningSpansEnabledCompleteAndRunningSpansWritten() { when(traceConfig.getServiceMapping()).thenReturn(Collections.emptyMap()); when(buffer.longRunningSpansEnabled()).thenReturn(true); - PendingTrace trace = - new PendingTrace( - stubTracer, - DDTraceId.from(0), - buffer, - mock(TimeSource.class), - null, - false, - healthMetrics); + PendingTrace trace = new PendingTrace( + stubTracer, DDTraceId.from(0), buffer, mock(TimeSource.class), null, false, healthMetrics); DDSpan span1 = createSimpleSpanWithID(trace, 39); span1.setDurationNano(31); @@ -214,8 +193,7 @@ void writeWhenRunningSpansEnabledCompleteAndRunningSpansWritten() { assertTrue( traceToWrite.containsAll(Arrays.asList(span1, span2, unfinishedSpan, unfinishedSpan2))); assertEquals(2, trace.getSpans().size()); - assertTrue( - new ArrayList<>(trace.getSpans()) - .containsAll(Arrays.asList(unfinishedSpan, unfinishedSpan2))); + assertTrue(new ArrayList<>(trace.getSpans()) + .containsAll(Arrays.asList(unfinishedSpan, unfinishedSpan2))); } } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTestBase.java b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTestBase.java index aa986faa0e4..c2d509a6e62 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTestBase.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTestBase.java @@ -59,8 +59,8 @@ void singleSpanWrittenWhenFinished() throws InterruptedException, TimeoutExcepti @Test void childFinishesBeforeParent() throws InterruptedException, TimeoutException { - DDSpan child = - (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); + DDSpan child = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); assertEquals(2, traceCollector.getPendingReferenceCount()); @@ -81,8 +81,8 @@ void childFinishesBeforeParent() throws InterruptedException, TimeoutException { @Test void parentFinishesBeforeChild() throws InterruptedException, TimeoutException { - DDSpan child = - (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); + DDSpan child = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); assertEquals(2, traceCollector.getPendingReferenceCount()); @@ -108,8 +108,8 @@ void childSpansCreatedAfterWrittenReportedSeparately() // this shouldn't happen, but it's possible users of the api // may incorrectly add spans after the trace is reported. // in those cases we should still decrement the pending trace count - DDSpan childSpan = - (DDSpan) tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); + DDSpan childSpan = (DDSpan) + tracer.buildSpan("datadog", "child").asChildOf(rootSpan.spanContext()).start(); childSpan.finish(); writer.waitForTraces(2); @@ -121,10 +121,8 @@ void childSpansCreatedAfterWrittenReportedSeparately() @Test void testGetCurrentTimeNano() { - long diffSeconds = - Math.abs( - TimeUnit.NANOSECONDS.toSeconds(traceCollector.getCurrentTimeNano()) - - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())); + long diffSeconds = Math.abs(TimeUnit.NANOSECONDS.toSeconds(traceCollector.getCurrentTimeNano()) + - TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())); // Generous 5 seconds to execute this test assertTrue(diffSeconds < 5, "Expected time difference < 5 seconds, got: " + diffSeconds); } @@ -136,12 +134,14 @@ void partialFlush() throws InterruptedException, TimeoutException { try { DDSpan localRoot = (DDSpan) quickTracer.buildSpan("datadog", "root").start(); PendingTrace trace = (PendingTrace) localRoot.spanContext().getTraceCollector(); - DDSpan child1 = - (DDSpan) - quickTracer.buildSpan("datadog", "child1").asChildOf(localRoot.spanContext()).start(); - DDSpan child2 = - (DDSpan) - quickTracer.buildSpan("datadog", "child2").asChildOf(localRoot.spanContext()).start(); + DDSpan child1 = (DDSpan) quickTracer + .buildSpan("datadog", "child1") + .asChildOf(localRoot.spanContext()) + .start(); + DDSpan child2 = (DDSpan) quickTracer + .buildSpan("datadog", "child2") + .asChildOf(localRoot.spanContext()) + .start(); assertEquals(3, trace.getPendingReferenceCount()); @@ -181,12 +181,14 @@ void partialFlushWithRootSpanClosedLast() throws InterruptedException, TimeoutEx try { DDSpan localRoot = (DDSpan) quickTracer.buildSpan("datadog", "root").start(); PendingTrace trace = (PendingTrace) localRoot.spanContext().getTraceCollector(); - DDSpan child1 = - (DDSpan) - quickTracer.buildSpan("datadog", "child1").asChildOf(localRoot.spanContext()).start(); - DDSpan child2 = - (DDSpan) - quickTracer.buildSpan("datadog", "child2").asChildOf(localRoot.spanContext()).start(); + DDSpan child1 = (DDSpan) quickTracer + .buildSpan("datadog", "child1") + .asChildOf(localRoot.spanContext()) + .start(); + DDSpan child2 = (DDSpan) quickTracer + .buildSpan("datadog", "child2") + .asChildOf(localRoot.spanContext()) + .start(); assertEquals(3, trace.getPendingReferenceCount()); @@ -245,23 +247,20 @@ void partialFlushConcurrencyTest(int threadCount, int spanCount) List threads = new ArrayList<>(threadCount); for (int t = 0; t < threadCount; t++) { - Thread thread = - new Thread( - () -> { - try { - latch.await(); - List spans = new ArrayList<>(spanCount); - for (int s = 0; s < spanCount; s++) { - spans.add( - (DDSpan) tracer.startSpan("test", "child", localRoot.spanContext())); - } - for (DDSpan span : spans) { - span.finish(); - } - } catch (Throwable ex) { - exceptions.add(ex); - } - }); + Thread thread = new Thread(() -> { + try { + latch.await(); + List spans = new ArrayList<>(spanCount); + for (int s = 0; s < spanCount; s++) { + spans.add((DDSpan) tracer.startSpan("test", "child", localRoot.spanContext())); + } + for (DDSpan span : spans) { + span.finish(); + } + } catch (Throwable ex) { + exceptions.add(ex); + } + }); thread.start(); threads.add(thread); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/StatusLoggerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/StatusLoggerTest.java index eae2b69ffbd..f4023628543 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/StatusLoggerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/StatusLoggerTest.java @@ -118,12 +118,11 @@ void metricsExportedWhenOtelMetricsSignalEnabledWithoutSpanMetrics() throws IOEx } private static Map startupLog() throws IOException { - String json = - new Moshi.Builder() - .add(new StatusLogger()) - .build() - .adapter(Config.class) - .toJson(Config.get()); + String json = new Moshi.Builder() + .add(new StatusLogger()) + .build() + .adapter(Config.class) + .toJson(Config.get()); return JsonMapper.fromJsonToMap(json); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/TraceInterceptorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/TraceInterceptorTest.java index 503038d1405..5d1c59165f9 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/TraceInterceptorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/TraceInterceptorTest.java @@ -57,21 +57,18 @@ void interceptorIsRegisteredAsService() { void interceptorsWithSamePriorityReplaced() { int priority = 999; TestInterceptor.priority = priority; - tracer - .getInterceptors() - .add( - new TraceInterceptor() { - @Override - public Collection onTraceComplete( - Collection trace) { - return emptyList(); - } - - @Override - public int priority() { - return priority; - } - }); + tracer.getInterceptors().add(new TraceInterceptor() { + @Override + public Collection onTraceComplete( + Collection trace) { + return emptyList(); + } + + @Override + public int priority() { + return priority; + } + }); TraceInterceptor[] interceptors = tracer.getInterceptors().interceptors(); assertEquals(1, interceptors.length); @@ -85,19 +82,18 @@ public int priority() { }) void interceptorsWithDifferentPrioritySorted(int score, boolean reverse) { TraceInterceptor existingInterceptor = tracer.getInterceptors().interceptors()[0]; - TraceInterceptor newInterceptor = - new TraceInterceptor() { - @Override - public Collection onTraceComplete( - Collection trace) { - return emptyList(); - } - - @Override - public int priority() { - return score; - } - }; + TraceInterceptor newInterceptor = new TraceInterceptor() { + @Override + public Collection onTraceComplete( + Collection trace) { + return emptyList(); + } + + @Override + public int priority() { + return score; + } + }; tracer.getInterceptors().add(newInterceptor); List sorted = Arrays.asList(tracer.getInterceptors().interceptors()); @@ -122,23 +118,20 @@ void interceptorCanDiscardTrace(int deltaPriority, int expectedSize) int score = TestInterceptor.priority + deltaPriority; AtomicBoolean called = new AtomicBoolean(false); CountDownLatch latch = new CountDownLatch(1); - tracer - .getInterceptors() - .add( - new TraceInterceptor() { - @Override - public Collection onTraceComplete( - Collection trace) { - called.set(true); - latch.countDown(); - return emptyList(); - } - - @Override - public int priority() { - return score; - } - }); + tracer.getInterceptors().add(new TraceInterceptor() { + @Override + public Collection onTraceComplete( + Collection trace) { + called.set(true); + latch.countDown(); + return emptyList(); + } + + @Override + public int priority() { + return score; + } + }); tracer.buildSpan("datadog", "test " + score).start().finish(); if (score == TestInterceptor.priority) { @@ -155,31 +148,28 @@ public int priority() { @Test void interceptorCanModifySpan() throws InterruptedException, TimeoutException { - tracer - .getInterceptors() - .add( - new TraceInterceptor() { - @Override - public Collection onTraceComplete( - Collection trace) { - for (MutableSpan span : trace) { - span.setOperationName("modifiedON-" + span.getOperationName()) - .setServiceName("modifiedSN-" + span.getServiceName()) - .setResourceName("modifiedRN-" + span.getResourceName()) - .setSpanType("modifiedST-" + span.getSpanType()) - .setTag("boolean-tag", true) - .setTag("number-tag", 5.0) - .setTag("string-tag", "howdy") - .setError(true); - } - return trace; - } - - @Override - public int priority() { - return 1; - } - }); + tracer.getInterceptors().add(new TraceInterceptor() { + @Override + public Collection onTraceComplete( + Collection trace) { + for (MutableSpan span : trace) { + span.setOperationName("modifiedON-" + span.getOperationName()) + .setServiceName("modifiedSN-" + span.getServiceName()) + .setResourceName("modifiedRN-" + span.getResourceName()) + .setSpanType("modifiedST-" + span.getSpanType()) + .setTag("boolean-tag", true) + .setTag("number-tag", 5.0) + .setTag("string-tag", "howdy") + .setError(true); + } + return trace; + } + + @Override + public int priority() { + return 1; + } + }); tracer.buildSpan("datadog", "test").start().finish(); writer.waitForTraces(1); @@ -207,21 +197,18 @@ public int priority() { @Test void robustWhenInterceptorReturnsNull() { - tracer - .getInterceptors() - .add( - new TraceInterceptor() { - @Override - public Collection onTraceComplete( - Collection trace) { - return null; - } - - @Override - public int priority() { - return 0; - } - }); + tracer.getInterceptors().add(new TraceInterceptor() { + @Override + public Collection onTraceComplete( + Collection trace) { + return null; + } + + @Override + public int priority() { + return 0; + } + }); DDSpan span = (DDSpan) tracer.startSpan("test", "test"); span.phasedFinish(); @@ -231,19 +218,18 @@ public int priority() { @Test void registerInterceptorThroughBridge() { GlobalTracer.registerIfAbsent(tracer); - TraceInterceptor interceptor = - new TraceInterceptor() { - @Override - public Collection onTraceComplete( - Collection trace) { - return trace; - } - - @Override - public int priority() { - return 38; - } - }; + TraceInterceptor interceptor = new TraceInterceptor() { + @Override + public Collection onTraceComplete( + Collection trace) { + return trace; + } + + @Override + public int priority() { + return 38; + } + }; assertTrue(GlobalTracer.get().addTraceInterceptor(interceptor)); assertTrue(Arrays.asList(tracer.getInterceptors().interceptors()).contains(interceptor)); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/TracingConfigPollerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/TracingConfigPollerTest.java index a5105d326c9..555eb5c9fa5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/TracingConfigPollerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/TracingConfigPollerTest.java @@ -114,17 +114,18 @@ void actualConfigCommitWithServiceAndOrgLevelConfigs() throws Exception { SharedCommunicationObjects sco = createScoWithPoller(poller); ProductListener[] capturedUpdater = {null}; - doAnswer( - inv -> { - // capture config updater for further testing - capturedUpdater[0] = inv.getArgument(1, ProductListener.class); - return null; - }) + doAnswer(inv -> { + // capture config updater for further testing + capturedUpdater[0] = inv.getArgument(1, ProductListener.class); + return null; + }) .when(poller) .addListener(eq(Product.APM_TRACING), any(ProductListener.class)); - CoreTracer tracer = - CoreTracer.builder().sharedCommunicationObjects(sco).pollForTracingConfiguration().build(); + CoreTracer tracer = CoreTracer.builder() + .sharedCommunicationObjects(sco) + .pollForTracingConfiguration() + .build(); unclosedTracers.add(tracer); try { @@ -196,7 +197,8 @@ void actualConfigCommitWithServiceAndOrgLevelConfigs() throws Exception { tracer.captureTraceConfig().getDataStreamsTransactionExtractors(); assertEquals(1, extractors.size()); assertEquals("test", extractors.get(0).getName()); - assertEquals(DataStreamsTransactionExtractor.Type.UNKNOWN, extractors.get(0).getType()); + assertEquals( + DataStreamsTransactionExtractor.Type.UNKNOWN, extractors.get(0).getType()); assertEquals("value", extractors.get(0).getValue()); // Remove service level config updater.remove(serviceKey, null); @@ -229,17 +231,18 @@ void twoOrgLevelsConfigSettingDifferentFlagsWorks() throws Exception { SharedCommunicationObjects sco = createScoWithPoller(poller); ProductListener[] capturedUpdater = {null}; - doAnswer( - inv -> { - // capture config updater for further testing - capturedUpdater[0] = inv.getArgument(1, ProductListener.class); - return null; - }) + doAnswer(inv -> { + // capture config updater for further testing + capturedUpdater[0] = inv.getArgument(1, ProductListener.class); + return null; + }) .when(poller) .addListener(eq(Product.APM_TRACING), any(ProductListener.class)); - CoreTracer tracer = - CoreTracer.builder().sharedCommunicationObjects(sco).pollForTracingConfiguration().build(); + CoreTracer tracer = CoreTracer.builder() + .sharedCommunicationObjects(sco) + .pollForTracingConfiguration() + .build(); unclosedTracers.add(tracer); try { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTelemetryTest.java b/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTelemetryTest.java index a227a5284f9..b843e255f5a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTelemetryTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTelemetryTest.java @@ -130,10 +130,9 @@ void shouldNotIncrementTelemetryCounterWhenBaggageExtractionFails() { collector.prepareMetrics(); Collection metrics = collector.drain(); - List foundMetrics = - metrics.stream() - .filter(m -> m.metricName.startsWith("context_header_style.")) - .collect(Collectors.toList()); + List foundMetrics = metrics.stream() + .filter(m -> m.metricName.startsWith("context_header_style.")) + .collect(Collectors.toList()); assertTrue(foundMetrics.isEmpty()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTest.java index c88aa44ce1e..02f812d9a01 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/baggage/BaggagePropagatorTest.java @@ -47,9 +47,8 @@ public void forEachKeyValue(Map carrier, BiConsumer(); this.context = Context.root(); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/CheckpointerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/CheckpointerTest.java index 07681335c4c..5403196d733 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/CheckpointerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/CheckpointerTest.java @@ -41,9 +41,8 @@ void testSettingProduceAndConsumeCheckpoint() { scope.close(); span.finish(); - boolean hasPathwayCtxBase64 = - carrier.entries().stream() - .anyMatch(entry -> "dd-pathway-ctx-base64".equals(entry.getKey())); + boolean hasPathwayCtxBase64 = carrier.entries().stream() + .anyMatch(entry -> "dd-pathway-ctx-base64".equals(entry.getKey())); assertTrue(hasPathwayCtxBase64); assertNotEquals(0L, ((DDSpan) span).spanContext().getPathwayContext().getHash()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractorsTest.java b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractorsTest.java index 51205505225..407cd49d1e7 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractorsTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsTransactionExtractorsTest.java @@ -16,12 +16,10 @@ public class DataStreamsTransactionExtractorsTest extends DDCoreJavaSpecification { @Test void deserializeFromJson() { - DataStreamsTransactionExtractors list = - DataStreamsTransactionExtractors.deserialize( - "[\n" - + " {\"name\": \"extractor\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"transaction_id\"},\n" - + " {\"name\": \"second_extractor\", \"type\": \"HTTP_IN_HEADERS\", \"value\": \"transaction_id\"}\n" - + "]"); + DataStreamsTransactionExtractors list = DataStreamsTransactionExtractors.deserialize("[\n" + + " {\"name\": \"extractor\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"transaction_id\"},\n" + + " {\"name\": \"second_extractor\", \"type\": \"HTTP_IN_HEADERS\", \"value\": \"transaction_id\"}\n" + + "]"); List extractors = list.getExtractors(); assertEquals(2, extractors.size()); @@ -35,12 +33,10 @@ void deserializeFromJson() { @Test void deserializeKafkaTypes() { - DataStreamsTransactionExtractors list = - DataStreamsTransactionExtractors.deserialize( - "[" - + "{\"name\": \"consume\", \"type\": \"KAFKA_CONSUME_HEADERS\", \"value\": \"txn\"}," - + "{\"name\": \"produce\", \"type\": \"KAFKA_PRODUCE_HEADERS\", \"value\": \"txn\"}" - + "]"); + DataStreamsTransactionExtractors list = DataStreamsTransactionExtractors.deserialize("[" + + "{\"name\": \"consume\", \"type\": \"KAFKA_CONSUME_HEADERS\", \"value\": \"txn\"}," + + "{\"name\": \"produce\", \"type\": \"KAFKA_PRODUCE_HEADERS\", \"value\": \"txn\"}" + + "]"); List extractors = list.getExtractors(); assertEquals(2, extractors.size()); @@ -50,9 +46,8 @@ void deserializeKafkaTypes() { @Test void deserializeUnknownTypeReturnsEmpty() { - DataStreamsTransactionExtractors list = - DataStreamsTransactionExtractors.deserialize( - "[{\"name\": \"ext\", \"type\": \"NOT_A_REAL_TYPE\", \"value\": \"v\"}]"); + DataStreamsTransactionExtractors list = DataStreamsTransactionExtractors.deserialize( + "[{\"name\": \"ext\", \"type\": \"NOT_A_REAL_TYPE\", \"value\": \"v\"}]"); assertSame(DataStreamsTransactionExtractors.EMPTY, list); assertTrue(list.getExtractors().isEmpty()); @@ -83,9 +78,8 @@ void deserializeNullJsonReturnsEmpty() { @Test void implToStringContainsFields() { - DataStreamsTransactionExtractors list = - DataStreamsTransactionExtractors.deserialize( - "[{\"name\": \"myext\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"myval\"}]"); + DataStreamsTransactionExtractors list = DataStreamsTransactionExtractors.deserialize( + "[{\"name\": \"myext\", \"type\": \"HTTP_OUT_HEADERS\", \"value\": \"myval\"}]"); String str = list.getExtractors().get(0).toString(); assertTrue(str.contains("myext")); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsWritingTest.java b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsWritingTest.java index 9b989a69ef3..ef8279d08f8 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsWritingTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DataStreamsWritingTest.java @@ -60,17 +60,11 @@ public class DataStreamsWritingTest extends DDCoreJavaSpecification { static void startServer() { defaultBucketDurationNanos = Config.get().getDataStreamsBucketDurationNanoseconds(); requestBodies = new CopyOnWriteArrayList<>(); - server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - DDAgentFeaturesDiscovery.V01_DATASTREAMS_ENDPOINT, - api -> { - requestBodies.add(api.getRequest().getBody()); - api.getResponse().status(200).send(); - }))); + server = JavaTestHttpServer.httpServer(s -> + s.handlers(h -> h.post(DDAgentFeaturesDiscovery.V01_DATASTREAMS_ENDPOINT, api -> { + requestBodies.add(api.getRequest().getBody()); + api.getResponse().status(200).send(); + }))); serverAddress = HttpUrl.get(server.getAddress()); } @@ -96,9 +90,8 @@ private static void awaitOneRequestBody() throws InterruptedException { @Test void serviceOverridesSplitBuckets() throws InterruptedException, IOException { - WellKnownTags wellKnownTags = - new WellKnownTags( - "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); + WellKnownTags wellKnownTags = new WellKnownTags( + "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); Config fakeConfig = mock(Config.class); when(fakeConfig.getAgentUrl()).thenReturn(serverAddress.toString()); when(fakeConfig.getWellKnownTags()).thenReturn(wellKnownTags); @@ -117,22 +110,20 @@ void serviceOverridesSplitBuckets() throws InterruptedException, IOException { when(traceConfig.isDataStreamsEnabled()).thenReturn(true); String serviceNameOverride = "service-name-override"; - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); dataStreams.start(); dataStreams.setThreadServiceName(serviceNameOverride); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create(null, null), - 9, - 0, - 10, - timeSource.getCurrentTimeNanos(), - 0, - 0, - 0, - serviceNameOverride)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create(null, null), + 9, + 0, + 10, + timeSource.getCurrentTimeNanos(), + 0, + 0, + 0, + serviceNameOverride)); dataStreams.trackBacklog( DataStreamsTags.createWithPartition("kafka_produce", "testTopic", "1", null, null), 130); timeSource.advance(defaultBucketDurationNanos); @@ -162,9 +153,8 @@ void writeBucketToMockServer(boolean processTagsEnabled) EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, Boolean.toString(processTagsEnabled)); ProcessTags.reset(Config.get()); - WellKnownTags wellKnownTags = - new WellKnownTags( - "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); + WellKnownTags wellKnownTags = new WellKnownTags( + "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); Config fakeConfig = mock(Config.class); when(fakeConfig.getAgentUrl()).thenReturn(serverAddress.toString()); when(fakeConfig.getWellKnownTags()).thenReturn(wellKnownTags); @@ -182,76 +172,70 @@ void writeBucketToMockServer(boolean processTagsEnabled) TraceConfig traceConfig = mock(TraceConfig.class); when(traceConfig.isDataStreamsEnabled()).thenReturn(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); try { dataStreams.start(); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create(null, null), - 9, - 0, - 10, - timeSource.getCurrentTimeNanos(), - 0, - 0, - 0, - null)); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create( - "testType", DataStreamsTags.Direction.INBOUND, "testTopic", "testGroup", null), - 1, - 2, - 5, - timeSource.getCurrentTimeNanos(), - 0, - 0, - 0, - null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create(null, null), + 9, + 0, + 10, + timeSource.getCurrentTimeNanos(), + 0, + 0, + 0, + null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create( + "testType", DataStreamsTags.Direction.INBOUND, "testTopic", "testGroup", null), + 1, + 2, + 5, + timeSource.getCurrentTimeNanos(), + 0, + 0, + 0, + null)); dataStreams.trackBacklog( DataStreamsTags.createWithPartition("kafka_produce", "testTopic", "1", null, null), 100); dataStreams.trackBacklog( DataStreamsTags.createWithPartition("kafka_produce", "testTopic", "1", null, null), 130); timeSource.advance(defaultBucketDurationNanos - 100L); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create( - "testType", DataStreamsTags.Direction.INBOUND, "testTopic", "testGroup", null), - 1, - 2, - 5, - timeSource.getCurrentTimeNanos(), - SECONDS.toNanos(10), - SECONDS.toNanos(10), - 10, - null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create( + "testType", DataStreamsTags.Direction.INBOUND, "testTopic", "testGroup", null), + 1, + 2, + 5, + timeSource.getCurrentTimeNanos(), + SECONDS.toNanos(10), + SECONDS.toNanos(10), + 10, + null)); timeSource.advance(defaultBucketDurationNanos); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create( - "testType", DataStreamsTags.Direction.INBOUND, "testTopic", "testGroup", null), - 1, - 2, - 5, - timeSource.getCurrentTimeNanos(), - SECONDS.toNanos(5), - SECONDS.toNanos(5), - 5, - null)); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create( - "testType", DataStreamsTags.Direction.INBOUND, "testTopic2", "testGroup", null), - 3, - 4, - 6, - timeSource.getCurrentTimeNanos(), - SECONDS.toNanos(2), - 0, - 2, - null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create( + "testType", DataStreamsTags.Direction.INBOUND, "testTopic", "testGroup", null), + 1, + 2, + 5, + timeSource.getCurrentTimeNanos(), + SECONDS.toNanos(5), + SECONDS.toNanos(5), + 5, + null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create( + "testType", DataStreamsTags.Direction.INBOUND, "testTopic2", "testGroup", null), + 3, + 4, + 6, + timeSource.getCurrentTimeNanos(), + SECONDS.toNanos(2), + 0, + 2, + null)); timeSource.advance(defaultBucketDurationNanos); dataStreams.close(); @@ -266,9 +250,8 @@ void writeBucketToMockServer(boolean processTagsEnabled) @Test void writeKafkaConfigsToMockServer() throws InterruptedException, IOException { - WellKnownTags wellKnownTags = - new WellKnownTags( - "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); + WellKnownTags wellKnownTags = new WellKnownTags( + "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); Config fakeConfig = mock(Config.class); when(fakeConfig.getAgentUrl()).thenReturn(serverAddress.toString()); when(fakeConfig.getWellKnownTags()).thenReturn(wellKnownTags); @@ -286,9 +269,8 @@ void writeKafkaConfigsToMockServer() throws InterruptedException, IOException { TraceConfig traceConfig = mock(TraceConfig.class); when(traceConfig.isDataStreamsEnabled()).thenReturn(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); dataStreams.start(); // Report a producer and consumer config @@ -305,17 +287,16 @@ void writeKafkaConfigsToMockServer() throws InterruptedException, IOException { dataStreams.reportKafkaConfig("kafka_consumer", "", "test-group", consumerConfig); // Also add a stats point so the bucket is not empty of stats - dataStreams.add( - new StatsPoint( - DataStreamsTags.create(null, null), - 9, - 0, - 10, - timeSource.getCurrentTimeNanos(), - 0, - 0, - 0, - null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create(null, null), + 9, + 0, + 10, + timeSource.getCurrentTimeNanos(), + 0, + 0, + 0, + null)); timeSource.advance(defaultBucketDurationNanos); dataStreams.close(); @@ -326,9 +307,8 @@ void writeKafkaConfigsToMockServer() throws InterruptedException, IOException { @Test void writeKafkaConsumerGroupMemberToMockServer() throws InterruptedException, IOException { - WellKnownTags wellKnownTags = - new WellKnownTags( - "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); + WellKnownTags wellKnownTags = new WellKnownTags( + "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); Config fakeConfig = mock(Config.class); when(fakeConfig.getAgentUrl()).thenReturn(serverAddress.toString()); when(fakeConfig.getWellKnownTags()).thenReturn(wellKnownTags); @@ -346,25 +326,23 @@ void writeKafkaConsumerGroupMemberToMockServer() throws InterruptedException, IO TraceConfig traceConfig = mock(TraceConfig.class); when(traceConfig.isDataStreamsEnabled()).thenReturn(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); dataStreams.start(); dataStreams.reportKafkaConsumerGroupMember( "cluster-1", "test-group", "consumer-1-abc123", 7, "range"); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create(null, null), - 9, - 0, - 10, - timeSource.getCurrentTimeNanos(), - 0, - 0, - 0, - null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create(null, null), + 9, + 0, + 10, + timeSource.getCurrentTimeNanos(), + 0, + 0, + 0, + null)); timeSource.advance(defaultBucketDurationNanos); dataStreams.close(); @@ -375,9 +353,8 @@ void writeKafkaConsumerGroupMemberToMockServer() throws InterruptedException, IO @Test void duplicateKafkaConfigsAreEachSerializedInPayload() throws InterruptedException, IOException { - WellKnownTags wellKnownTags = - new WellKnownTags( - "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); + WellKnownTags wellKnownTags = new WellKnownTags( + "runtimeid", "hostname", "test", Config.get().getServiceName(), "version", "java"); Config fakeConfig = mock(Config.class); when(fakeConfig.getAgentUrl()).thenReturn(serverAddress.toString()); when(fakeConfig.getWellKnownTags()).thenReturn(wellKnownTags); @@ -395,9 +372,8 @@ void duplicateKafkaConfigsAreEachSerializedInPayload() throws InterruptedExcepti TraceConfig traceConfig = mock(TraceConfig.class); when(traceConfig.isDataStreamsEnabled()).thenReturn(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + fakeConfig, sharedCommObjects, timeSource, () -> traceConfig); dataStreams.start(); // Report the same producer config twice — both should be serialized @@ -408,17 +384,16 @@ void duplicateKafkaConfigsAreEachSerializedInPayload() throws InterruptedExcepti dataStreams.reportKafkaConfig("kafka_producer", "", "", producerConfig); // Also add a stats point so the bucket has content - dataStreams.add( - new StatsPoint( - DataStreamsTags.create(null, null), - 9, - 0, - 10, - timeSource.getCurrentTimeNanos(), - 0, - 0, - 0, - null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create(null, null), + 9, + 0, + 10, + timeSource.getCurrentTimeNanos(), + 0, + 0, + 0, + null)); timeSource.advance(defaultBucketDurationNanos); dataStreams.close(); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoringTest.java b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoringTest.java index 9438632a088..357d8f2435a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoringTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoringTest.java @@ -114,26 +114,24 @@ void noPayloadsWrittenIfDataStreamsNotSupportedOrNotEnabled( Sink sink = mock(Sink.class); TraceConfig traceConfig = stubTraceConfig(enabledInConfig); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); - dataStreams.add( - new StatsPoint( - DataStreamsTags.create("testType", null, "testTopic", "testGroup", null), - 0, - 0, - 0, - timeSource.getCurrentTimeNanos(), - 0, - 0, - 0, - null)); + dataStreams.add(new StatsPoint( + DataStreamsTags.create("testType", null, "testTopic", "testGroup", null), + 0, + 0, + 0, + timeSource.getCurrentTimeNanos(), + 0, + 0, + 0, + null)); dataStreams.report(); awaitIdle(dataStreams); @@ -151,13 +149,11 @@ void contextCarrierAdapterTest() { String[] extracted = new String[] {""}; DataStreamsContextCarrierAdapter.INSTANCE.set(carrier, keyName, keyValue); - DataStreamsContextCarrierAdapter.INSTANCE.forEachKeyValue( - carrier, - (key, value) -> { - if (keyName.equals(key)) { - extracted[0] = value; - } - }); + DataStreamsContextCarrierAdapter.INSTANCE.forEachKeyValue(carrier, (key, value) -> { + if (keyName.equals(key)) { + extracted[0] = value; + } + }); assertEquals(keyValue, extracted[0]); } @@ -170,14 +166,13 @@ void writeGroupAfterADelay() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); @@ -211,9 +206,8 @@ void slowWriteGroupAfterADelay() throws InterruptedException { long bucketDuration = TimeUnit.MILLISECONDS.toNanos(200); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, features, timeSource, () -> traceConfig, payloadWriter, bucketDuration); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, features, timeSource, () -> traceConfig, payloadWriter, bucketDuration); dataStreams.start(); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); @@ -244,14 +238,13 @@ void groupsForCurrentBucketAreNotReported() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); @@ -285,14 +278,13 @@ void allGroupsWrittenInClose() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags1 = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); @@ -340,14 +332,13 @@ void kafkaOffsetsAreTracked() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); dataStreams.trackBacklog( DataStreamsTags.createWithPartition("kafka_commit", "testTopic", "2", null, "testGroup"), @@ -397,14 +388,13 @@ void groupsFromMultipleBucketsAreReported() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags1 = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); @@ -454,43 +444,39 @@ void multiplePointsAreCorrectlyGroupedInMultipleBuckets() throws InterruptedExce TraceConfig traceConfig = stubTraceConfig(true); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); dataStreams.add(new StatsPoint(tags, 1, 2, 1, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); timeSource.advance(DEFAULT_BUCKET_DURATION_NANOS - 100L); - dataStreams.add( - new StatsPoint( - tags, - 1, - 2, - 1, - timeSource.getCurrentTimeNanos(), - SECONDS.toNanos(10), - SECONDS.toNanos(10), - 10, - null)); + dataStreams.add(new StatsPoint( + tags, + 1, + 2, + 1, + timeSource.getCurrentTimeNanos(), + SECONDS.toNanos(10), + SECONDS.toNanos(10), + 10, + null)); timeSource.advance(DEFAULT_BUCKET_DURATION_NANOS); - dataStreams.add( - new StatsPoint( - tags, - 1, - 2, - 1, - timeSource.getCurrentTimeNanos(), - SECONDS.toNanos(5), - SECONDS.toNanos(5), - 5, - null)); - dataStreams.add( - new StatsPoint( - tags, 3, 4, 5, timeSource.getCurrentTimeNanos(), SECONDS.toNanos(2), 0, 0, null)); + dataStreams.add(new StatsPoint( + tags, + 1, + 2, + 1, + timeSource.getCurrentTimeNanos(), + SECONDS.toNanos(5), + SECONDS.toNanos(5), + 5, + null)); + dataStreams.add(new StatsPoint( + tags, 3, 4, 5, timeSource.getCurrentTimeNanos(), SECONDS.toNanos(2), 0, 0, null)); timeSource.advance(DEFAULT_BUCKET_DURATION_NANOS); dataStreams.report(); @@ -547,14 +533,13 @@ void featureUpgrade() throws InterruptedException { TraceConfig traceConfig = stubTraceConfig(true); // reporting points when data streams is not supported - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); @@ -614,14 +599,13 @@ void featureDowngradeThenUpgrade() throws InterruptedException { TraceConfig traceConfig = stubTraceConfig(true); // reporting points after a downgrade - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); supportsDataStreaming[0] = false; dataStreams.onEvent(EventListener.EventType.DOWNGRADED, ""); @@ -676,14 +660,13 @@ void dynamicConfigEnableAndDisable() throws InterruptedException { // reporting points when data streams is not enabled DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); timeSource.advance(DEFAULT_BUCKET_DURATION_NANOS); @@ -751,14 +734,13 @@ void featureAndDynamicConfigUpgradeInteractions() throws InterruptedException { when(traceConfig.isDataStreamsEnabled()).thenAnswer(invocation -> dsmEnabled[0]); // reporting points when data streams is not supported - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); @@ -822,14 +804,13 @@ void moreFeatureAndDynamicConfigUpgradeInteractions() throws InterruptedExceptio when(traceConfig.isDataStreamsEnabled()).thenAnswer(invocation -> dsmEnabled[0]); // reporting points when data streams is not supported - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); @@ -865,14 +846,13 @@ void schemaRegistryUsagesAreAggregatedByOperation() throws InterruptedException Sink sink = mock(Sink.class); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); // Record serialize and deserialize operations @@ -1045,14 +1025,13 @@ void kafkaProducerConfigIsReportedInBucket() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map kafkaConfig = new HashMap<>(); kafkaConfig.put("bootstrap.servers", "localhost:9092"); @@ -1084,14 +1063,13 @@ void kafkaConsumerConfigIsReportedInBucket() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map kafkaConfig = new HashMap<>(); kafkaConfig.put("bootstrap.servers", "localhost:9092"); @@ -1125,14 +1103,13 @@ void kafkaConsumerGroupMemberIsReportedInBucket() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); dataStreams.reportKafkaConsumerGroupMember( "cluster-1", "test-group", "consumer-1-abc123", 7, "range"); @@ -1166,14 +1143,13 @@ void duplicateKafkaConfigsAreEachReportedInTheBucket() throws InterruptedExcepti TraceConfig traceConfig = stubTraceConfig(true); // reporting the same config twice - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map config1 = new HashMap<>(); config1.put("bootstrap.servers", "localhost:9092"); @@ -1212,14 +1188,13 @@ void kafkaConfigsReportedInSeparateBucketsAppearInEachBucket() throws Interrupte TraceConfig traceConfig = stubTraceConfig(true); // reporting a config in the first bucket - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map kafkaConfig = new HashMap<>(); kafkaConfig.put("bootstrap.servers", "localhost:9092"); @@ -1263,14 +1238,13 @@ void differentKafkaConfigsAreBothReported() throws InterruptedException { TraceConfig traceConfig = stubTraceConfig(true); // reporting producer and consumer configs - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map producerConfig = new HashMap<>(); producerConfig.put("bootstrap.servers", "localhost:9092"); @@ -1323,14 +1297,13 @@ void kafkaConfigsWithDifferentValuesForSameTypeAreNotDeduplicated() throws Inter TraceConfig traceConfig = stubTraceConfig(true); // reporting two producer configs with different settings - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map config1 = new HashMap<>(); config1.put("bootstrap.servers", "localhost:9092"); @@ -1361,14 +1334,13 @@ void kafkaConfigsAreReportedAlongsideStatsPoints() throws InterruptedException { TraceConfig traceConfig = stubTraceConfig(true); // reporting both stats points and kafka configs - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); DataStreamsTags tags = DataStreamsTags.create("testType", null, "testTopic", "testGroup", null); dataStreams.add(new StatsPoint(tags, 1, 2, 3, timeSource.getCurrentTimeNanos(), 0, 0, 0, null)); @@ -1414,14 +1386,13 @@ void kafkaConfigsNotReportedWhenDSMIsDisabled(boolean enabledAtAgent, boolean en Sink sink = mock(Sink.class); TraceConfig traceConfig = stubTraceConfig(enabledInConfig); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map kafkaConfig = new HashMap<>(); kafkaConfig.put("bootstrap.servers", "localhost:9092"); @@ -1445,14 +1416,13 @@ void kafkaConfigsFlushedOnClose() throws InterruptedException { CapturingPayloadWriter payloadWriter = new CapturingPayloadWriter(); TraceConfig traceConfig = stubTraceConfig(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); dataStreams.start(); Map kafkaConfig = new HashMap<>(); kafkaConfig.put("bootstrap.servers", "localhost:9092"); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultPathwayContextTest.java b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultPathwayContextTest.java index 8860cf1571c..cf242105992 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultPathwayContextTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/datastreams/DefaultPathwayContextTest.java @@ -186,17 +186,15 @@ void setCheckpointWithDatasetTags() throws IOException { timeSource.advance(MILLISECONDS.toNanos(50)); context.setCheckpoint( - fromTags( - DataStreamsTags.createWithDataset( - "s3", DataStreamsTags.Direction.INBOUND, null, "my_object.csv", "my_bucket")), + fromTags(DataStreamsTags.createWithDataset( + "s3", DataStreamsTags.Direction.INBOUND, null, "my_object.csv", "my_bucket")), pointConsumer); String encoded = context.encode(); timeSource.advance(MILLISECONDS.toNanos(2)); DefaultPathwayContext decodedContext = DefaultPathwayContext.decode(timeSource, null, encoded); timeSource.advance(MILLISECONDS.toNanos(25)); - DataStreamsTags tags = - DataStreamsTags.createWithDataset( - "s3", DataStreamsTags.Direction.OUTBOUND, null, "my_object.csv", "my_bucket"); + DataStreamsTags tags = DataStreamsTags.createWithDataset( + "s3", DataStreamsTags.Direction.OUTBOUND, null, "my_object.csv", "my_bucket"); context.setCheckpoint(fromTags(tags), pointConsumer); assertTrue(decodedContext.isStarted()); @@ -276,9 +274,8 @@ void encodingAndDecodingBase64WithContextsAndCheckpoints() throws IOException { DefaultPathwayContext decodedContext = DefaultPathwayContext.decode(timeSource, null, encoded); timeSource.advance(MILLISECONDS.toNanos(25)); context.setCheckpoint( - fromTags( - DataStreamsTags.create( - "kafka", DataStreamsTags.Direction.OUTBOUND, "topic", "group", null)), + fromTags(DataStreamsTags.create( + "kafka", DataStreamsTags.Direction.OUTBOUND, "topic", "group", null)), pointConsumer); assertTrue(decodedContext.isStarted()); @@ -300,9 +297,8 @@ void encodingAndDecodingBase64WithContextsAndCheckpoints() throws IOException { DefaultPathwayContext.decode(timeSource, null, secondEncode); timeSource.advance(MILLISECONDS.toNanos(30)); context.setCheckpoint( - fromTags( - DataStreamsTags.create( - "kafka", DataStreamsTags.Direction.INBOUND, "topicB", "group", null)), + fromTags(DataStreamsTags.create( + "kafka", DataStreamsTags.Direction.INBOUND, "topicB", "group", null)), pointConsumer); assertTrue(secondDecode.isStarted()); @@ -340,9 +336,8 @@ void encodingAndDecodingBase64WithInjectsAndExtracts() throws IOException { DefaultPathwayContext.extract(carrier, contextVisitor, timeSource, null); timeSource.advance(MILLISECONDS.toNanos(25)); context.setCheckpoint( - fromTags( - DataStreamsTags.create( - "kafka", DataStreamsTags.Direction.OUTBOUND, "topic", "group", null)), + fromTags(DataStreamsTags.create( + "kafka", DataStreamsTags.Direction.OUTBOUND, "topic", "group", null)), pointConsumer); assertTrue(decodedContext.isStarted()); @@ -366,9 +361,8 @@ void encodingAndDecodingBase64WithInjectsAndExtracts() throws IOException { DefaultPathwayContext.extract(carrier, contextVisitor, timeSource, null); timeSource.advance(MILLISECONDS.toNanos(30)); context.setCheckpoint( - fromTags( - DataStreamsTags.create( - "kafka", DataStreamsTags.Direction.INBOUND, "topicB", "group", null)), + fromTags(DataStreamsTags.create( + "kafka", DataStreamsTags.Direction.INBOUND, "topicB", "group", null)), pointConsumer); assertTrue(secondDecode.isStarted()); @@ -457,9 +451,8 @@ void emptyTagsNotSet() { pointConsumer); timeSource.advance(25); context.setCheckpoint( - fromTags( - DataStreamsTags.create( - "type", DataStreamsTags.Direction.OUTBOUND, "topic", "group", null)), + fromTags(DataStreamsTags.create( + "type", DataStreamsTags.Direction.OUTBOUND, "topic", "group", null)), pointConsumer); timeSource.advance(25); context.setCheckpoint(fromTags(DataStreamsTags.create(null, null)), pointConsumer); @@ -506,14 +499,13 @@ void checkContextExtractorDecoratorBehavior(boolean dynamicConfigEnabled) throws AgentTracer.forceRegister(tracerApi); try { - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> globalTraceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> globalTraceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); BaseHash.updateBaseHash(BASE_HASH); DefaultPathwayContext context = new DefaultPathwayContext(timeSource, null); @@ -566,14 +558,13 @@ void checkContextExtractorDecoratorBehaviorWhenTraceDataIsNull(boolean globalDsm AgentTracer.forceRegister(tracerApi); try { - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> globalTraceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> globalTraceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); BaseHash.updateBaseHash(BASE_HASH); DefaultPathwayContext context = new DefaultPathwayContext(timeSource, null); @@ -626,14 +617,13 @@ void checkContextExtractorDecoratorBehaviorWhenLocalTraceConfigIsNull(boolean gl AgentTracer.forceRegister(tracerApi); try { - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> globalTraceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> globalTraceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); BaseHash.updateBaseHash(BASE_HASH); DefaultPathwayContext context = new DefaultPathwayContext(timeSource, null); @@ -646,19 +636,18 @@ void checkContextExtractorDecoratorBehaviorWhenLocalTraceConfigIsNull(boolean gl carrier.put(PROPAGATION_KEY_BASE64, encoded); carrier.put("someotherkey", "someothervalue"); Base64MapContextVisitor contextVisitor = new Base64MapContextVisitor(); - ExtractedContext spanContext = - new ExtractedContext( - DDTraceId.ONE, - 1, - 0, - null, - 0, - null, - (TagMap) null, - null, - null, - globalTraceConfig, - DATADOG); + ExtractedContext spanContext = new ExtractedContext( + DDTraceId.ONE, + 1, + 0, + null, + 0, + null, + (TagMap) null, + null, + null, + globalTraceConfig, + DATADOG); Context baseContext = AgentSpan.fromSpanContext(spanContext).storeInto(root()); Propagator propagator = dataStreams.propagator(); @@ -694,14 +683,13 @@ void checkContextExtractorDecoratorBehaviorWhenTraceDataAndDsmDataAreNull() { TraceConfig traceConfig = mock(TraceConfig.class, RETURNS_SMART_NULLS); when(traceConfig.isDataStreamsEnabled()).thenReturn(true); - DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, - features, - timeSource, - () -> traceConfig, - payloadWriter, - DEFAULT_BUCKET_DURATION_NANOS); + DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, + features, + timeSource, + () -> traceConfig, + payloadWriter, + DEFAULT_BUCKET_DURATION_NANOS); Map carrier = new HashMap<>(); carrier.put("someotherkey", "someothervalue"); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/monitor/HealthMetricsTest.java b/dd-trace-core/src/test/java/datadog/trace/core/monitor/HealthMetricsTest.java index bf388364d78..2a1522fc5f5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/monitor/HealthMetricsTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/monitor/HealthMetricsTest.java @@ -29,7 +29,8 @@ @ExtendWith(MockitoExtension.class) class HealthMetricsTest { - @Mock StatsDClient statsD; + @Mock + StatsDClient statsD; @Test void testOnShutdown() { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpCommonProtoTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpCommonProtoTest.java index 21b7641dc1a..e574b146bf2 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpCommonProtoTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpCommonProtoTest.java @@ -316,11 +316,8 @@ void testEmptyLongArrayAttribute() throws IOException { @Test void testLongArrayAttribute() throws IOException { - byte[] bytes = - encode( - LONG_ARRAY_ATTRIBUTE, - "arr-long", - Arrays.asList(0L, -1L, Long.MIN_VALUE, Long.MAX_VALUE)); + byte[] bytes = encode( + LONG_ARRAY_ATTRIBUTE, "arr-long", Arrays.asList(0L, -1L, Long.MIN_VALUE, Long.MAX_VALUE)); CodedInputStream kv = keyValueStream(bytes); assertEquals("arr-long", readKeyField(kv)); @@ -352,11 +349,10 @@ void testEmptyDoubleArrayAttribute() throws IOException { @Test void testDoubleArrayAttribute() throws IOException { - byte[] bytes = - encode( - DOUBLE_ARRAY_ATTRIBUTE, - "arr-dbl", - Arrays.asList(0.0, -1.5, Double.NaN, Double.POSITIVE_INFINITY)); + byte[] bytes = encode( + DOUBLE_ARRAY_ATTRIBUTE, + "arr-dbl", + Arrays.asList(0.0, -1.5, Double.NaN, Double.POSITIVE_INFINITY)); CodedInputStream kv = keyValueStream(bytes); assertEquals("arr-dbl", readKeyField(kv)); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpGrpcRequestBodyTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpGrpcRequestBodyTest.java index 702be21873c..6cdcfc47214 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpGrpcRequestBodyTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpGrpcRequestBodyTest.java @@ -17,20 +17,16 @@ class OtlpGrpcRequestBodyTest { @Test void contentTypeIsApplicationGrpc() { - OtlpGrpcRequestBody body = - new OtlpGrpcRequestBody( - new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3}), "application/grpc+proto"), - false); + OtlpGrpcRequestBody body = new OtlpGrpcRequestBody( + new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3}), "application/grpc+proto"), false); assertEquals(MediaType.get("application/grpc"), body.contentType()); } @Test void contentLengthIsHeaderPlusPayloadWhenUncompressed() { - OtlpGrpcRequestBody body = - new OtlpGrpcRequestBody( - new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/grpc+proto"), - false); + OtlpGrpcRequestBody body = new OtlpGrpcRequestBody( + new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/grpc+proto"), false); // 5-byte header (1 flag + 4 length) + 4-byte payload = 9 assertEquals(9, body.contentLength()); @@ -38,10 +34,8 @@ void contentLengthIsHeaderPlusPayloadWhenUncompressed() { @Test void contentLengthIsNegativeOneWhenGzipped() { - OtlpGrpcRequestBody body = - new OtlpGrpcRequestBody( - new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/grpc+proto"), - true); + OtlpGrpcRequestBody body = new OtlpGrpcRequestBody( + new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/grpc+proto"), true); assertEquals(-1, body.contentLength()); } @@ -49,9 +43,8 @@ void contentLengthIsNegativeOneWhenGzipped() { @Test void writeToProducesGrpcFrameWithUncompressedFlagWhenNotGzipped() throws IOException { byte[] data = {10, 20, 30, 40, 50}; - OtlpGrpcRequestBody body = - new OtlpGrpcRequestBody( - new OtlpPayload(ByteBuffer.wrap(data), "application/grpc+proto"), false); + OtlpGrpcRequestBody body = new OtlpGrpcRequestBody( + new OtlpPayload(ByteBuffer.wrap(data), "application/grpc+proto"), false); Buffer sink = new Buffer(); body.writeTo(sink); @@ -64,9 +57,8 @@ void writeToProducesGrpcFrameWithUncompressedFlagWhenNotGzipped() throws IOExcep @Test void writeToProducesGrpcFrameWithCompressedFlagAndGzipDataWhenGzipped() throws IOException { byte[] data = "the quick brown fox jumps over the lazy dog".getBytes(); - OtlpGrpcRequestBody body = - new OtlpGrpcRequestBody( - new OtlpPayload(ByteBuffer.wrap(data), "application/grpc+proto"), true); + OtlpGrpcRequestBody body = new OtlpGrpcRequestBody( + new OtlpPayload(ByteBuffer.wrap(data), "application/grpc+proto"), true); Buffer sink = new Buffer(); body.writeTo(sink); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpHttpRequestBodyTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpHttpRequestBodyTest.java index bd354049e9c..76cc4d77ee4 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpHttpRequestBodyTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpHttpRequestBodyTest.java @@ -17,20 +17,16 @@ class OtlpHttpRequestBodyTest { @Test void contentTypeIsParsedFromPayload() { - OtlpHttpRequestBody body = - new OtlpHttpRequestBody( - new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3}), "application/x-protobuf"), - false); + OtlpHttpRequestBody body = new OtlpHttpRequestBody( + new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3}), "application/x-protobuf"), false); assertEquals(MediaType.get("application/x-protobuf"), body.contentType()); } @Test void contentLengthMatchesPayloadWhenUncompressed() { - OtlpHttpRequestBody body = - new OtlpHttpRequestBody( - new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/x-protobuf"), - false); + OtlpHttpRequestBody body = new OtlpHttpRequestBody( + new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/x-protobuf"), false); assertEquals(4, body.contentLength()); } @@ -38,10 +34,8 @@ void contentLengthMatchesPayloadWhenUncompressed() { @Test void contentLengthIsNegativeOneWhenGzipped() { // gzip writes chunked, so the framework can't know the length up front - OtlpHttpRequestBody body = - new OtlpHttpRequestBody( - new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/x-protobuf"), - true); + OtlpHttpRequestBody body = new OtlpHttpRequestBody( + new OtlpPayload(ByteBuffer.wrap(new byte[] {1, 2, 3, 4}), "application/x-protobuf"), true); assertEquals(-1, body.contentLength()); } @@ -49,9 +43,8 @@ void contentLengthIsNegativeOneWhenGzipped() { @Test void writeToDrainsRawBytesWhenUncompressed() throws IOException { byte[] data = {10, 20, 30, 40, 50}; - OtlpHttpRequestBody body = - new OtlpHttpRequestBody( - new OtlpPayload(ByteBuffer.wrap(data), "application/x-protobuf"), false); + OtlpHttpRequestBody body = new OtlpHttpRequestBody( + new OtlpPayload(ByteBuffer.wrap(data), "application/x-protobuf"), false); Buffer sink = new Buffer(); body.writeTo(sink); @@ -62,9 +55,8 @@ void writeToDrainsRawBytesWhenUncompressed() throws IOException { @Test void writeToProducesGzipStreamThatDecompressesToPayloadWhenGzipped() throws IOException { byte[] data = "the quick brown fox jumps over the lazy dog".getBytes(); - OtlpHttpRequestBody body = - new OtlpHttpRequestBody( - new OtlpPayload(ByteBuffer.wrap(data), "application/x-protobuf"), true); + OtlpHttpRequestBody body = new OtlpHttpRequestBody( + new OtlpPayload(ByteBuffer.wrap(data), "application/x-protobuf"), true); Buffer sink = new Buffer(); body.writeTo(sink); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceJsonTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceJsonTest.java index e73311993cf..72ee2a93c9e 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceJsonTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceJsonTest.java @@ -152,12 +152,10 @@ void testBuildResourceFragment( void datadogResourceAttributesVariantCarriesRuntimeId() throws IOException { Config config = Config.get(props(SERVICE_NAME, "my-service")); - Map withDatadog = - parseResourceAttributes( - OtlpResourceJson.buildResourceFragment(config, datadogResourceAttributes(config))); - Map plain = - parseResourceAttributes( - OtlpResourceJson.buildResourceFragment(config, Collections.emptyMap())); + Map withDatadog = parseResourceAttributes( + OtlpResourceJson.buildResourceFragment(config, datadogResourceAttributes(config))); + Map plain = parseResourceAttributes( + OtlpResourceJson.buildResourceFragment(config, Collections.emptyMap())); assertTrue( withDatadog.containsKey("datadog.runtime_id"), @@ -171,22 +169,19 @@ void datadogResourceAttributesVariantCarriesRuntimeId() throws IOException { @Test void datadogResourceAttributesOverrideCollidingGlobalProcessTag() throws IOException { - Config config = - Config.get( - props( - SERVICE_NAME, - "my-service", - TAGS, - "datadog.process_tags:user-value", - EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, - "true")); + Config config = Config.get(props( + SERVICE_NAME, + "my-service", + TAGS, + "datadog.process_tags:user-value", + EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, + "true")); ProcessTags.reset(config); ProcessTags.addTag("entrypoint.name", "app"); ProcessTags.addTag("entrypoint.type", "web"); - Map withDatadog = - parseResourceAttributes( - OtlpResourceJson.buildResourceFragment(config, datadogResourceAttributes(config))); + Map withDatadog = parseResourceAttributes( + OtlpResourceJson.buildResourceFragment(config, datadogResourceAttributes(config))); Object processTags = withDatadog.get("datadog.process_tags"); assertTrue(processTags instanceof List, "datadog.process_tags is a single arrayValue"); @@ -199,14 +194,10 @@ void statsComputedVariantCarriesMarker() throws IOException { Config.get(props(SERVICE_NAME, "my-service", OTEL_TRACES_SPAN_METRICS_ENABLED, "true")); Config withoutMetrics = Config.get(props(SERVICE_NAME, "my-service")); - Map withMarker = - parseResourceAttributes( - OtlpResourceJson.buildResourceFragment( - withMetrics, traceResourceAttributes(withMetrics))); - Map without = - parseResourceAttributes( - OtlpResourceJson.buildResourceFragment( - withoutMetrics, traceResourceAttributes(withoutMetrics))); + Map withMarker = parseResourceAttributes( + OtlpResourceJson.buildResourceFragment(withMetrics, traceResourceAttributes(withMetrics))); + Map without = parseResourceAttributes(OtlpResourceJson.buildResourceFragment( + withoutMetrics, traceResourceAttributes(withoutMetrics))); assertEquals( "true", withMarker.get("_dd.stats_computed"), "marker present when stats computed"); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceProtoTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceProtoTest.java index 24dda2ac60a..782f368acd7 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceProtoTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/common/OtlpResourceProtoTest.java @@ -177,12 +177,10 @@ void testBuildResourceMessage( void datadogResourceAttributesVariantCarriesRuntimeId() throws IOException { Config config = Config.get(props(SERVICE_NAME, "my-service")); - Map withDatadog = - parseResourceAttributes( - OtlpResourceProto.buildResourceMessage(config, datadogResourceAttributes(config))); - Map plain = - parseResourceAttributes( - OtlpResourceProto.buildResourceMessage(config, Collections.emptyMap())); + Map withDatadog = parseResourceAttributes( + OtlpResourceProto.buildResourceMessage(config, datadogResourceAttributes(config))); + Map plain = parseResourceAttributes( + OtlpResourceProto.buildResourceMessage(config, Collections.emptyMap())); assertTrue( withDatadog.containsKey("datadog.runtime_id"), @@ -196,22 +194,19 @@ void datadogResourceAttributesVariantCarriesRuntimeId() throws IOException { @Test void datadogResourceAttributesOverrideCollidingGlobalProcessTag() throws IOException { - Config config = - Config.get( - props( - SERVICE_NAME, - "my-service", - TAGS, - "datadog.process_tags:user-value", - EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, - "true")); + Config config = Config.get(props( + SERVICE_NAME, + "my-service", + TAGS, + "datadog.process_tags:user-value", + EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, + "true")); ProcessTags.reset(config); ProcessTags.addTag("entrypoint.name", "app"); ProcessTags.addTag("entrypoint.type", "web"); - Map withDatadog = - parseResourceAttributes( - OtlpResourceProto.buildResourceMessage(config, datadogResourceAttributes(config))); + Map withDatadog = parseResourceAttributes( + OtlpResourceProto.buildResourceMessage(config, datadogResourceAttributes(config))); Object processTags = withDatadog.get("datadog.process_tags"); assertTrue(processTags instanceof List, "datadog.process_tags is a single arrayValue"); @@ -224,14 +219,10 @@ void statsComputedVariantCarriesMarker() throws IOException { Config.get(props(SERVICE_NAME, "my-service", OTEL_TRACES_SPAN_METRICS_ENABLED, "true")); Config withoutMetrics = Config.get(props(SERVICE_NAME, "my-service")); - Map withMarker = - parseResourceAttributes( - OtlpResourceProto.buildResourceMessage( - withMetrics, traceResourceAttributes(withMetrics))); - Map without = - parseResourceAttributes( - OtlpResourceProto.buildResourceMessage( - withoutMetrics, traceResourceAttributes(withoutMetrics))); + Map withMarker = parseResourceAttributes( + OtlpResourceProto.buildResourceMessage(withMetrics, traceResourceAttributes(withMetrics))); + Map without = parseResourceAttributes(OtlpResourceProto.buildResourceMessage( + withoutMetrics, traceResourceAttributes(withoutMetrics))); assertEquals( "true", withMarker.get("_dd.stats_computed"), "marker present when stats computed"); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsJsonCollectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsJsonCollectorTest.java index 75c4cef2978..4ab6f61d70d 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsJsonCollectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsJsonCollectorTest.java @@ -35,7 +35,8 @@ */ class OtlpLogsJsonCollectorTest { - private static final CoreTracer TRACER = CoreTracer.builder().writer(new LoggingWriter()).build(); + private static final CoreTracer TRACER = + CoreTracer.builder().writer(new LoggingWriter()).build(); private static final OtelInstrumentationScope SCOPE = new OtelInstrumentationScope("test.logger", null, null); @@ -104,14 +105,13 @@ void collectionAfterFailedAttributeWriteIsStillWellFormed() throws IOException { // open the attributes array on the shared/reused collector, then blow up before it's closed assertThrows( RuntimeException.class, - () -> - collector.collectLogs( - (visitor, interval) -> { - OtlpScopedLogsVisitor scoped = visitor.visitScopedLogs(SCOPE); - scoped.visitAttribute(STRING_ATTRIBUTE, "service.name", "svc"); - throw new RuntimeException("boom"); - }, - 0)); + () -> collector.collectLogs( + (visitor, interval) -> { + OtlpScopedLogsVisitor scoped = visitor.visitScopedLogs(SCOPE); + scoped.visitAttribute(STRING_ATTRIBUTE, "service.name", "svc"); + throw new RuntimeException("boom"); + }, + 0)); // a subsequent, successful collection must still emit a well-formed attributes array OtlpLogRecord record = logRecord("tagged", null, null); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsProtoTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsProtoTest.java index 735653921cb..88f41353f3e 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsProtoTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/logs/OtlpLogsProtoTest.java @@ -72,7 +72,8 @@ */ class OtlpLogsProtoTest { - static final CoreTracer TRACER = CoreTracer.builder().writer(new LoggingWriter()).build(); + static final CoreTracer TRACER = + CoreTracer.builder().writer(new LoggingWriter()).build(); // ── well-known scopes ────────────────────────────────────────────────────── @@ -99,10 +100,12 @@ static final class LogSpec { int severityNumber; /** severity_text (proto field 3); {@code null} → field absent. */ - @Nullable String severityText; + @Nullable + String severityText; /** body.string_value (proto field 5 → AnyValue field 1); {@code null} → field absent. */ - @Nullable final String body; + @Nullable + final String body; /** Extra attributes written via {@code visitAttribute} before the log record. */ Map attrs; @@ -114,7 +117,8 @@ static final class LogSpec { int spanContextIndex; /** event_name (proto field 12); {@code null} → field absent. */ - @Nullable String eventName; + @Nullable + String eventName; /** * If true, the span at {@code spanContextIndex} is started under a known 128-bit trace ID so @@ -291,18 +295,17 @@ static Stream cases() { "log with double attribute", asList(taggedLog("tagged", attrs("latency.ms", 3.14)))), Arguments.of( "log with multiple mixed attributes", - asList( - taggedLog( - "multi-tagged", - attrs( - "service.name", - "svc", - "http.status_code", - 500L, - "error", - Boolean.TRUE, - "latency.ms", - 1.5)))), + asList(taggedLog( + "multi-tagged", + attrs( + "service.name", + "svc", + "http.status_code", + 500L, + "error", + Boolean.TRUE, + "latency.ms", + 1.5)))), // ── instrumentation scope ───────────────────────────────────────────── Arguments.of( @@ -332,31 +335,28 @@ static Stream cases() { void testCollectLogs(String caseName, List specs) throws IOException { List spans = buildSpans(specs); - OtlpPayload payload = - OtlpLogsProtoCollector.INSTANCE.collectLogs( - (visitor, interval) -> { - for (List scopeGroup : groupByScope(specs).values()) { - OtlpScopedLogsVisitor scoped = visitor.visitScopedLogs(scopeGroup.get(0).scope); - for (LogSpec spec : scopeGroup) { - for (Map.Entry attr : spec.attrs.entrySet()) { - scoped.visitAttribute( - attrType(attr.getValue()), attr.getKey(), attr.getValue()); - } - scoped.visitLogRecord( - new OtlpLogRecord( - spec.scope, - spec.timestampNanos, - spec.observedNanos, - spec.severityNumber, - spec.severityText, - spec.body, - emptyMap(), - resolveContext(spans, spec), - spec.eventName)); - } + OtlpPayload payload = OtlpLogsProtoCollector.INSTANCE.collectLogs( + (visitor, interval) -> { + for (List scopeGroup : groupByScope(specs).values()) { + OtlpScopedLogsVisitor scoped = visitor.visitScopedLogs(scopeGroup.get(0).scope); + for (LogSpec spec : scopeGroup) { + for (Map.Entry attr : spec.attrs.entrySet()) { + scoped.visitAttribute(attrType(attr.getValue()), attr.getKey(), attr.getValue()); } - }, - 0); + scoped.visitLogRecord(new OtlpLogRecord( + spec.scope, + spec.timestampNanos, + spec.observedNanos, + spec.severityNumber, + spec.severityText, + spec.body, + emptyMap(), + resolveContext(spans, spec), + spec.eventName)); + } + } + }, + 0); if (specs.isEmpty()) { assertEquals(0, payload.getContentLength(), "empty specs must produce empty payload"); @@ -444,14 +444,13 @@ private static List buildSpans(List specs) { } AgentSpan span; if (refSpec != null && refSpec.use128BitTraceId) { - ExtractedContext parent128 = - new ExtractedContext( - TRACE_ID_128BIT, - 0L, - PrioritySampling.UNSET, - null, - PropagationTags.factory().empty(), - TracePropagationStyle.DATADOG); + ExtractedContext parent128 = new ExtractedContext( + TRACE_ID_128BIT, + 0L, + PrioritySampling.UNSET, + null, + PropagationTags.factory().empty(), + TracePropagationStyle.DATADOG); span = TRACER.startSpan("test", "test.op.128", parent128, 0L); } else { span = TRACER.startSpan("test", "test.op", 0L); @@ -481,7 +480,9 @@ private static AgentSpanContext resolveContext(List spans, LogSpec spec) private static Map> groupByScope(List specs) { Map> groups = new LinkedHashMap<>(); for (LogSpec spec : specs) { - groups.computeIfAbsent(spec.scope.getName().toString(), k -> new ArrayList<>()).add(spec); + groups + .computeIfAbsent(spec.scope.getName().toString(), k -> new ArrayList<>()) + .add(spec); } return groups; } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsJsonCollectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsJsonCollectorTest.java index a3cbf6a0637..6fdfbbefac7 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsJsonCollectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsJsonCollectorTest.java @@ -50,13 +50,11 @@ void metricWithNoDataPointsContributesNothing() throws IOException { OtelInstrumentDescriptor descriptor = new OtelInstrumentDescriptor("unused", COUNTER, true, null, null); - OtlpPayload payload = - collect( - visitor -> { - OtlpScopedMetricsVisitor scoped = - visitor.visitScopedMetrics(new OtelInstrumentationScope("io.test", null, null)); - scoped.visitMetric(descriptor); // never visited with an attribute or data point - }); + OtlpPayload payload = collect(visitor -> { + OtlpScopedMetricsVisitor scoped = + visitor.visitScopedMetrics(new OtelInstrumentationScope("io.test", null, null)); + scoped.visitMetric(descriptor); // never visited with an attribute or data point + }); assertEquals(OtlpPayload.EMPTY, payload); } @@ -66,20 +64,17 @@ void scopeWithNoDataPointsContributesNothingWhenAnotherScopeHasData() throws IOE OtelInstrumentDescriptor emptyDescriptor = new OtelInstrumentDescriptor("unused", COUNTER, true, null, null); - OtlpPayload payload = - collect( - visitor -> { - OtlpScopedMetricsVisitor emptyScope = - visitor.visitScopedMetrics(new OtelInstrumentationScope("io.empty", null, null)); - emptyScope.visitMetric(emptyDescriptor); // never visited with a data point - - OtlpScopedMetricsVisitor dataScope = - visitor.visitScopedMetrics(new OtelInstrumentationScope("io.data", null, null)); - OtlpMetricVisitor mv = - dataScope.visitMetric( - new OtelInstrumentDescriptor("requests", COUNTER, true, null, null)); - mv.visitDataPoint(new OtlpLongPoint(1L)); - }); + OtlpPayload payload = collect(visitor -> { + OtlpScopedMetricsVisitor emptyScope = + visitor.visitScopedMetrics(new OtelInstrumentationScope("io.empty", null, null)); + emptyScope.visitMetric(emptyDescriptor); // never visited with a data point + + OtlpScopedMetricsVisitor dataScope = + visitor.visitScopedMetrics(new OtelInstrumentationScope("io.data", null, null)); + OtlpMetricVisitor mv = dataScope.visitMetric( + new OtelInstrumentDescriptor("requests", COUNTER, true, null, null)); + mv.visitDataPoint(new OtlpLongPoint(1L)); + }); List scopeMetrics = onlyScopeMetrics(payload); assertEquals(1, scopeMetrics.size(), "the empty scope must not appear in the payload"); @@ -91,18 +86,13 @@ void scopeWithNoDataPointsContributesNothingWhenAnotherScopeHasData() throws IOE @Test void gaugeHasNoStartTimeOrTemporality() throws IOException { - Map metric = - onlyMetric( - collect( - visitor -> { - OtlpScopedMetricsVisitor scoped = - visitor.visitScopedMetrics( - new OtelInstrumentationScope("io.gauge", null, null)); - OtlpMetricVisitor mv = - scoped.visitMetric( - new OtelInstrumentDescriptor("connections", GAUGE, false, null, null)); - mv.visitDataPoint(new OtlpDoublePoint(5.0)); - })); + Map metric = onlyMetric(collect(visitor -> { + OtlpScopedMetricsVisitor scoped = + visitor.visitScopedMetrics(new OtelInstrumentationScope("io.gauge", null, null)); + OtlpMetricVisitor mv = + scoped.visitMetric(new OtelInstrumentDescriptor("connections", GAUGE, false, null, null)); + mv.visitDataPoint(new OtlpDoublePoint(5.0)); + })); assertEquals("connections", metric.get("name")); Map gauge = (Map) metric.get("gauge"); @@ -116,19 +106,14 @@ void gaugeHasNoStartTimeOrTemporality() throws IOException { @Test void counterIsMonotonicSumWithIntegerTemporalityAndDecimalStringValue() throws IOException { - Map metric = - onlyMetric( - collect( - visitor -> { - OtlpScopedMetricsVisitor scoped = - visitor.visitScopedMetrics( - new OtelInstrumentationScope("io.test", null, null)); - OtlpMetricVisitor mv = - scoped.visitMetric( - new OtelInstrumentDescriptor("requests", COUNTER, true, null, null)); - mv.visitAttribute(STRING_ATTRIBUTE, "method", "GET"); - mv.visitDataPoint(new OtlpLongPoint(42L)); - })); + Map metric = onlyMetric(collect(visitor -> { + OtlpScopedMetricsVisitor scoped = + visitor.visitScopedMetrics(new OtelInstrumentationScope("io.test", null, null)); + OtlpMetricVisitor mv = + scoped.visitMetric(new OtelInstrumentDescriptor("requests", COUNTER, true, null, null)); + mv.visitAttribute(STRING_ATTRIBUTE, "method", "GET"); + mv.visitDataPoint(new OtlpLongPoint(42L)); + })); Map sum = (Map) metric.get("sum"); assertTrue(((Number) sum.get("aggregationTemporality")).intValue() >= 1); @@ -147,26 +132,19 @@ void counterIsMonotonicSumWithIntegerTemporalityAndDecimalStringValue() throws I @Test void histogramWithOverflowBoundaryOmitsInfinityAndAppendsNoExtraZero() throws IOException { - Map metric = - onlyMetric( - collect( - visitor -> { - OtlpScopedMetricsVisitor scoped = - visitor.visitScopedMetrics( - new OtelInstrumentationScope("io.hist", null, null)); - OtlpMetricVisitor mv = - scoped.visitMetric( - new OtelInstrumentDescriptor( - "request.size", HISTOGRAM, false, null, null)); - mv.visitDataPoint( - new OtlpHistogramPoint( - 5.0, - Arrays.asList(100.0, Double.POSITIVE_INFINITY), - Arrays.asList(4.0, 1.0), - 280.0, - 20.0, - 200.0)); - })); + Map metric = onlyMetric(collect(visitor -> { + OtlpScopedMetricsVisitor scoped = + visitor.visitScopedMetrics(new OtelInstrumentationScope("io.hist", null, null)); + OtlpMetricVisitor mv = scoped.visitMetric( + new OtelInstrumentDescriptor("request.size", HISTOGRAM, false, null, null)); + mv.visitDataPoint(new OtlpHistogramPoint( + 5.0, + Arrays.asList(100.0, Double.POSITIVE_INFINITY), + Arrays.asList(4.0, 1.0), + 280.0, + 20.0, + 200.0)); + })); Map histogram = (Map) metric.get("histogram"); List dataPoints = (List) histogram.get("dataPoints"); @@ -186,25 +164,14 @@ void histogramWithOverflowBoundaryOmitsInfinityAndAppendsNoExtraZero() throws IO @Test void histogramWithoutOverflowBoundaryAppendsExtraZeroCount() throws IOException { - Map metric = - onlyMetric( - collect( - visitor -> { - OtlpScopedMetricsVisitor scoped = - visitor.visitScopedMetrics( - new OtelInstrumentationScope("io.hist", null, null)); - OtlpMetricVisitor mv = - scoped.visitMetric( - new OtelInstrumentDescriptor("queue.size", HISTOGRAM, false, null, null)); - mv.visitDataPoint( - new OtlpHistogramPoint( - 8.0, - Arrays.asList(50.0, 100.0), - Arrays.asList(3.0, 5.0), - 750.0, - 10.0, - 95.0)); - })); + Map metric = onlyMetric(collect(visitor -> { + OtlpScopedMetricsVisitor scoped = + visitor.visitScopedMetrics(new OtelInstrumentationScope("io.hist", null, null)); + OtlpMetricVisitor mv = scoped.visitMetric( + new OtelInstrumentDescriptor("queue.size", HISTOGRAM, false, null, null)); + mv.visitDataPoint(new OtlpHistogramPoint( + 8.0, Arrays.asList(50.0, 100.0), Arrays.asList(3.0, 5.0), 750.0, 10.0, 95.0)); + })); Map histogram = (Map) metric.get("histogram"); Map point = diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsProtoTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsProtoTest.java index 8cc2ac4ea81..0f0c302702c 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsProtoTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpMetricsProtoTest.java @@ -327,138 +327,122 @@ static Stream cases() { // ── counter double with multiple attribute types ─────────────────────── Arguments.of( "counter double with string, long, bool, double attrs", - asList( - scope( - "io.test", - counterDouble( - "latency", - 3.14, - strAttr("service", "web"), - longAttr("status", 200L), - boolAttr("success", true), - dblAttr("rate", 0.5))))), + asList(scope( + "io.test", + counterDouble( + "latency", + 3.14, + strAttr("service", "web"), + longAttr("status", 200L), + boolAttr("success", true), + dblAttr("rate", 0.5))))), // ── histogram — overflow only (no explicit bounds) ──────────────────── Arguments.of( "histogram no explicit bounds — overflow bucket only", - asList( - scope( - "io.hist", - histogram( - "response.time", - 1.0, - asList(Double.POSITIVE_INFINITY), - asList(1.0), - 0.5, - 0.5, - 0.5)))), + asList(scope( + "io.hist", + histogram( + "response.time", + 1.0, + asList(Double.POSITIVE_INFINITY), + asList(1.0), + 0.5, + 0.5, + 0.5)))), // ── histogram — zero count and sum with overflow bucket ─────────────── Arguments.of( "histogram zero count and sum", - asList( - scope( - "io.hist", - histogram( - "idle.time", - 0.0, - asList(Double.POSITIVE_INFINITY), - asList(0.0), - 0.0, - 0.0, - 0.0)))), + asList(scope( + "io.hist", + histogram( + "idle.time", + 0.0, + asList(Double.POSITIVE_INFINITY), + asList(0.0), + 0.0, + 0.0, + 0.0)))), // ── histogram — single explicit bound with overflow ─────────────────── Arguments.of( "histogram single bound with overflow", - asList( - scope( - "io.hist", - histogram( - "request.size", - 5.0, - asList(100.0, Double.POSITIVE_INFINITY), - asList(4.0, 1.0), - 280.0, - 20.0, - 200.0)))), + asList(scope( + "io.hist", + histogram( + "request.size", + 5.0, + asList(100.0, Double.POSITIVE_INFINITY), + asList(4.0, 1.0), + 280.0, + 20.0, + 200.0)))), // ── histogram — finite bounds only (no overflow) — extra zero appended ─ Arguments.of( "histogram finite bounds — no overflow — extra zero bucket appended", - asList( - scope( - "io.hist", - histogram( - "queue.size", - 8.0, - asList(50.0, 100.0), - asList(3.0, 5.0), - 750.0, - 10.0, - 95.0)))), + asList(scope( + "io.hist", + histogram( + "queue.size", 8.0, asList(50.0, 100.0), asList(3.0, 5.0), 750.0, 10.0, 95.0)))), // ── histogram — with explicit bounds, overflow, and attrs ───────────── Arguments.of( "histogram with bounds, overflow, and string attr", - asList( - scope( - "io.hist", - histogram( - "response.time", - 10.0, - asList(1.0, 5.0, 10.0, Double.POSITIVE_INFINITY), - asList(2.0, 3.0, 4.0, 1.0), - 45.5, - 0.5, - 12.0, - strAttr("region", "us-east"))))), + asList(scope( + "io.hist", + histogram( + "response.time", + 10.0, + asList(1.0, 5.0, 10.0, Double.POSITIVE_INFINITY), + asList(2.0, 3.0, 4.0, 1.0), + 45.5, + 0.5, + 12.0, + strAttr("region", "us-east"))))), // ── histogram — many buckets with overflow and multiple attrs ────────── Arguments.of( "histogram many buckets with overflow, long and bool attrs", - asList( - scope( - "io.hist", - histogram( - "latency.ms", - 100.0, - asList(1.0, 2.0, 5.0, 10.0, 25.0, 50.0, 100.0, Double.POSITIVE_INFINITY), - asList(5.0, 10.0, 20.0, 30.0, 15.0, 12.0, 6.0, 2.0), - 4321.0, - 0.5, - 150.0, - longAttr("shard", 3L), - boolAttr("cached", false))))), + asList(scope( + "io.hist", + histogram( + "latency.ms", + 100.0, + asList(1.0, 2.0, 5.0, 10.0, 25.0, 50.0, 100.0, Double.POSITIVE_INFINITY), + asList(5.0, 10.0, 20.0, 30.0, 15.0, 12.0, 6.0, 2.0), + 4321.0, + 0.5, + 150.0, + longAttr("shard", 3L), + boolAttr("cached", false))))), // ── scope metadata — optional version and schema URL ────────────────── Arguments.of( "scope with version and schemaUrl", - asList( - scopeFull( - "io.opentelemetry", - "1.2.3", - "https://opentelemetry.io/schemas/1.21", - counterLong("events", 1L)))), + asList(scopeFull( + "io.opentelemetry", + "1.2.3", + "https://opentelemetry.io/schemas/1.21", + counterLong("events", 1L)))), Arguments.of( "scope with version only — no schemaUrl", asList(scopeFull("io.versioned", "2.0.0", null, counterLong("events", 1L)))), Arguments.of( "scope with schemaUrl only — no version", - asList( - scopeFull( - "io.schemed", - null, - "https://opentelemetry.io/schemas/1.21", - counterLong("events", 1L)))), + asList(scopeFull( + "io.schemed", + null, + "https://opentelemetry.io/schemas/1.21", + counterLong("events", 1L)))), // ── metric metadata — optional description and unit ─────────────────── Arguments.of( "metric with description and unit", - asList( - scope( - "io.test", - counterLongFull("cpu.usage", "CPU utilisation of the process", "%", 75L)))), + asList(scope( + "io.test", + counterLongFull("cpu.usage", "CPU utilisation of the process", "%", 75L)))), // ── observable gauge ────────────────────────────────────────────────── Arguments.of( @@ -541,20 +525,18 @@ void testCollectMetrics(String caseName, List expectedScopes) throws timeSource.set(START_EPOCH_NS); // captured in constructor OtlpMetricsProtoCollector collector = new OtlpMetricsProtoCollector(timeSource); timeSource.set(END_EPOCH_NS); // captured during collection - OtlpPayload payload = - collector.collectMetrics( - visitor -> { - for (ScopeSpec scope : expectedScopes) { - OtlpScopedMetricsVisitor sv = visitor.visitScopedMetrics(scope.toScope()); - for (MetricSpec metric : scope.metrics) { - OtlpMetricVisitor mv = sv.visitMetric(metric.toDescriptor()); - for (AttrSpec attr : metric.attrs) { - mv.visitAttribute(attr.type, attr.key, attr.value); - } - mv.visitDataPoint(metric.point); - } - } - }); + OtlpPayload payload = collector.collectMetrics(visitor -> { + for (ScopeSpec scope : expectedScopes) { + OtlpScopedMetricsVisitor sv = visitor.visitScopedMetrics(scope.toScope()); + for (MetricSpec metric : scope.metrics) { + OtlpMetricVisitor mv = sv.visitMetric(metric.toDescriptor()); + for (AttrSpec attr : metric.attrs) { + mv.visitAttribute(attr.type, attr.key, attr.value); + } + mv.visitDataPoint(metric.point); + } + } + }); // Scopes with no metrics produce no wire output — filter them for verification List nonEmptyScopes = new ArrayList<>(); @@ -621,12 +603,7 @@ void testCollectMetrics(String caseName, List expectedScopes) throws MetricSpec metricSpec = expectedMetricsByName.get(metricName); assertNotNull( metricSpec, - "unexpected metric '" - + metricName - + "' in scope " - + expected.name - + " [" - + caseName + "unexpected metric '" + metricName + "' in scope " + expected.name + " [" + caseName + "]"); verifyMetric(CodedInputStream.newInstance(metricBlob), metricSpec); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java index e20f8713b84..2c300bf11e6 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/metrics/OtlpStatsMetricWriterTest.java @@ -457,26 +457,25 @@ void additionalMetricTagsEmittedAsStringAttributes() throws IOException { // Additional tags arrive on the entry pre-packed as "key:value" UTF8 strings in schema order; // the writer splits each at the first ':' and emits it as a plain OTLP string attribute keyed // by the tag name. - AggregateEntry e = - AggregateEntryTestUtils.of( - "GET /users", - "web", - "servlet.request", - null, - "web", - 0, - false, - true, - "server", - null, - null, - null, - null, - new UTF8BytesString[] { - UTF8BytesString.create("region:us-east-1"), - UTF8BytesString.create("tenant_id:acme:corp"), - UTF8BytesString.create("datadog.custom:visible") - }); + AggregateEntry e = AggregateEntryTestUtils.of( + "GET /users", + "web", + "servlet.request", + null, + "web", + 0, + false, + true, + "server", + null, + null, + null, + null, + new UTF8BytesString[] { + UTF8BytesString.create("region:us-east-1"), + UTF8BytesString.create("tenant_id:acme:corp"), + UTF8BytesString.create("datadog.custom:visible") + }); AggregateEntryTestUtils.recordOk(e, SECONDS.toNanos(1)); Map attrs = writeAndDecode(e).dataPoints.get(0).attributes; @@ -492,27 +491,26 @@ void emptyValueEmittedButMalformedSlotsSkipped() throws IOException { // malformed -- aggregation treats an explicitly-empty tag as a distinct dimension from an // absent // one, so it is emitted as key="" to keep the OTLP attributes faithful to the aggregate key. - AggregateEntry e = - AggregateEntryTestUtils.of( - "GET /users", - "web", - "servlet.request", - null, - "web", - 0, - false, - true, - "server", - null, - null, - null, - null, - new UTF8BytesString[] { - UTF8BytesString.create("noseparator"), - UTF8BytesString.create(":emptykey"), - UTF8BytesString.create("emptyvalue:"), - UTF8BytesString.create("region:us-east-1") - }); + AggregateEntry e = AggregateEntryTestUtils.of( + "GET /users", + "web", + "servlet.request", + null, + "web", + 0, + false, + true, + "server", + null, + null, + null, + null, + new UTF8BytesString[] { + UTF8BytesString.create("noseparator"), + UTF8BytesString.create(":emptykey"), + UTF8BytesString.create("emptyvalue:"), + UTF8BytesString.create("region:us-east-1") + }); AggregateEntryTestUtils.recordOk(e, SECONDS.toNanos(1)); Map attrs = writeAndDecode(e).dataPoints.get(0).attributes; @@ -557,21 +555,20 @@ void serviceNameAlwaysEmittedOnDataPoint() throws IOException { /** An ok-only entry on the given service and operation name, recording a single 1s hit. */ private static AggregateEntry serviceEntry(String operationName, String service) { - AggregateEntry e = - AggregateEntryTestUtils.of( - "GET /users", - service, - operationName, - null, - "web", - 0, - false, - true, - "server", - null, - null, - null, - null); + AggregateEntry e = AggregateEntryTestUtils.of( + "GET /users", + service, + operationName, + null, + "web", + 0, + false, + true, + "server", + null, + null, + null, + null); AggregateEntryTestUtils.recordOk(e, SECONDS.toNanos(1)); return e; } @@ -623,21 +620,20 @@ void carriesDatadogAttributes(boolean topLevel) throws IOException { @ParameterizedTest @CsvSource({"true", "false"}) void emitsIsTraceRoot(boolean traceRoot) throws IOException { - AggregateEntry e = - AggregateEntryTestUtils.of( - "GET /users", - "web", - "servlet.request", - null, - "web", - 0, - false, - traceRoot, - "server", - null, - null, - null, - null); + AggregateEntry e = AggregateEntryTestUtils.of( + "GET /users", + "web", + "servlet.request", + null, + "web", + 0, + false, + traceRoot, + "server", + null, + null, + null, + null); AggregateEntryTestUtils.recordOk(e, SECONDS.toNanos(1)); Map attrs = writeAndDecode(e).dataPoints.get(0).attributes; @@ -647,21 +643,20 @@ void emitsIsTraceRoot(boolean traceRoot) throws IOException { @Test void serviceSourceEmittedOnlyWhenSet() throws IOException { - AggregateEntry e = - AggregateEntryTestUtils.of( - "GET /users", - "web", - "servlet.request", - "component", - "web", - 0, - false, - true, - "server", - null, - null, - null, - null); + AggregateEntry e = AggregateEntryTestUtils.of( + "GET /users", + "web", + "servlet.request", + "component", + "web", + 0, + false, + true, + "server", + null, + null, + null, + null); AggregateEntryTestUtils.recordOk(e, SECONDS.toNanos(1)); Map attrs = writeAndDecode(e).dataPoints.get(0).attributes; @@ -675,23 +670,22 @@ void serviceSourceEmittedOnlyWhenSet() throws IOException { @Test void emitsPeerTags() throws IOException { - AggregateEntry e = - AggregateEntryTestUtils.of( - "GET /users", - "web", - "servlet.request", - null, - "web", - 0, - false, - true, - "client", - Arrays.asList( - UTF8BytesString.create("peer.service:downstream"), - UTF8BytesString.create("net.peer.name:downstream.example.com")), - null, - null, - null); + AggregateEntry e = AggregateEntryTestUtils.of( + "GET /users", + "web", + "servlet.request", + null, + "web", + 0, + false, + true, + "client", + Arrays.asList( + UTF8BytesString.create("peer.service:downstream"), + UTF8BytesString.create("net.peer.name:downstream.example.com")), + null, + null, + null); AggregateEntryTestUtils.recordOk(e, SECONDS.toNanos(1)); Map attrs = writeAndDecode(e).dataPoints.get(0).attributes; @@ -723,21 +717,20 @@ void omitsPeerTagsWhenEmpty() throws IOException { nullValues = "NULL") void spanKindIsCanonicalizedToUppercaseEnumName(String spanKind, String expected) throws IOException { - AggregateEntry e = - AggregateEntryTestUtils.of( - "GET /users", - "web", - "servlet.request", - null, - "web", - 0, - false, - true, - spanKind, - null, - null, - null, - null); + AggregateEntry e = AggregateEntryTestUtils.of( + "GET /users", + "web", + "servlet.request", + null, + "web", + 0, + false, + true, + spanKind, + null, + null, + null, + null); AggregateEntryTestUtils.recordOk(e, SECONDS.toNanos(1)); Map attrs = writeAndDecode(e).dataPoints.get(0).attributes; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceJsonCollectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceJsonCollectorTest.java index 17ec0c0d17f..2142a2c4d09 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceJsonCollectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceJsonCollectorTest.java @@ -46,7 +46,8 @@ */ class OtlpTraceJsonCollectorTest { - private static final CoreTracer TRACER = CoreTracer.builder().writer(new LoggingWriter()).build(); + private static final CoreTracer TRACER = + CoreTracer.builder().writer(new LoggingWriter()).build(); @Test void emptyTraceProducesEmptyPayload() { @@ -133,14 +134,13 @@ void spanTraceStateOmittedWhenNotPropagated() throws IOException { void spanTraceStateIncludedWhenPropagated() throws IOException { PropagationTags propagationTags = PropagationTags.factory().empty(); propagationTags.updateW3CTracestate("vendor=state"); - ExtractedContext parent = - new ExtractedContext( - DDTraceId.ONE, - 0L, - PrioritySampling.UNSET, - null, - propagationTags, - TracePropagationStyle.DATADOG); + ExtractedContext parent = new ExtractedContext( + DDTraceId.ONE, + 0L, + PrioritySampling.UNSET, + null, + propagationTags, + TracePropagationStyle.DATADOG); AgentSpan agentSpan = TRACER.startSpan("test", "op.tracestate", parent); agentSpan.setResourceName("op.tracestate"); @@ -201,11 +201,10 @@ void multipleSpansInATraceAreAllWritten() throws IOException { List> parsedSpans = allSpans(payload); assertEquals(2, parsedSpans.size()); - Map parsedChild = - parsedSpans.stream() - .filter(s -> "child.op".equals(s.get("name"))) - .findFirst() - .orElseThrow(() -> new AssertionError("child span not found")); + Map parsedChild = parsedSpans.stream() + .filter(s -> "child.op".equals(s.get("name"))) + .findFirst() + .orElseThrow(() -> new AssertionError("child span not found")); assertEquals(hexSpanId(((DDSpan) parent).getSpanId()), parsedChild.get("parentSpanId")); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceProtoTest.java b/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceProtoTest.java index aa9d7c7022b..3cef7547d70 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceProtoTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/otlp/trace/OtlpTraceProtoTest.java @@ -78,7 +78,8 @@ */ class OtlpTraceProtoTest { - static final CoreTracer TRACER = CoreTracer.builder().writer(new LoggingWriter()).build(); + static final CoreTracer TRACER = + CoreTracer.builder().writer(new LoggingWriter()).build(); // ── spec classes (test-data descriptors) ────────────────────────────────── @@ -376,18 +377,17 @@ static Stream cases() { asList(taggedSpan("tagged.op", tags("net.bytes_sent", 1024.5)))), Arguments.of( "span with multiple mixed tag types", - asList( - taggedSpan( - "multi.tagged", - tags( - "http.method", - "POST", - "http.status_code", - 201L, - "http.ssl", - Boolean.FALSE, - "latency.ms", - 3.14)))), + asList(taggedSpan( + "multi.tagged", + tags( + "http.method", + "POST", + "http.status_code", + 201L, + "http.ssl", + Boolean.FALSE, + "latency.ms", + 3.14)))), // ── parent–child relationship ───────────────────────────────────────── Arguments.of( @@ -536,12 +536,10 @@ void testCollectMultipleTraces() throws IOException { List trace1 = buildSpans(asList(span("trace1.root", "op.root", "web"), childSpan("trace1.child", 0))); List trace2 = buildSpans(asList(span("trace2.root", "op.root", "db"))); - List trace3 = - buildSpans( - asList( - span("trace3.a", "op.a", "web"), - span("trace3.b", "op.b", "web"), - span("trace3.c", "op.c", "web"))); + List trace3 = buildSpans(asList( + span("trace3.a", "op.a", "web"), + span("trace3.b", "op.b", "web"), + span("trace3.c", "op.c", "web"))); // Sanity: all three traces must have distinct trace IDs. DDTraceId traceId1 = trace1.get(0).getTraceId(); @@ -659,12 +657,10 @@ void poisonedSpanResetsCollectorForNextTrace() { @Test void testSpanOrderInTracePreserved() throws IOException { // Verifies that spans appear in the payload with the same order as the original trace - List spans = - buildSpans( - asList( - span("first.span", "op.first", "web"), - span("second.span", "op.second", "web"), - span("third.span", "op.third", "web"))); + List spans = buildSpans(asList( + span("first.span", "op.first", "web"), + span("second.span", "op.second", "web"), + span("third.span", "op.third", "web"))); OtlpTraceProtoCollector collector = new OtlpTraceProtoCollector(); collector.addTrace(spans); @@ -723,33 +719,30 @@ private static List buildSpans(List specs) { for (SpanSpec spec : specs) { AgentSpan agentSpan; if (spec.use128BitTraceId) { - ExtractedContext parent128 = - new ExtractedContext( - TRACE_ID_128BIT, - 0L, - PrioritySampling.UNSET, - null, - PropagationTags.factory().empty(), - TracePropagationStyle.DATADOG); + ExtractedContext parent128 = new ExtractedContext( + TRACE_ID_128BIT, + 0L, + PrioritySampling.UNSET, + null, + PropagationTags.factory().empty(), + TracePropagationStyle.DATADOG); agentSpan = TRACER.startSpan("test", spec.operationName, parent128, spec.startMicros); } else if (spec.origin != null) { - ExtractedContext parentWithOrigin = - new ExtractedContext( - DDTraceId.ONE, - 0L, - PrioritySampling.UNSET, - spec.origin, - PropagationTags.factory().empty(), - TracePropagationStyle.DATADOG); + ExtractedContext parentWithOrigin = new ExtractedContext( + DDTraceId.ONE, + 0L, + PrioritySampling.UNSET, + spec.origin, + PropagationTags.factory().empty(), + TracePropagationStyle.DATADOG); agentSpan = TRACER.startSpan("test", spec.operationName, parentWithOrigin, spec.startMicros); } else if (spec.parentIndex >= 0) { - agentSpan = - TRACER.startSpan( - "test", - spec.operationName, - spans.get(spec.parentIndex).spanContext(), - spec.startMicros); + agentSpan = TRACER.startSpan( + "test", + spec.operationName, + spans.get(spec.parentIndex).spanContext(), + spec.startMicros); } else { agentSpan = TRACER.startSpan("test", spec.operationName, spec.startMicros); } @@ -779,21 +772,19 @@ private static List buildSpans(List specs) { agentSpan.setHttpStatusCode(spec.httpStatusCode); } - spec.extraTags.forEach( - (key, value) -> { - if (value instanceof String) agentSpan.setTag(key, (String) value); - else if (value instanceof Long) agentSpan.setTag(key, (long) (Long) value); - else if (value instanceof Boolean) agentSpan.setTag(key, (boolean) (Boolean) value); - else if (value instanceof Double) agentSpan.setTag(key, (double) (Double) value); - }); + spec.extraTags.forEach((key, value) -> { + if (value instanceof String) agentSpan.setTag(key, (String) value); + else if (value instanceof Long) agentSpan.setTag(key, (long) (Long) value); + else if (value instanceof Boolean) agentSpan.setTag(key, (boolean) (Boolean) value); + else if (value instanceof Double) agentSpan.setTag(key, (double) (Double) value); + }); for (LinkSpec link : spec.links) { - agentSpan.addLink( - SpanLink.from( - spans.get(link.targetIndex).spanContext(), - link.traceFlags, - link.traceState, - link.attributes)); + agentSpan.addLink(SpanLink.from( + spans.get(link.targetIndex).spanContext(), + link.traceFlags, + link.traceState, + link.attributes)); } agentSpan.finish(spec.finishMicros); @@ -910,25 +901,24 @@ private static void verifySpan( verifyLink(spanData.readBytes().newCodedInput(), spec.links[linkCount], caseName); linkCount++; break; - case 15: - { - CodedInputStream status = spanData.readBytes().newCodedInput(); - statusFound = true; - while (!status.isAtEnd()) { - int st = status.readTag(); - switch (WireFormat.getTagFieldNumber(st)) { - case 2: - parsedStatusMessage = status.readString(); - break; - case 3: - statusIsError = status.readEnum() == 2; // STATUS_CODE_ERROR = 2 - break; - default: - status.skipField(st); - } + case 15: { + CodedInputStream status = spanData.readBytes().newCodedInput(); + statusFound = true; + while (!status.isAtEnd()) { + int st = status.readTag(); + switch (WireFormat.getTagFieldNumber(st)) { + case 2: + parsedStatusMessage = status.readString(); + break; + case 3: + statusIsError = status.readEnum() == 2; // STATUS_CODE_ERROR = 2 + break; + default: + status.skipField(st); } - break; } + break; + } case 16: parsedFlags = spanData.readFixed32(); break; @@ -1042,8 +1032,7 @@ private static void verifySpan( if (spec.httpStatusCode != 0) { assertTrue( attrKeys.contains("http.status_code"), - "attributes must include 'http.status_code' when set via setHttpStatusCode [" - + caseName + "attributes must include 'http.status_code' when set via setHttpStatusCode [" + caseName + "]"); } if (spec.origin != null) { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpExtractorTest.java index 081d9bb77a7..4eaee0bc5ee 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpExtractorTest.java @@ -50,11 +50,10 @@ static HttpCodec.Extractor buildExtractor( Map baggageMapping = new HashMap<>(); baggageMapping.put(SOME_CUSTOM_BAGGAGE_HEADER, SOME_BAGGAGE); baggageMapping.put(SOME_CUSTOM_BAGGAGE_HEADER_2, SOME_CASE_SENSITIVE_BAGGAGE); - DynamicConfig dynamicConfig = - DynamicConfig.create() - .setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)) - .setBaggageMapping(baggageMapping) - .apply(); + DynamicConfig dynamicConfig = DynamicConfig.create() + .setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)) + .setBaggageMapping(baggageMapping) + .apply(); return factory.apply(Config.get(), dynamicConfig::captureTraceConfig); } } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractOTBaggageTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractOTBaggageTest.java index 8eed302039d..d5aae9a4743 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractOTBaggageTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractOTBaggageTest.java @@ -68,9 +68,8 @@ void stopsAtByteLimit() { @WithConfig(key = TRACE_BAGGAGE_MAX_BYTES, value = "24") @WithConfig(key = TRACE_BAGGAGE_MAX_ITEMS, value = "2") void chargesRepeatedKeyOnce() { - Map baggage = - extractBaggage( - baggageHeaders(baggageItems("key0", "val0", "a", "0123456789", "key0", "val1"))); + Map baggage = extractBaggage( + baggageHeaders(baggageItems("key0", "val0", "a", "0123456789", "key0", "val1"))); Map expected = new HashMap<>(); expected.put("key0", "val1"); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AppSecClientInterpreterClientIpTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AppSecClientInterpreterClientIpTest.java index dc3980ae077..6927d816d69 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AppSecClientInterpreterClientIpTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AppSecClientInterpreterClientIpTest.java @@ -57,46 +57,40 @@ void restoreAppSec() { static Stream styles() { return Stream.of( - arguments( - new Style( - "Datadog", - DatadogHttpCodec::newExtractor, - headers(DatadogHttpCodec.TRACE_ID_KEY, "1", DatadogHttpCodec.SPAN_ID_KEY, "2"), - true)), - arguments( - new Style( - "B3", - B3HttpCodec::newExtractor, - headers(B3HttpCodec.TRACE_ID_KEY, "1", B3HttpCodec.SPAN_ID_KEY, "2"), - true)), - arguments( - new Style( - "W3C", - W3CHttpCodec::newExtractor, - headers( - W3CHttpCodec.TRACE_PARENT_KEY, - "00-00000000000000000000000000000001-0000000000000002-01"), - true)), - arguments( - new Style( - "Haystack", - HaystackHttpCodec::newExtractor, - headers(HaystackHttpCodec.TRACE_ID_KEY, "1", HaystackHttpCodec.SPAN_ID_KEY, "2"), - true)), - arguments( - new Style( - "XRay", - XRayHttpCodec::newExtractor, - headers( - XRayHttpCodec.X_AMZN_TRACE_ID, - "Root=1-00000000-000000000000000000000001;Parent=0000000000000002"), - true)), - arguments( - new Style( - "None", - NoneCodec::newExtractor, - headers(DatadogHttpCodec.TRACE_ID_KEY, "1", DatadogHttpCodec.SPAN_ID_KEY, "2"), - false))); + arguments(new Style( + "Datadog", + DatadogHttpCodec::newExtractor, + headers(DatadogHttpCodec.TRACE_ID_KEY, "1", DatadogHttpCodec.SPAN_ID_KEY, "2"), + true)), + arguments(new Style( + "B3", + B3HttpCodec::newExtractor, + headers(B3HttpCodec.TRACE_ID_KEY, "1", B3HttpCodec.SPAN_ID_KEY, "2"), + true)), + arguments(new Style( + "W3C", + W3CHttpCodec::newExtractor, + headers( + W3CHttpCodec.TRACE_PARENT_KEY, + "00-00000000000000000000000000000001-0000000000000002-01"), + true)), + arguments(new Style( + "Haystack", + HaystackHttpCodec::newExtractor, + headers(HaystackHttpCodec.TRACE_ID_KEY, "1", HaystackHttpCodec.SPAN_ID_KEY, "2"), + true)), + arguments(new Style( + "XRay", + XRayHttpCodec::newExtractor, + headers( + XRayHttpCodec.X_AMZN_TRACE_ID, + "Root=1-00000000-000000000000000000000001;Parent=0000000000000002"), + true)), + arguments(new Style( + "None", + NoneCodec::newExtractor, + headers(DatadogHttpCodec.TRACE_ID_KEY, "1", DatadogHttpCodec.SPAN_ID_KEY, "2"), + false))); } @ParameterizedTest(name = "{0}") @@ -167,10 +161,9 @@ void extractHeadersWithXForwarding(Style style) { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; - TagContext tagOnly = - this.extractor.extract( - headers("X-Forwarded-For", forwardedIp, "X-Forwarded-Port", forwardedPort), - stringValuesMap()); + TagContext tagOnly = this.extractor.extract( + headers("X-Forwarded-For", forwardedIp, "X-Forwarded-Port", forwardedPort), + stringValuesMap()); assertNotNull(tagOnly); assertFalse(tagOnly instanceof ExtractedContext); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java index 50f607d9c87..b230fc6513e 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java @@ -90,8 +90,10 @@ void injectHttpHeadersWithExtractedOriginal(String traceId, String spanId) { Map headers = new HashMap<>(); headers.put(TRACE_ID_KEY.toUpperCase(), traceId); headers.put(SPAN_ID_KEY.toUpperCase(), spanId); - DynamicConfig dynamicConfig = - DynamicConfig.create().setHeaderTags(emptyMap()).setBaggageMapping(emptyMap()).apply(); + DynamicConfig dynamicConfig = DynamicConfig.create() + .setHeaderTags(emptyMap()) + .setBaggageMapping(emptyMap()) + .apply(); HttpCodec.Extractor extractor = B3HttpCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); TagContext context = extractor.extract(headers, stringValuesMap()); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java index 5be84423457..7f743762d2f 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java @@ -99,8 +99,9 @@ void extractHttpHeaders( void extractHttpHeadersWithoutComma() { // Recreate extractor with the new comma config this.extractor.cleanup(); - DynamicConfig dynamicConfig = - DynamicConfig.create().setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)).apply(); + DynamicConfig dynamicConfig = DynamicConfig.create() + .setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)) + .apply(); this.extractor = DatadogHttpCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); String headerWithComma = "my-interesting-info,and-more"; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java index 20a49f0f901..702d012d884 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java @@ -142,12 +142,10 @@ void injectHttpHeadersWith128BitTraceId(String hexId) { this.injector.inject(spanContext, carrier, Map::put); String expectedT0 = String.valueOf(spanContext.getEndToEndStartTime() / 1_000_000L); - String expectDdPTags = - traceId.toHighOrderLong() == 0 - ? "_dd.p.dm=-4,_dd.p.anytag=value" - : "_dd.p.dm=-4,_dd.p.tid=" - + toHexStringPadded(traceId.toHighOrderLong(), 16) - + ",_dd.p.anytag=value"; + String expectDdPTags = traceId.toHighOrderLong() == 0 + ? "_dd.p.dm=-4,_dd.p.anytag=value" + : "_dd.p.dm=-4,_dd.p.tid=" + toHexStringPadded(traceId.toHighOrderLong(), 16) + + ",_dd.p.anytag=value"; assertEquals(traceId.toString(), carrier.get(TRACE_ID_KEY)); assertEquals("2", carrier.get(SPAN_ID_KEY)); assertEquals(expectedT0, carrier.get(OT_BAGGAGE_PREFIX + "t0")); @@ -175,10 +173,9 @@ private DDSpanContext mockSpanContext( String origin, Map baggage, String ddPTags) { - PropagationTags propagationTags = - ddPTags == null - ? PropagationTags.factory().empty() - : PropagationTags.factory().fromHeaderValue(DATADOG, ddPTags); + PropagationTags propagationTags = ddPTags == null + ? PropagationTags.factory().empty() + : PropagationTags.factory().fromHeaderValue(DATADOG, ddPTags); return mockSpanContext( traceId, DDSpanId.from(spanId), samplingPriority, origin, baggage, propagationTags); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java index 6bf02211256..65cf965b841 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java @@ -82,14 +82,13 @@ void extractUsesFirstConcatenatedHaystackIdHeaderValue() { String traceUuid = "44617461-646f-6721-0000-000000000001"; String spanUuid = "44617461-646f-6721-0000-000000000002"; String parentUuid = "44617461-646f-6721-0000-000000000005"; - Map headers = - headers( - TRACE_ID_KEY, - traceUuid + ",44617461-646f-6721-0000-000000000003", - SPAN_ID_KEY, - spanUuid + ",44617461-646f-6721-0000-000000000004", - PARENT_ID_KEY, - parentUuid + ",44617461-646f-6721-0000-000000000006"); + Map headers = headers( + TRACE_ID_KEY, + traceUuid + ",44617461-646f-6721-0000-000000000003", + SPAN_ID_KEY, + spanUuid + ",44617461-646f-6721-0000-000000000004", + PARENT_ID_KEY, + parentUuid + ",44617461-646f-6721-0000-000000000006"); ExtractedContext context = (ExtractedContext) this.extractor.extract(headers, stringValuesMap()); @@ -105,14 +104,13 @@ void extractUsesFirstConcatenatedHaystackIdHeaderValue() { void extractRetainsParentIdAsBaggage() { // Parent-ID is not read back when injecting, so it is kept as ordinary caller baggage and // still propagated downstream as Baggage-Haystack-Parent-ID - Map headers = - headers( - TRACE_ID_KEY, - "44617461-646f-6721-0000-000000000001", - SPAN_ID_KEY, - "44617461-646f-6721-0000-000000000002", - PARENT_ID_KEY, - "44617461-646f-6721-0000-000000000003"); + Map headers = headers( + TRACE_ID_KEY, + "44617461-646f-6721-0000-000000000001", + SPAN_ID_KEY, + "44617461-646f-6721-0000-000000000002", + PARENT_ID_KEY, + "44617461-646f-6721-0000-000000000003"); TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -124,14 +122,13 @@ void extractRetainsParentIdAsBaggage() { @Test void extractDropsOversizedParentId() { // unlike the reserved trace and span ids, Parent-ID is subject to the baggage limits - Map headers = - headers( - TRACE_ID_KEY, - "44617461-646f-6721-0000-000000000001", - SPAN_ID_KEY, - "44617461-646f-6721-0000-000000000002", - PARENT_ID_KEY, - repeat('x', 10_000)); + Map headers = headers( + TRACE_ID_KEY, + "44617461-646f-6721-0000-000000000001", + SPAN_ID_KEY, + "44617461-646f-6721-0000-000000000002", + PARENT_ID_KEY, + repeat('x', 10_000)); TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -141,12 +138,11 @@ void extractDropsOversizedParentId() { @Test void extractDoesNotReserveOversizedTraceId() { // reserved values skip the baggage budget, so they are capped to keep the overshoot fixed - Map headers = - headers( - TRACE_ID_KEY, - repeat('a', 10_000) + "-646f-6721-0000-000000000001", - SPAN_ID_KEY, - "44617461-646f-6721-0000-000000000002"); + Map headers = headers( + TRACE_ID_KEY, + repeat('a', 10_000) + "-646f-6721-0000-000000000001", + SPAN_ID_KEY, + "44617461-646f-6721-0000-000000000002"); TagContext context = this.extractor.extract(headers, stringValuesMap()); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java index a950013ab7a..932975c9d0c 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java @@ -108,7 +108,8 @@ void extractHttpHeadersUsingStyles( if (expectedTraceId == null) { assertNull(context); } else { - assertEquals(DDTraceId.from(expectedTraceId).toLong(), context.getTraceId().toLong()); + assertEquals( + DDTraceId.from(expectedTraceId).toLong(), context.getTraceId().toLong()); assertEquals(DDSpanId.from(expectedSpanId), context.getSpanId()); } } @@ -224,8 +225,10 @@ private static HttpCodec.Extractor createExtractor( Config config = mock(Config.class); when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); when(config.isTracePropagationExtractFirst()).thenReturn(extractFirst); - DynamicConfig dynamicConfig = - DynamicConfig.create().setHeaderTags(headerTags).setBaggageMapping(emptyMap()).apply(); + DynamicConfig dynamicConfig = DynamicConfig.create() + .setHeaderTags(headerTags) + .setBaggageMapping(emptyMap()) + .apply(); return HttpCodec.createExtractor(config, dynamicConfig::captureTraceConfig); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java index 2fc5e1628dd..75621e6326f 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java @@ -97,10 +97,9 @@ void injectHttpHeadersUsingStyles( } } if (styles.contains(TracePropagationStyle.B3SINGLE)) { - String expectedB3Value = - samplingPriority != UNSET - ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" - : b3TraceIdHex + "-" + b3SpanIdHex; + String expectedB3Value = samplingPriority != UNSET + ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" + : b3TraceIdHex + "-" + b3SpanIdHex; assertEquals(expectedB3Value, carrier.get(B3_KEY)); expectedSize++; } @@ -168,10 +167,9 @@ void injectHttpHeadersUsingStyle( expectedSize++; } } else if (style == TracePropagationStyle.B3SINGLE) { - String expectedB3Value = - samplingPriority != UNSET - ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" - : b3TraceIdHex + "-" + b3SpanIdHex; + String expectedB3Value = samplingPriority != UNSET + ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" + : b3TraceIdHex + "-" + b3SpanIdHex; assertEquals(expectedB3Value, carrier.get(B3_KEY)); expectedSize++; } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java index 217e6d17ffc..f036d4a8cdc 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java @@ -85,11 +85,10 @@ void extractHttpHeadersWithoutComma() { Map baggageMap = new HashMap<>(); baggageMap.put(SOME_CUSTOM_BAGGAGE_HEADER, SOME_BAGGAGE); baggageMap.put(SOME_CUSTOM_BAGGAGE_HEADER_2, SOME_CASE_SENSITIVE_BAGGAGE); - DynamicConfig dynamicConfig = - DynamicConfig.create() - .setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)) - .setBaggageMapping(baggageMap) - .apply(); + DynamicConfig dynamicConfig = DynamicConfig.create() + .setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)) + .setBaggageMapping(baggageMap) + .apply(); this.extractor = NoneCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); // spotless:off diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/OrgGuardEndToEndTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/OrgGuardEndToEndTest.java index 3557ad10e68..d7c8e33ce89 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/OrgGuardEndToEndTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/OrgGuardEndToEndTest.java @@ -162,9 +162,8 @@ private TracingPropagator buildPropagator( when(config.getTraceOrgGuardTrustedOpms()).thenReturn(trusted); HttpCodec.Extractor extractor = HttpCodec.createExtractor(config, traceConfigSupplier); - HttpCodec.Injector injector = - HttpCodec.createInjector( - config, config.getTracePropagationStylesToInject(), Collections.emptyMap()); + HttpCodec.Injector injector = HttpCodec.createInjector( + config, config.getTracePropagationStylesToInject(), Collections.emptyMap()); OrgGuard orgGuard = OrgGuard.create(config, localOpmSupplier, factory, healthMetrics); return new TracingPropagator( true, orgGuard.decorateInjector(injector), orgGuard.decorateExtractor(extractor)); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java index 9903867e1c4..8693f23d507 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java @@ -48,14 +48,13 @@ void injectHttpHeaders( baggage.put("k1", "v1"); baggage.put("k2", "v2"); baggage.put("some-baggage-key", "some-value"); - DDSpanContext spanContext = - mockSpanContext( - DDTraceId.from(traceId), - DDSpanId.from(spanId), - samplingPriority, - origin, - baggage, - PropagationTags.factory().fromHeaderValue(DATADOG, "_dd.p.usr=123")); + DDSpanContext spanContext = mockSpanContext( + DDTraceId.from(traceId), + DDSpanId.from(spanId), + samplingPriority, + origin, + baggage, + PropagationTags.factory().fromHeaderValue(DATADOG, "_dd.p.usr=123")); Map carrier = new HashMap<>(); this.injector.inject(spanContext, carrier, Map::put); @@ -74,14 +73,13 @@ void injectHttpHeadersWithEndToEnd() { Map baggage = new HashMap<>(); baggage.put("k1", "v1"); baggage.put("k2", "v2"); - DDSpanContext mockedContext = - mockSpanContext( - DDTraceId.from("1"), - DDSpanId.from("2"), - UNSET, - "fakeOrigin", - baggage, - PropagationTags.factory().fromHeaderValue(DATADOG, "_dd.p.dm=-4,_dd.p.anytag=value")); + DDSpanContext mockedContext = mockSpanContext( + DDTraceId.from("1"), + DDSpanId.from("2"), + UNSET, + "fakeOrigin", + baggage, + PropagationTags.factory().fromHeaderValue(DATADOG, "_dd.p.dm=-4,_dd.p.anytag=value")); mockedContext.beginEndToEnd(); Map carrier = new HashMap<>(); @@ -102,14 +100,13 @@ void injectTheDecisionMakerTag() { Map baggage = new HashMap<>(); baggage.put("k1", "v1"); baggage.put("k2", "v2"); - DDSpanContext mockedContext = - mockSpanContext( - DDTraceId.from("1"), - DDSpanId.from("2"), - UNSET, - "fakeOrigin", - baggage, - PropagationTags.factory().empty()); + DDSpanContext mockedContext = mockSpanContext( + DDTraceId.from("1"), + DDSpanId.from("2"), + UNSET, + "fakeOrigin", + baggage, + PropagationTags.factory().empty()); mockedContext.setSamplingPriority(USER_KEEP, MANUAL); Map carrier = new HashMap<>(); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java index a8dc7628165..f6e8ac7892f 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java @@ -54,12 +54,11 @@ protected Map baggageHeaders(List> items) void extractTraceHeaderKeepsParsingContextAfterBaggageLimit() { // reaching the baggage limit must not stop the header being parsed: the trace context segments // can appear after the `key=value` segments that exhausted the limit - TagContext context = - this.extractor.extract( - headers( - X_AMZN_TRACE_ID, - traceHeader(generateBaggageItems(50)) + ";Parent=" + zeroPadId("2") + ";Sampled=1"), - stringValuesMap()); + TagContext context = this.extractor.extract( + headers( + X_AMZN_TRACE_ID, + traceHeader(generateBaggageItems(50)) + ";Parent=" + zeroPadId("2") + ";Sampled=1"), + stringValuesMap()); assertEquals(3, context.getBaggage().size()); assertEquals(zeroPadId("1"), context.getTraceId().toHexStringPadded(16)); @@ -145,9 +144,8 @@ void noContextWithInvalidNonNumericId() { @Test void noContextWithTooLargeTraceId() { - Map headers = - headers( - X_AMZN_TRACE_ID, "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8"); + Map headers = headers( + X_AMZN_TRACE_ID, "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8"); TagContext context = extractor.extract(headers, stringValuesMap()); @@ -156,9 +154,8 @@ void noContextWithTooLargeTraceId() { @Test void extractHttpHeadersWithNonZeroEpoch() { - Map headers = - headers( - X_AMZN_TRACE_ID, "Root=1-5759e988-00000000e1be46a994272793;Parent=53995c3f42cd8ad8"); + Map headers = headers( + X_AMZN_TRACE_ID, "Root=1-5759e988-00000000e1be46a994272793;Parent=53995c3f42cd8ad8"); TagContext context = extractor.extract(headers, stringValuesMap()); @@ -177,10 +174,9 @@ void extractHttpHeadersWithNonZeroEpoch() { }) void extractIdsWhileRetainingTheOriginalString( String traceId, String spanId, String expectedTraceIdHex, long expectedSpanId) { - Map headers = - headers( - X_AMZN_TRACE_ID, - "Root=1-00000000-00000000" + zeroPadId(traceId) + ";Parent=" + zeroPadId(spanId)); + Map headers = headers( + X_AMZN_TRACE_ID, + "Root=1-00000000-00000000" + zeroPadId(traceId) + ";Parent=" + zeroPadId(spanId)); ExtractedContext context = (ExtractedContext) extractor.extract(headers, stringValuesMap()); @@ -196,16 +192,15 @@ void extractIdsWhileRetainingTheOriginalString( "non-zero | 2 | 3 | 1610001234 " }) void extractHeadersWithEndToEnd(String traceId, String spanId, long endToEndStartTime) { - Map headers = - headers( - X_AMZN_TRACE_ID, - "Root=1-00000000-00000000" - + zeroPadId(traceId) - + ";Parent=" - + zeroPadId(spanId) - + ";k1=v1;t0=" - + endToEndStartTime - + ";k2=v2"); + Map headers = headers( + X_AMZN_TRACE_ID, + "Root=1-00000000-00000000" + + zeroPadId(traceId) + + ";Parent=" + + zeroPadId(spanId) + + ";k1=v1;t0=" + + endToEndStartTime + + ";k2=v2"); ExtractedContext context = (ExtractedContext) this.extractor.extract(headers, stringValuesMap()); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java index 2c88f9e10fe..ff585321814 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java @@ -90,8 +90,10 @@ void injectHttpHeadersWithExtractedOriginal( X_AMZN_TRACE_ID, "Root=1-00000000-00000000" + zeroPadId(traceId) + ";Parent=" + zeroPadId(spanId) ); // spotless:on - DynamicConfig dynamicConfig = - DynamicConfig.create().setHeaderTags(emptyMap()).setBaggageMapping(emptyMap()).apply(); + DynamicConfig dynamicConfig = DynamicConfig.create() + .setHeaderTags(emptyMap()) + .setBaggageMapping(emptyMap()) + .apply(); HttpCodec.Extractor extractor = XRayHttpCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); TagContext context = extractor.extract(headers, stringValuesMap()); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/opg/OrgGuardEnforcerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/opg/OrgGuardEnforcerTest.java index 65d7ee271d4..57b60b98124 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/opg/OrgGuardEnforcerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/opg/OrgGuardEnforcerTest.java @@ -139,9 +139,8 @@ void stripPreservesNonDdVendors() { OrgGuardEnforcer enforcer = enforcer(false, emptySet(), () -> "L"); PropagationTags tags = factory.fromHeaderValue(W3C, "dd=s:1;o:foo;t.opm:upstream-X,vendor1=abc,vendor2=def"); - ExtractedContext ctx = - new ExtractedContext( - DDTraceId.from(123L), 456L, 2, "origin", tags, TracePropagationStyle.TRACECONTEXT); + ExtractedContext ctx = new ExtractedContext( + DDTraceId.from(123L), 456L, 2, "origin", tags, TracePropagationStyle.TRACECONTEXT); TagContext result = enforcer.enforce(ctx); assertNotSame(ctx, result); ExtractedContext stripped = (ExtractedContext) result; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/scopemanager/ScopeManagerForkedTest.java b/dd-trace-core/src/test/java/datadog/trace/core/scopemanager/ScopeManagerForkedTest.java index 440259d85b6..dba2593717b 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/scopemanager/ScopeManagerForkedTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/scopemanager/ScopeManagerForkedTest.java @@ -96,7 +96,10 @@ void setup() { when(profilingContext.newScopeState(any())).thenReturn(state); when(profilingContext.name()).thenReturn("mock"); writer = new ListWriter(); - tracer = tracerBuilder().writer(writer).profilingContextIntegration(profilingContext).build(); + tracer = tracerBuilder() + .writer(writer) + .profilingContextIntegration(profilingContext) + .build(); AgentTracer.forceRegister(tracer); scopeManager = ScopeManagerTestBridge.getScopeManager(tracer); eventCountingListener = new EventCountingListener(); @@ -362,7 +365,8 @@ void continuationAllowsAddingSpansEvenAfterOtherSpansWereCompleted() throws Exce // the child has the correct parent assertNull(scopeManager.active()); assertTrue(spanFinished(childSpan)); - assertEquals(span.spanContext().getSpanId(), ((DDSpan) childSpan).spanContext().getParentId()); + assertEquals( + span.spanContext().getSpanId(), ((DDSpan) childSpan).spanContext().getParentId()); assertEquals(1, writer.size()); assertTrue(writer.get(0).containsAll(Arrays.asList(childSpan, span))); } @@ -715,21 +719,18 @@ void continuationCanBeActivatedAndClosedInMultipleThreads() throws Throwable { continuation.get().hold(); AtomicInteger iteration = new AtomicInteger(0); - ThreadUtils.runConcurrently( - 8, - 512, - () -> { - int iter = iteration.incrementAndGet(); - if ((iter & 1) != 0) { - Thread.sleep(1); - } - ContextScope s = continuation.get().resume(); - assertSame(s, scopeManager.active()); - if ((iter & 2) != 0) { - Thread.sleep(1); - } - s.close(); - }); + ThreadUtils.runConcurrently(8, 512, () -> { + int iter = iteration.incrementAndGet(); + if ((iter & 1) != 0) { + Thread.sleep(1); + } + ContextScope s = continuation.get().resume(); + assertSame(s, scopeManager.active()); + if ((iter & 2) != 0) { + Thread.sleep(1); + } + s.close(); + }); long duration = System.nanoTime() - start; @@ -863,20 +864,18 @@ void contextThreadListenerNotifiedWhenScopeActivatedOnThreadForTheFirstTime() th Future[] futures = new Future[numTasks]; for (int i = 0; i < numTasks; i++) { final int taskIndex = i; - futures[i] = - executor.submit( - () -> { - AgentScope scope = tracer.activateSpan(span); - AgentSpan child = tracer.buildSpan("test", "foo" + taskIndex).start(); - AgentScope childScope = tracer.activateSpan(child); - try { - Thread.sleep(100); - } catch (InterruptedException ignored) { - Thread.currentThread().interrupt(); - } - childScope.close(); - scope.close(); - }); + futures[i] = executor.submit(() -> { + AgentScope scope = tracer.activateSpan(span); + AgentSpan child = tracer.buildSpan("test", "foo" + taskIndex).start(); + AgentScope childScope = tracer.activateSpan(child); + try { + Thread.sleep(100); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + childScope.close(); + scope.close(); + }); } for (Future future : futures) { future.get(); @@ -1141,13 +1140,12 @@ void continuationReleaseIsSameAsCancel() throws Exception { void captureContextWithoutSpanUsesNoopTraceCollector() { ContextKey key = ContextKey.named("test-key"); Context ctx = Context.root().with(key, "value"); - assertDoesNotThrow( - () -> { - // NoopAgentTraceCollector handles capture/release without throwing - try (ContextScope scope = ctx.attach()) { - Context.current().capture().release(); - } - }); + assertDoesNotThrow(() -> { + // NoopAgentTraceCollector handles capture/release without throwing + try (ContextScope scope = ctx.attach()) { + Context.current().capture().release(); + } + }); } private boolean spanFinished(AgentSpan span) { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.java b/dd-trace-core/src/test/java/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.java index 68779317248..8419a9d9935 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.java @@ -25,17 +25,16 @@ void encodePayloadWithAllOptionalFields() throws IOException { String containerID = "containerID"; boolean appLogsCollectionEnabled = true; - byte[] out = - ServiceDiscovery.encodePayload( - tracerVersion, - hostname, - appLogsCollectionEnabled, - runtimeID, - service, - env, - serviceVersion, - processTags, - containerID); + byte[] out = ServiceDiscovery.encodePayload( + tracerVersion, + hostname, + appLogsCollectionEnabled, + runtimeID, + service, + env, + serviceVersion, + processTags, + containerID); MapValue map = MessagePack.newDefaultUnpacker(out).unpackValue().asMapValue(); assertEquals(11, map.size()); @@ -49,9 +48,8 @@ void encodePayloadOnlyRequiredFields() throws IOException { String tracerVersion = "1.2.3"; String hostname = "my_host"; - byte[] out = - ServiceDiscovery.encodePayload( - tracerVersion, hostname, false, null, null, null, null, null, null); + byte[] out = ServiceDiscovery.encodePayload( + tracerVersion, hostname, false, null, null, null, null, null, null); MapValue map = MessagePack.newDefaultUnpacker(out).unpackValue().asMapValue(); assertEquals(5, map.size()); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java index ae85244a729..4e3294b1b54 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/taginterceptor/TagInterceptorTest.java @@ -79,13 +79,12 @@ class TagInterceptorTest extends DDCoreJavaSpecification { @WithConfig(key = "dd.trace.PeerServiceTagInterceptor.enabled", value = "true", addPrefix = false) void setServiceName(@ConvertWith(TagsConverter.class) String tag, String name, String expected) { Map mapping = singletonMap("some-service", "new-service"); - CoreTracer tracer = - tracerBuilder() - .serviceName("wrong-service") - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .serviceNameMappings(mapping) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName("wrong-service") + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .serviceNameMappings(mapping) + .build(); AgentSpan span = tracer.buildSpan("datadog", "some span").withTag(tag, name).start(); span.finish(); @@ -97,13 +96,12 @@ void setServiceName(@ConvertWith(TagsConverter.class) String tag, String name, S @MethodSource("defaultOrConfiguredServiceNameCanBeRemappedWithoutSettingTagArguments") void defaultOrConfiguredServiceNameCanBeRemappedWithoutSettingTag( String serviceName, String expected, Map mapping) { - CoreTracer tracer = - tracerBuilder() - .serviceName(serviceName) - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .serviceNameMappings(mapping) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName(serviceName) + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .serviceNameMappings(mapping) + .build(); AgentSpan span = tracer.buildSpan("datadog", "some span").start(); span.finish(); @@ -175,13 +173,12 @@ void settingServiceNameAsPropertyDisablesServletContext( @ValueSource(strings = {DEFAULT_SERVICE_NAME, "my-service"}) void mappingCausesServletContextToNotChangeServiceName(String serviceName) { Map mapping = singletonMap(serviceName, "new-service"); - CoreTracer tracer = - tracerBuilder() - .serviceName(serviceName) - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .serviceNameMappings(mapping) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName(serviceName) + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .serviceNameMappings(mapping) + .build(); AgentSpan span = tracer.buildSpan("datadog", "some span").start(); span.setTag("servlet.context", "/some-context"); @@ -196,9 +193,8 @@ private CoreTracer createSplittingTracer(String tag) { .writer(new LoggingWriter()) .sampler(new AllSampler()) // equivalent to split-by-tags: tag - .tagInterceptor( - new TagInterceptor( - true, "my-service", Collections.singleton(tag), new RuleFlags(), false)) + .tagInterceptor(new TagInterceptor( + true, "my-service", Collections.singleton(tag), new RuleFlags(), false)) .build(); } @@ -209,14 +205,13 @@ private CoreTracer createSplittingTracer(String tag) { }) void splitByTagsForServletContextAndExperimentalJeeSplitByDeployment( String expected, boolean jeeActive) { - CoreTracer tracer = - tracerBuilder() - .serviceName("my-service") - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .tagInterceptor( - new TagInterceptor(false, "my-service", emptySet(), new RuleFlags(), jeeActive)) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName("my-service") + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .tagInterceptor( + new TagInterceptor(false, "my-service", emptySet(), new RuleFlags(), jeeActive)) + .build(); AgentSpan span = tracer.buildSpan("datadog", "some span").start(); span.setTag(InstrumentationTags.SERVLET_CONTEXT, "some-context"); @@ -229,12 +224,11 @@ void splitByTagsForServletContextAndExperimentalJeeSplitByDeployment( void peerServiceThenSplitByTagsViaBuilder() { CoreTracer tracer = createSplittingTracer(Tags.MESSAGE_BUS_DESTINATION); - AgentSpan span = - tracer - .buildSpan("datadog", "some span") - .withTag(Tags.PEER_SERVICE, "peer-service") - .withTag(Tags.MESSAGE_BUS_DESTINATION, "some-queue") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "some span") + .withTag(Tags.PEER_SERVICE, "peer-service") + .withTag(Tags.MESSAGE_BUS_DESTINATION, "some-queue") + .start(); span.finish(); assertEquals("some-queue", span.getServiceName()); @@ -258,12 +252,11 @@ void splitByTagsThenPeerServiceViaBuilder(boolean enabled) { injectSysConfig("dd.trace.PeerServiceTagInterceptor.enabled", String.valueOf(enabled), false); CoreTracer tracer = createSplittingTracer(Tags.MESSAGE_BUS_DESTINATION); - AgentSpan span = - tracer - .buildSpan("datadog", "some span") - .withTag(Tags.MESSAGE_BUS_DESTINATION, "some-queue") - .withTag(Tags.PEER_SERVICE, "peer-service") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "some span") + .withTag(Tags.MESSAGE_BUS_DESTINATION, "some-queue") + .withTag(Tags.PEER_SERVICE, "peer-service") + .start(); span.finish(); assertEquals(enabled, "peer-service".equals(span.getServiceName())); @@ -301,7 +294,8 @@ void setResourceNameIgnoresNull() throws Exception { ListWriter writer = new ListWriter(); CoreTracer tracer = tracerBuilder().writer(writer).build(); - AgentSpan span = tracer.buildSpan("datadog", "test").withResourceName("keep").start(); + AgentSpan span = + tracer.buildSpan("datadog", "test").withResourceName("keep").start(); span.setTag(DDTags.RESOURCE_NAME, (String) null); span.finish(); writer.waitForTraces(1); @@ -404,26 +398,14 @@ static Stream setPrioritySamplingViaTagArguments() { "sampling.priority / 1", Tags.SAMPLING_PRIORITY, 1, (int) PrioritySampling.USER_KEEP), arguments( "sampling.priority / 2", Tags.SAMPLING_PRIORITY, 2, (int) PrioritySampling.USER_KEEP), - arguments( - "sampling.priority / '-1'", - Tags.SAMPLING_PRIORITY, - "-1", - (int) PrioritySampling.USER_DROP), - arguments( - "sampling.priority / '0'", - Tags.SAMPLING_PRIORITY, - "0", - (int) PrioritySampling.USER_DROP), - arguments( - "sampling.priority / '1'", - Tags.SAMPLING_PRIORITY, - "1", - (int) PrioritySampling.USER_KEEP), - arguments( - "sampling.priority / '2'", - Tags.SAMPLING_PRIORITY, - "2", - (int) PrioritySampling.USER_KEEP), + arguments("sampling.priority / '-1'", Tags.SAMPLING_PRIORITY, "-1", (int) + PrioritySampling.USER_DROP), + arguments("sampling.priority / '0'", Tags.SAMPLING_PRIORITY, "0", (int) + PrioritySampling.USER_DROP), + arguments("sampling.priority / '1'", Tags.SAMPLING_PRIORITY, "1", (int) + PrioritySampling.USER_KEEP), + arguments("sampling.priority / '2'", Tags.SAMPLING_PRIORITY, "2", (int) + PrioritySampling.USER_KEEP), arguments("sampling.priority / 'asdf'", Tags.SAMPLING_PRIORITY, "asdf", null)); } @@ -469,13 +451,12 @@ void samplingPriorityNonPositiveTagDoesNotOverrideLockedPriority() { void samplingPriorityPositiveTagOverridesDecisionMakerFromUpstreamPropagation() { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); // Upstream service dropped with LOCAL_USER_RULE and propagated _dd.p.dm=-3 - PropagationTags propagationTags = - PropagationTags.factory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.dm=-3"); - AgentSpanContext extracted = - new ExtractedContext( - DDTraceId.from(123), 456L, PrioritySampling.USER_DROP, null, propagationTags, DATADOG); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "test").asChildOf(extracted).start(); + PropagationTags propagationTags = PropagationTags.factory() + .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.dm=-3"); + AgentSpanContext extracted = new ExtractedContext( + DDTraceId.from(123), 456L, PrioritySampling.USER_DROP, null, propagationTags, DATADOG); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "test").asChildOf(extracted).start(); // positive sampling.priority overrides locked priority and sets _dd.p.dm to MANUAL span.setTag(Tags.SAMPLING_PRIORITY, 2); @@ -502,20 +483,13 @@ void setErrorFlagWhenErrorTagReported(boolean error) throws Exception { static Stream interceptorsApplyToBuilderTooArguments() { return Stream.of( arguments( - "serviceName", - DDTags.SERVICE_NAME, - "my-service", - (Function) DDSpanContext::getServiceName), - arguments( - "resourceName", - DDTags.RESOURCE_NAME, - "my-resource", - (Function) ctx -> ctx.getResourceName().toString()), + "serviceName", DDTags.SERVICE_NAME, "my-service", (Function) + DDSpanContext::getServiceName), arguments( - "spanType", - DDTags.SPAN_TYPE, - "my-span-type", - (Function) DDSpanContext::getSpanType)); + "resourceName", DDTags.RESOURCE_NAME, "my-resource", (Function) + ctx -> ctx.getResourceName().toString()), + arguments("spanType", DDTags.SPAN_TYPE, "my-span-type", (Function) + DDSpanContext::getSpanType)); } @ParameterizedTest(name = "{0}") @@ -526,7 +500,8 @@ void interceptorsApplyToBuilderToo( ListWriter writer = new ListWriter(); CoreTracer tracer = tracerBuilder().writer(writer).build(); - AgentSpan span = tracer.buildSpan("datadog", "interceptor.test").withTag(name, value).start(); + AgentSpan span = + tracer.buildSpan("datadog", "interceptor.test").withTag(name, value).start(); span.finish(); writer.waitForTraces(1); @@ -538,29 +513,30 @@ void decoratorsApplyToBuilderToo() throws Exception { ListWriter writer = new ListWriter(); CoreTracer tracer = tracerBuilder().writer(writer).build(); - AgentSpan span = - tracer.buildSpan("datadog", "decorator.test").withTag("sn.tag1", "some val").start(); + AgentSpan span = tracer + .buildSpan("datadog", "decorator.test") + .withTag("sn.tag1", "some val") + .start(); span.finish(); writer.waitForTraces(1); assertEquals("some val", span.getServiceName()); - span = - tracer - .buildSpan("datadog", "decorator.test") - .withTag("servlet.context", "/my-servlet") - .start(); + span = tracer + .buildSpan("datadog", "decorator.test") + .withTag("servlet.context", "/my-servlet") + .start(); assertEquals("my-servlet", span.getServiceName()); - span = tracer.buildSpan("datadog", "decorator.test").withTag("error", "true").start(); + span = + tracer.buildSpan("datadog", "decorator.test").withTag("error", "true").start(); span.finish(); writer.waitForTraces(2); assertTrue(span.isError()); - span = - tracer - .buildSpan("datadog", "decorator.test") - .withTag(Tags.DB_STATEMENT, "some-statement") - .start(); + span = tracer + .buildSpan("datadog", "decorator.test") + .withTag(Tags.DB_STATEMENT, "some-statement") + .start(); span.finish(); writer.waitForTraces(3); assertEquals("some-statement", span.getResourceName().toString()); @@ -576,18 +552,16 @@ void decoratorsApplyToBuilderToo() throws Exception { void disableDecoratorViaConfig(String decorator, boolean enabled) { injectSysConfig("dd.trace." + decorator + ".enabled", String.valueOf(enabled), false); - CoreTracer tracer = - tracerBuilder() - .serviceName("some-service") - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName("some-service") + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .build(); - AgentSpan span = - tracer - .buildSpan("datadog", "some span") - .withTag(DDTags.SERVICE_NAME, "other-service") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "some span") + .withTag(DDTags.SERVICE_NAME, "other-service") + .start(); span.finish(); assertEquals(enabled ? "other-service" : "some-service", span.getServiceName()); @@ -603,12 +577,11 @@ void disablingServiceDecoratorDoesNotDisableSplitByTags( @ConvertWith(TagsConverter.class) String tag, String name, String expected) { injectSysConfig("dd.trace.ServiceNameTagInterceptor.enabled", "false", false); - CoreTracer tracer = - tracerBuilder() - .serviceName("some-service") - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName("some-service") + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .build(); AgentSpan span = tracer.buildSpan("datadog", "some span").withTag(tag, name).start(); span.finish(); @@ -618,18 +591,21 @@ void disablingServiceDecoratorDoesNotDisableSplitByTags( @Test void changeTopLevelStatusWhenChangingServiceName() { - CoreTracer tracer = - tracerBuilder() - .serviceName("some-service") - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName("some-service") + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .build(); - AgentSpan parent = tracer.buildSpan("datadog", "parent").withServiceName("parent").start(); + AgentSpan parent = + tracer.buildSpan("datadog", "parent").withServiceName("parent").start(); // the service name doesn't match the parent - AgentSpan child = - tracer.buildSpan("datadog", "child").withServiceName("child").asChildOf(parent).start(); + AgentSpan child = tracer + .buildSpan("datadog", "child") + .withServiceName("child") + .asChildOf(parent) + .start(); assertTrue(((CoreSpan) child).isTopLevel()); // the service name is changed to match the parent @@ -657,12 +633,11 @@ static Stream treat1ValueAsTrueForBooleanTagValuesArguments() { @MethodSource("treat1ValueAsTrueForBooleanTagValuesArguments") void treat1ValueAsTrueForBooleanTagValues( String scenario, String tag, Object value, Integer samplingPriority) { - CoreTracer tracer = - tracerBuilder() - .serviceName("some-service") - .writer(new LoggingWriter()) - .sampler(new AllSampler()) - .build(); + CoreTracer tracer = tracerBuilder() + .serviceName("some-service") + .writer(new LoggingWriter()) + .sampler(new AllSampler()) + .build(); AgentSpan span = tracer.buildSpan("datadog", "test").start(); assertNull(span.getSamplingPriority()); @@ -728,9 +703,8 @@ void whenInterceptServiceNameExtraServiceProviderIsCalled() { try { RuleFlags ruleFlags = mock(RuleFlags.class); when(ruleFlags.isEnabled(any())).thenReturn(true); - TagInterceptor interceptor = - new TagInterceptor( - true, "my-service", Collections.singleton(DDTags.SERVICE_NAME), ruleFlags, false); + TagInterceptor interceptor = new TagInterceptor( + true, "my-service", Collections.singleton(DDTags.SERVICE_NAME), ruleFlags, false); interceptor.interceptServiceName(null, mock(DDSpanContext.class), "some-service"); @@ -753,9 +727,8 @@ void whenInterceptServletContextExtraServiceProviderIsCalled(String value, Strin try { RuleFlags ruleFlags = mock(RuleFlags.class); when(ruleFlags.isEnabled(any())).thenReturn(true); - TagInterceptor interceptor = - new TagInterceptor( - true, "my-service", Collections.singleton("servlet.context"), ruleFlags, false); + TagInterceptor interceptor = new TagInterceptor( + true, "my-service", Collections.singleton("servlet.context"), ruleFlags, false); interceptor.interceptServletContext(mock(DDSpanContext.class), value); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessorTest.java index e12c1a0dfa6..31e6f170e5a 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/HttpEndpointPostProcessorTest.java @@ -22,8 +22,11 @@ @ExtendWith(MockitoExtension.class) class HttpEndpointPostProcessorTest { - @Mock DDSpanContext mockContext; - @Mock AppendableSpanLinks mockSpanLinks; + @Mock + DDSpanContext mockContext; + + @Mock + AppendableSpanLinks mockSpanLinks; @Test void shouldNotOverwriteResourceNameWhenHttpRouteIsAvailableAndEligible() { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/InternalTagsAdderTest.java b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/InternalTagsAdderTest.java index ea3798a4427..437ce40817c 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/InternalTagsAdderTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/InternalTagsAdderTest.java @@ -57,11 +57,10 @@ void shouldAddVersionWhenDdServiceEqualsServiceNameAndVersionSet( DDSpanContext spanContext = mock(DDSpanContext.class); when(spanContext.getServiceName()).thenReturn(serviceName); - TagMap unsafeTags = - TagMap.fromMap( - initialVersion != null - ? Collections.singletonMap("version", initialVersion) - : Collections.emptyMap()); + TagMap unsafeTags = TagMap.fromMap( + initialVersion != null + ? Collections.singletonMap("version", initialVersion) + : Collections.emptyMap()); calculator.processTags(unsafeTags, spanContext, link -> {}); verify(spanContext, times(1)).getServiceName(); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PayloadTagsProcessorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PayloadTagsProcessorTest.java index 1405c6329ae..bf62fdc9899 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PayloadTagsProcessorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PayloadTagsProcessorTest.java @@ -52,10 +52,9 @@ private static Map spanTags(String tagPrefix, PathAndValue... pv private static PayloadTagsProcessor tagsProcessor( String tagPrefix, List redactionRules, int maxDepth, int maxTags) { - PayloadTagsProcessor.RedactionRules rules = - new PayloadTagsProcessor.RedactionRules.Builder() - .addRedactionJsonPaths(redactionRules) - .build(); + PayloadTagsProcessor.RedactionRules rules = new PayloadTagsProcessor.RedactionRules.Builder() + .addRedactionJsonPaths(redactionRules) + .build(); Map rulesMap = new HashMap<>(); rulesMap.put(tagPrefix, rules); return new PayloadTagsProcessor(rulesMap, maxDepth, maxTags); @@ -88,7 +87,8 @@ static Stream enabledWithDefaultsWhenConfiguredArguments() { "aws.response.body", pc().push("Endpoints").push("foobar").push("Token")), Arguments.arguments("$.foo.bar", "$..bar.*", "aws.request.body", pc().push("phoneNumber")), - Arguments.arguments(null, "all", "aws.response.body", pc().push("phoneNumbers").push(5)), + Arguments.arguments( + null, "all", "aws.response.body", pc().push("phoneNumbers").push(5)), Arguments.arguments( "all", null, "aws.request.body", pc().push("Attributes").push("KmsMasterKeyId"))); } @@ -180,33 +180,31 @@ void expandPayloadToTags() { void expandPreservingTagTypes() { PayloadTagsProcessor ptp = tagsProcessor("payload", Collections.emptyList(), 10, 758); - Map st = - spanTags( - "payload", - pv(pc().push("tag1"), 11), - pv(pc().push("tag2").push("Value"), 2342L), - pv(pc().push("tag3").push(0), 3.14d), - pv(pc().push("tag4").push("Value").push(0), "string"), - pv(pc().push("tag5"), null), - pv(pc().push("tag6"), false)); + Map st = spanTags( + "payload", + pv(pc().push("tag1"), 11), + pv(pc().push("tag2").push("Value"), 2342L), + pv(pc().push("tag3").push(0), 3.14d), + pv(pc().push("tag4").push("Value").push(0), "string"), + pv(pc().push("tag5"), null), + pv(pc().push("tag6"), false)); TagMap unsafeTags = TagMap.fromMap(st); ptp.processTags(unsafeTags, null, link -> {}); - Map expected = - mapOf( - "payload.tag1", - 11, - "payload.tag2.Value", - 2342L, - "payload.tag3.0", - 3.14d, - "payload.tag4.Value.0", - "string", - "payload.tag5", - null, - "payload.tag6", - false); + Map expected = mapOf( + "payload.tag1", + 11, + "payload.tag2.Value", + 2342L, + "payload.tag3.0", + 3.14d, + "payload.tag4.Value.0", + "string", + "payload.tag5", + null, + "payload.tag6", + false); assertEquals(expected, unsafeTags); } @@ -227,33 +225,31 @@ void expandUnknownTagValuesToString() { void expandStringifiedJsonTags() { PayloadTagsProcessor ptp = tagsProcessor("p", Collections.emptyList(), 10, 758); - Map st = - spanTags( - "p", - pv(pc().push("j1"), "{}"), - pv(pc().push("j2"), "[]"), - pv(pc().push("j3"), "['1', 2, 3.14, null, true]"), - pv(pc().push("j4"), "{'foo': 'bar', 'baz': 42}")); + Map st = spanTags( + "p", + pv(pc().push("j1"), "{}"), + pv(pc().push("j2"), "[]"), + pv(pc().push("j3"), "['1', 2, 3.14, null, true]"), + pv(pc().push("j4"), "{'foo': 'bar', 'baz': 42}")); TagMap unsafeTags = TagMap.fromMap(st); ptp.processTags(unsafeTags, null, link -> {}); - Map expected = - mapOf( - "p.j3.0", - "1", - "p.j3.1", - 2, - "p.j3.2", - 3.14d, - "p.j3.3", - null, - "p.j3.4", - true, - "p.j4.foo", - "bar", - "p.j4.baz", - 42); + Map expected = mapOf( + "p.j3.0", + "1", + "p.j3.1", + 2, + "p.j3.2", + 3.14d, + "p.j3.3", + null, + "p.j3.4", + true, + "p.j4.foo", + "bar", + "p.j4.baz", + 42); assertEquals(expected, unsafeTags); } @@ -331,12 +327,11 @@ void keepFailedToParseJsonAsIs(String invalidJson) { void expandBinaryIfJson() { PayloadTagsProcessor ptp = tagsProcessor("p", Collections.emptyList(), 10, 758); - Map st = - spanTags( - "p", - pv(pc().push("j0"), new ByteArrayInputStream("{}".getBytes())), - pv(pc().push("j1"), new ByteArrayInputStream("{'foo': 'bar'}".getBytes())), - pv(pc().push("j2"), new ByteArrayInputStream("[1, true]".getBytes()))); + Map st = spanTags( + "p", + pv(pc().push("j0"), new ByteArrayInputStream("{}".getBytes())), + pv(pc().push("j1"), new ByteArrayInputStream("{'foo': 'bar'}".getBytes())), + pv(pc().push("j2"), new ByteArrayInputStream("[1, true]".getBytes()))); TagMap unsafeTags = TagMap.fromMap(st); ptp.processTags(unsafeTags, null, link -> {}); @@ -360,12 +355,11 @@ void expandBinaryIfJson() { }) void expandBinaryEscapedJsonTags(String innerJson) { PayloadTagsProcessor ptp = tagsProcessor("p", Collections.emptyList(), 10, 758); - Map st = - spanTags( - "p", - pv( - pc().push("v"), - new ByteArrayInputStream(("{ \"inner\": " + innerJson + "}").getBytes()))); + Map st = spanTags( + "p", + pv( + pc().push("v"), + new ByteArrayInputStream(("{ \"inner\": " + innerJson + "}").getBytes()))); TagMap unsafeTags = TagMap.fromMap(st); ptp.processTags(unsafeTags, null, link -> {}); @@ -391,33 +385,31 @@ void useBinaryValueIfNotJsonOrCouldntBeParsed(String invalidJson) { void applyRedactionRules() { PayloadTagsProcessor ptp = tagsProcessor("p", Arrays.asList("$.j3[0]", "$.j4.baz"), 10, 758); - Map st = - spanTags( - "p", - pv(pc().push("j1"), "{}"), - pv(pc().push("j2"), "[]"), - pv(pc().push("j3"), "['1', 2, 3.14, null, true]"), - pv(pc().push("j4"), "{'foo': 'bar', 'baz': 42}")); + Map st = spanTags( + "p", + pv(pc().push("j1"), "{}"), + pv(pc().push("j2"), "[]"), + pv(pc().push("j3"), "['1', 2, 3.14, null, true]"), + pv(pc().push("j4"), "{'foo': 'bar', 'baz': 42}")); TagMap unsafeTags = TagMap.fromMap(st); ptp.processTags(unsafeTags, null, link -> {}); - Map expected = - mapOf( - "p.j3.0", - "redacted", - "p.j3.1", - 2, - "p.j3.2", - 3.14d, - "p.j3.3", - null, - "p.j3.4", - true, - "p.j4.foo", - "bar", - "p.j4.baz", - "redacted"); + Map expected = mapOf( + "p.j3.0", + "redacted", + "p.j3.1", + 2, + "p.j3.2", + 3.14d, + "p.j3.3", + null, + "p.j3.4", + true, + "p.j4.foo", + "bar", + "p.j4.baz", + "redacted"); assertEquals(expected, unsafeTags); } @@ -425,13 +417,12 @@ void applyRedactionRules() { void respectMaxTagsLimit() { PayloadTagsProcessor ptp = tagsProcessor("p", Arrays.asList("$.j3[0]", "$.j4.baz"), 10, 4); - Map st = - spanTags( - "p", - pv(pc().push("j1"), "{}"), - pv(pc().push("j2"), "[]"), - pv(pc().push("j3"), "['1', 2, 3.14, null, true]"), - pv(pc().push("j4"), "{'foo': 'bar', 'baz': 42}")); + Map st = spanTags( + "p", + pv(pc().push("j1"), "{}"), + pv(pc().push("j2"), "[]"), + pv(pc().push("j3"), "['1', 2, 3.14, null, true]"), + pv(pc().push("j4"), "{'foo': 'bar', 'baz': 42}")); TagMap unsafeTags = TagMap.fromMap(st); ptp.processTags(unsafeTags, null, link -> {}); @@ -455,13 +446,10 @@ void respectMaxTagsLimit() { void respectMaxDepthLimit() { PayloadTagsProcessor ptp = tagsProcessor("p", Arrays.asList("$.j3[0]", "$.j4.baz"), 3, 800); - Map st = - spanTags( - "p", - pv(pc().push("j3"), "['1', 2, 3.14, null, true, [ 1, [ 2, 3 ] ]]"), - pv( - pc().push("j4"), - "{'foo': 'bar', 'baz': 42, 'nested': { 'a': 1, 'b': { 'c': 2 } } }")); + Map st = spanTags( + "p", + pv(pc().push("j3"), "['1', 2, 3.14, null, true, [ 1, [ 2, 3 ] ]]"), + pv(pc().push("j4"), "{'foo': 'bar', 'baz': 42, 'nested': { 'a': 1, 'b': { 'c': 2 } } }")); TagMap unsafeTags = TagMap.fromMap(st); ptp.processTags(unsafeTags, null, link -> {}); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PeerServiceCalculatorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PeerServiceCalculatorTest.java index d9707fc0caf..14733cec9a4 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PeerServiceCalculatorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PeerServiceCalculatorTest.java @@ -113,9 +113,8 @@ void calculateOnlyForSpanKindClientOrProducer(String kind, boolean calculate) { }) void shouldApplyPeerServiceMappingsIfConfigured( Map tags, String expected, String original) { - PeerServiceCalculator calculator = - new PeerServiceCalculator( - new NamingSchemaV0().peerService(), Config.get().getPeerServiceMapping()); + PeerServiceCalculator calculator = new PeerServiceCalculator( + new NamingSchemaV0().peerService(), Config.get().getPeerServiceMapping()); TagMap unsafeTags = TagMap.fromMap(tags); calculator.processTags(unsafeTags, null, link -> {}); @@ -133,9 +132,8 @@ void shouldApplyPeerServiceMappingsIfConfigured( }) void shouldOverridePeerServiceValuesIfConfigured( Map tags, String expected, String source) { - PeerServiceCalculator calculator = - new PeerServiceCalculator( - new NamingSchemaV0().peerService(), Config.get().getPeerServiceComponentOverrides()); + PeerServiceCalculator calculator = new PeerServiceCalculator( + new NamingSchemaV0().peerService(), Config.get().getPeerServiceComponentOverrides()); TagMap unsafeTags = TagMap.fromMap(tags); calculator.processTags(unsafeTags, null, link -> {}); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PostProcessorChainTest.java b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PostProcessorChainTest.java index e1b49cfd5b8..41f261da2aa 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PostProcessorChainTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/tagprocessor/PostProcessorChainTest.java @@ -17,23 +17,21 @@ class PostProcessorChainTest extends DDJavaSpecification { @Test void chainWorks() { - TagsPostProcessor processor1 = - new TagsPostProcessor() { - @Override - public void processTags( - TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { - unsafeTags.put("key1", "processor1"); - unsafeTags.put("key2", "processor1"); - } - }; - TagsPostProcessor processor2 = - new TagsPostProcessor() { - @Override - public void processTags( - TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { - unsafeTags.put("key1", "processor2"); - } - }; + TagsPostProcessor processor1 = new TagsPostProcessor() { + @Override + public void processTags( + TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { + unsafeTags.put("key1", "processor1"); + unsafeTags.put("key2", "processor1"); + } + }; + TagsPostProcessor processor2 = new TagsPostProcessor() { + @Override + public void processTags( + TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { + unsafeTags.put("key1", "processor2"); + } + }; PostProcessorChain chain = new PostProcessorChain(processor1, processor2); @@ -50,25 +48,23 @@ public void processTags( @Test void processorCanHideTagsToNextOne() { - TagsPostProcessor processor1 = - new TagsPostProcessor() { - @Override - public void processTags( - TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { - unsafeTags.clear(); - unsafeTags.put("my", "tag"); - } - }; - TagsPostProcessor processor2 = - new TagsPostProcessor() { - @Override - public void processTags( - TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { - if (unsafeTags.containsKey("test")) { - unsafeTags.put("found", "true"); - } - } - }; + TagsPostProcessor processor1 = new TagsPostProcessor() { + @Override + public void processTags( + TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { + unsafeTags.clear(); + unsafeTags.put("my", "tag"); + } + }; + TagsPostProcessor processor2 = new TagsPostProcessor() { + @Override + public void processTags( + TagMap unsafeTags, DDSpanContext spanContext, AppendableSpanLinks spanLinks) { + if (unsafeTags.containsKey("test")) { + unsafeTags.put("found", "true"); + } + } + }; PostProcessorChain chain = new PostProcessorChain(processor1, processor2); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/util/StackTracesTest.java b/dd-trace-core/src/test/java/datadog/trace/core/util/StackTracesTest.java index d7d9b045735..0f1b3adbb97 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/util/StackTracesTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/util/StackTracesTest.java @@ -13,59 +13,58 @@ class StackTracesTest { - private static final String TRACE = - "\n" - + "Exception in thread \"main\" com.example.app.MainException: Unexpected application failure\n" - + " at com.example.app.Application$Runner.run(Application.java:102)\n" - + " at com.example.app.Application.lambda$start$0(Application.java:75)\n" - + " at java.base/java.util.Optional.ifPresent(Optional.java:178)\n" - + " at com.example.app.Application.start(Application.java:74)\n" - + " at com.example.app.Main.main(Main.java:21)\n" - + " at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n" - + " at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n" - + " at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n" - + " at java.base/java.lang.reflect.Method.invoke(Method.java:566)\n" - + " at com.example.launcher.Bootstrap.run(Bootstrap.java:39)\n" - + " at com.example.launcher.Bootstrap.main(Bootstrap.java:25)\n" - + " at com.example.internal.$Proxy1.start(Unknown Source)\n" - + " at com.example.internal.Initializer$1.run(Initializer.java:47)\n" - + " at com.example.internal.Initializer.lambda$init$0(Initializer.java:38)\n" - + " at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)\n" - + " at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n" - + " at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n" - + " at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n" - + " at java.base/java.lang.Thread.run(Thread.java:834)\n" - + " at com.example.synthetic.Helper.access$100(Helper.java:14)\n" - + "Caused by: com.example.db.DatabaseException: Failed to load user data\n" - + " at com.example.db.UserDao.findUser(UserDao.java:88)\n" - + " at com.example.db.UserDao.lambda$cacheLookup$1(UserDao.java:64)\n" - + " at com.example.cache.Cache$Entry.computeIfAbsent(Cache.java:111)\n" - + " at com.example.cache.Cache.get(Cache.java:65)\n" - + " at com.example.service.UserService.loadUser(UserService.java:42)\n" - + " at com.example.service.UserService.lambda$loadUserAsync$0(UserService.java:36)\n" - + " at com.example.util.SafeRunner.run(SafeRunner.java:27)\n" - + " at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)\n" - + " at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n" - + " at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n" - + " at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n" - + " at java.base/java.lang.Thread.run(Thread.java:834)\n" - + " at com.example.synthetic.UserDao$1.run(UserDao.java:94)\n" - + " at com.example.synthetic.UserDao$1.run(UserDao.java:94)\n" - + " at com.example.db.ConnectionManager.getConnection(ConnectionManager.java:55)\n" - + "Suppressed: java.io.IOException: Resource cleanup failed\n" - + " at com.example.util.ResourceManager.close(ResourceManager.java:23)\n" - + " at com.example.service.UserService.lambda$loadUserAsync$0(UserService.java:38)\n" - + " ... 3 more\n" - + "Caused by: java.nio.file.AccessDeniedException: /data/user/config.json\n" - + " at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)\n" - + " at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)\n" - + " at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)\n" - + " at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:219)\n" - + " at java.base/java.nio.file.Files.newByteChannel(Files.java:375)\n" - + " at java.base/java.nio.file.Files.newInputStream(Files.java:489)\n" - + " at com.example.util.FileUtils.readFile(FileUtils.java:22)\n" - + " at com.example.util.ResourceManager.close(ResourceManager.java:21)\n" - + " ... 3 more\n"; + private static final String TRACE = "\n" + + "Exception in thread \"main\" com.example.app.MainException: Unexpected application failure\n" + + " at com.example.app.Application$Runner.run(Application.java:102)\n" + + " at com.example.app.Application.lambda$start$0(Application.java:75)\n" + + " at java.base/java.util.Optional.ifPresent(Optional.java:178)\n" + + " at com.example.app.Application.start(Application.java:74)\n" + + " at com.example.app.Main.main(Main.java:21)\n" + + " at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n" + + " at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n" + + " at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n" + + " at java.base/java.lang.reflect.Method.invoke(Method.java:566)\n" + + " at com.example.launcher.Bootstrap.run(Bootstrap.java:39)\n" + + " at com.example.launcher.Bootstrap.main(Bootstrap.java:25)\n" + + " at com.example.internal.$Proxy1.start(Unknown Source)\n" + + " at com.example.internal.Initializer$1.run(Initializer.java:47)\n" + + " at com.example.internal.Initializer.lambda$init$0(Initializer.java:38)\n" + + " at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)\n" + + " at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n" + + " at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n" + + " at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n" + + " at java.base/java.lang.Thread.run(Thread.java:834)\n" + + " at com.example.synthetic.Helper.access$100(Helper.java:14)\n" + + "Caused by: com.example.db.DatabaseException: Failed to load user data\n" + + " at com.example.db.UserDao.findUser(UserDao.java:88)\n" + + " at com.example.db.UserDao.lambda$cacheLookup$1(UserDao.java:64)\n" + + " at com.example.cache.Cache$Entry.computeIfAbsent(Cache.java:111)\n" + + " at com.example.cache.Cache.get(Cache.java:65)\n" + + " at com.example.service.UserService.loadUser(UserService.java:42)\n" + + " at com.example.service.UserService.lambda$loadUserAsync$0(UserService.java:36)\n" + + " at com.example.util.SafeRunner.run(SafeRunner.java:27)\n" + + " at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)\n" + + " at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n" + + " at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n" + + " at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n" + + " at java.base/java.lang.Thread.run(Thread.java:834)\n" + + " at com.example.synthetic.UserDao$1.run(UserDao.java:94)\n" + + " at com.example.synthetic.UserDao$1.run(UserDao.java:94)\n" + + " at com.example.db.ConnectionManager.getConnection(ConnectionManager.java:55)\n" + + "Suppressed: java.io.IOException: Resource cleanup failed\n" + + " at com.example.util.ResourceManager.close(ResourceManager.java:23)\n" + + " at com.example.service.UserService.lambda$loadUserAsync$0(UserService.java:38)\n" + + " ... 3 more\n" + + "Caused by: java.nio.file.AccessDeniedException: /data/user/config.json\n" + + " at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)\n" + + " at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)\n" + + " at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)\n" + + " at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:219)\n" + + " at java.base/java.nio.file.Files.newByteChannel(Files.java:375)\n" + + " at java.base/java.nio.file.Files.newInputStream(Files.java:489)\n" + + " at com.example.util.FileUtils.readFile(FileUtils.java:22)\n" + + " at com.example.util.ResourceManager.close(ResourceManager.java:21)\n" + + " ... 3 more\n"; // --- safeGetMessage --- @@ -92,9 +91,8 @@ void getStackTraceFallsBackWhenPrintStackTraceThrowsStackOverflowError() { @Test void getStackTraceFallsBackToClassNameAndMessageWhenEverythingElseThrows() { - String trace = - StackTraces.getStackTrace( - TestThrowables.throwingStackOverflowEverywhereExceptGetMessage(), 1000); + String trace = StackTraces.getStackTrace( + TestThrowables.throwingStackOverflowEverywhereExceptGetMessage(), 1000); assertTrue(trace.contains("TestThrowables"), "must include the throwable's class name"); assertTrue(trace.contains("still readable"), "must include the throwable's message"); } @@ -103,7 +101,8 @@ void getStackTraceFallsBackToClassNameAndMessageWhenEverythingElseThrows() { void getStackTraceFallsBackToClassNameWhenGetMessageAlsoThrows() { String trace = StackTraces.getStackTrace(TestThrowables.throwingStackOverflowEverywhere(), 1000); - assertEquals(trace, TestThrowables.throwingStackOverflowEverywhere().getClass().getName()); + assertEquals( + trace, TestThrowables.throwingStackOverflowEverywhere().getClass().getName()); } // --- getStackTrace with broken getMessage --- diff --git a/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaAppSecHandlerTest.java b/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaAppSecHandlerTest.java index 33e68f528e2..f39affddf59 100644 --- a/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaAppSecHandlerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaAppSecHandlerTest.java @@ -142,9 +142,8 @@ void processRequestStartReturnsNullForMalformedJson() { @Test @SuppressWarnings("unchecked") void processRequestStartSkipsAppSecForNonHttpTrigger() { - String sqsEvent = - "{\"Records\": [{\"eventSource\": \"aws:sqs\", \"body\": \"hello\"," - + " \"messageAttributes\": {}}]}"; + String sqsEvent = "{\"Records\": [{\"eventSource\": \"aws:sqs\", \"body\": \"hello\"," + + " \"messageAttributes\": {}}]}"; ByteArrayInputStream event = createInputStream(sqsEvent); Supplier> requestStartedCallback = mock(Supplier.class); @@ -188,11 +187,9 @@ void detectsApiGatewayV1RestTriggerType() { @Test void detectsApiGatewayV2HttpTriggerType() { - Map event = - mapOf( - "requestContext", - mapOf( - "http", mapOf("method", "POST", "path", "/api"), "domainName", "api.example.com")); + Map event = mapOf( + "requestContext", + mapOf("http", mapOf("method", "POST", "path", "/api"), "domainName", "api.example.com")); LambdaTriggerType triggerType = detectTriggerType(event); @@ -201,14 +198,13 @@ void detectsApiGatewayV2HttpTriggerType() { @Test void detectsLambdaFunctionUrlTriggerType() { - Map event = + Map event = mapOf( + "requestContext", mapOf( - "requestContext", - mapOf( - "http", - mapOf("method", "GET", "path", "/"), - "domainName", - "xyz123.lambda-url.us-east-1.on.aws")); + "http", + mapOf("method", "GET", "path", "/"), + "domainName", + "xyz123.lambda-url.us-east-1.on.aws")); LambdaTriggerType triggerType = detectTriggerType(event); @@ -217,14 +213,13 @@ void detectsLambdaFunctionUrlTriggerType() { @Test void detectsAlbTriggerTypeWithoutMultiValueHeaders() { - Map event = - mapOf( - "httpMethod", - "GET", - "path", - "/", - "requestContext", - mapOf("elb", mapOf("targetGroupArn", "arn:aws:..."))); + Map event = mapOf( + "httpMethod", + "GET", + "path", + "/", + "requestContext", + mapOf("elb", mapOf("targetGroupArn", "arn:aws:..."))); LambdaTriggerType triggerType = detectTriggerType(event); @@ -233,16 +228,15 @@ void detectsAlbTriggerTypeWithoutMultiValueHeaders() { @Test void detectsAlbTriggerTypeWithMultiValueHeaders() { - Map event = - mapOf( - "httpMethod", - "GET", - "path", - "/", - "multiValueHeaders", - mapOf("accept", Arrays.asList("text/html", "application/json")), - "requestContext", - mapOf("elb", mapOf("targetGroupArn", "arn:aws:..."))); + Map event = mapOf( + "httpMethod", + "GET", + "path", + "/", + "multiValueHeaders", + mapOf("accept", Arrays.asList("text/html", "application/json")), + "requestContext", + mapOf("elb", mapOf("targetGroupArn", "arn:aws:..."))); LambdaTriggerType triggerType = detectTriggerType(event); @@ -304,19 +298,18 @@ void detectsLambdaUrlWhenHttpPresentButNoDomainName() { @Test @SuppressWarnings("unchecked") void extractsApiGatewayV1RestDataCorrectly() { - String eventJson = - "{" - + "\"path\": \"/api/users/123\"," - + "\"httpMethod\": \"POST\"," - + "\"headers\": {\"Content-Type\": \"application/json\", \"Authorization\": \"Bearer token123\"}," - + "\"pathParameters\": {\"userId\": \"123\"}," - + "\"body\": \"{\\\"name\\\": \\\"John\\\"}\"," - + "\"requestContext\": {" - + " \"httpMethod\": \"POST\"," - + " \"requestId\": \"req-123\"," - + " \"identity\": {\"sourceIp\": \"192.168.1.100\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/users/123\"," + + "\"httpMethod\": \"POST\"," + + "\"headers\": {\"Content-Type\": \"application/json\", \"Authorization\": \"Bearer token123\"}," + + "\"pathParameters\": {\"userId\": \"123\"}," + + "\"body\": \"{\\\"name\\\": \\\"John\\\"}\"," + + "\"requestContext\": {" + + " \"httpMethod\": \"POST\"," + + " \"requestId\": \"req-123\"," + + " \"identity\": {\"sourceIp\": \"192.168.1.100\"}" + + "}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedMethod = {null}; @@ -327,21 +320,18 @@ void extractsApiGatewayV1RestDataCorrectly() { Map[] capturedPathParams = {null}; Object[] capturedBody = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedMethod[0] = method; - capturedPath[0] = uri.path(); - }) - .onHeader(capturedHeaders::put) - .onSocketAddress( - (ip, port) -> { - capturedSourceIp[0] = ip; - capturedSourcePort[0] = port; - }) - .onPathParams(params -> capturedPathParams[0] = params) - .onBody(body -> capturedBody[0] = body)); + setupMockCallbacks(new Callbacks() + .onMethodUri((method, uri) -> { + capturedMethod[0] = method; + capturedPath[0] = uri.path(); + }) + .onHeader(capturedHeaders::put) + .onSocketAddress((ip, port) -> { + capturedSourceIp[0] = ip; + capturedSourcePort[0] = port; + }) + .onPathParams(params -> capturedPathParams[0] = params) + .onBody(body -> capturedBody[0] = body)); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -363,18 +353,17 @@ void extractsApiGatewayV1RestDataCorrectly() { @Test void extractsApiGatewayV2HttpDataCorrectly() { - String eventJson = - "{" - + "\"version\": \"2.0\"," - + "\"headers\": {\"content-type\": \"application/json\", \"x-custom-header\": \"custom-value\"}," - + "\"cookies\": [\"session=abc123\", \"user=john\"]," - + "\"pathParameters\": {\"id\": \"456\"}," - + "\"body\": \"test body\"," - + "\"requestContext\": {" - + " \"http\": {\"method\": \"PUT\", \"path\": \"/api/items/456\", \"sourceIp\": \"10.0.0.50\", \"sourcePort\": 54321}," - + " \"domainName\": \"api.example.com\"" - + "}" - + "}"; + String eventJson = "{" + + "\"version\": \"2.0\"," + + "\"headers\": {\"content-type\": \"application/json\", \"x-custom-header\": \"custom-value\"}," + + "\"cookies\": [\"session=abc123\", \"user=john\"]," + + "\"pathParameters\": {\"id\": \"456\"}," + + "\"body\": \"test body\"," + + "\"requestContext\": {" + + " \"http\": {\"method\": \"PUT\", \"path\": \"/api/items/456\", \"sourceIp\": \"10.0.0.50\", \"sourcePort\": 54321}," + + " \"domainName\": \"api.example.com\"" + + "}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedMethod = {null}; @@ -384,20 +373,17 @@ void extractsApiGatewayV2HttpDataCorrectly() { int[] capturedSourcePort = {-1}; Map[] capturedPathParams = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedMethod[0] = method; - capturedPath[0] = uri.path(); - }) - .onHeader(capturedHeaders::put) - .onSocketAddress( - (ip, port) -> { - capturedSourceIp[0] = ip; - capturedSourcePort[0] = port; - }) - .onPathParams(params -> capturedPathParams[0] = params)); + setupMockCallbacks(new Callbacks() + .onMethodUri((method, uri) -> { + capturedMethod[0] = method; + capturedPath[0] = uri.path(); + }) + .onHeader(capturedHeaders::put) + .onSocketAddress((ip, port) -> { + capturedSourceIp[0] = ip; + capturedSourcePort[0] = port; + }) + .onPathParams(params -> capturedPathParams[0] = params)); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -415,27 +401,23 @@ void extractsApiGatewayV2HttpDataCorrectly() { @Test void extractsLambdaFunctionUrlDataCorrectly() { - String eventJson = - "{" - + "\"version\": \"2.0\"," - + "\"headers\": {\"host\": \"xyz.lambda-url.us-east-1.on.aws\"}," - + "\"requestContext\": {" - + " \"http\": {\"method\": \"GET\", \"path\": \"/function/path\", \"sourceIp\": \"1.2.3.4\"}," - + " \"domainName\": \"xyz.lambda-url.us-east-1.on.aws\"" - + "}" - + "}"; + String eventJson = "{" + + "\"version\": \"2.0\"," + + "\"headers\": {\"host\": \"xyz.lambda-url.us-east-1.on.aws\"}," + + "\"requestContext\": {" + + " \"http\": {\"method\": \"GET\", \"path\": \"/function/path\", \"sourceIp\": \"1.2.3.4\"}," + + " \"domainName\": \"xyz.lambda-url.us-east-1.on.aws\"" + + "}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedMethod = {null}; String[] capturedPath = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedMethod[0] = method; - capturedPath[0] = uri.path(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedMethod[0] = method; + capturedPath[0] = uri.path(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -446,29 +428,26 @@ void extractsLambdaFunctionUrlDataCorrectly() { @Test void extractsAlbDataCorrectly() { - String eventJson = - "{" - + "\"path\": \"/alb/test\"," - + "\"httpMethod\": \"DELETE\"," - + "\"headers\": {\"x-forwarded-for\": \"203.0.113.42\", \"user-agent\": \"curl/7.64.1\"}," - + "\"requestContext\": {" - + " \"elb\": {\"targetGroupArn\": \"arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/tg/50dc6c495c0c9188\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"path\": \"/alb/test\"," + + "\"httpMethod\": \"DELETE\"," + + "\"headers\": {\"x-forwarded-for\": \"203.0.113.42\", \"user-agent\": \"curl/7.64.1\"}," + + "\"requestContext\": {" + + " \"elb\": {\"targetGroupArn\": \"arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/tg/50dc6c495c0c9188\"}" + + "}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedMethod = {null}; String[] capturedPath = {null}; String[] capturedSourceIp = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedMethod[0] = method; - capturedPath[0] = uri.path(); - }) - .onSocketAddress((ip, port) -> capturedSourceIp[0] = ip)); + setupMockCallbacks(new Callbacks() + .onMethodUri((method, uri) -> { + capturedMethod[0] = method; + capturedPath[0] = uri.path(); + }) + .onSocketAddress((ip, port) -> capturedSourceIp[0] = ip)); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -480,13 +459,12 @@ void extractsAlbDataCorrectly() { @Test void extractsAlbMultiValueHeadersCorrectly() { - String eventJson = - "{" - + "\"path\": \"/test\"," - + "\"httpMethod\": \"GET\"," - + "\"multiValueHeaders\": {\"accept\": [\"text/html\", \"application/json\"], \"x-custom\": [\"value1\", \"value2\"]}," - + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" - + "}"; + String eventJson = "{" + + "\"path\": \"/test\"," + + "\"httpMethod\": \"GET\"," + + "\"multiValueHeaders\": {\"accept\": [\"text/html\", \"application/json\"], \"x-custom\": [\"value1\", \"value2\"]}," + + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Map capturedHeaders = new HashMap<>(); @@ -502,24 +480,20 @@ void extractsAlbMultiValueHeadersCorrectly() { @Test void albMultiValueQueryParamsHandlesListValues() { - String eventJson = - "{" - + "\"path\": \"/test\"," - + "\"httpMethod\": \"GET\"," - + "\"multiValueHeaders\": {\"accept\": [\"text/html\"]}," - + "\"multiValueQueryStringParameters\": {\"foo\": [\"bar\", \"baz\"], \"x\": [null, \"val\"]}," - + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" - + "}"; + String eventJson = "{" + + "\"path\": \"/test\"," + + "\"httpMethod\": \"GET\"," + + "\"multiValueHeaders\": {\"accept\": [\"text/html\"]}," + + "\"multiValueQueryStringParameters\": {\"foo\": [\"bar\", \"baz\"], \"x\": [null, \"val\"]}," + + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedQuery = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedQuery[0] = uri.query(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedQuery[0] = uri.query(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -531,13 +505,12 @@ void albMultiValueQueryParamsHandlesListValues() { @Test void albMultiValueHeadersHandlesNonListValue() { - String eventJson = - "{" - + "\"path\": \"/test\"," - + "\"httpMethod\": \"GET\"," - + "\"multiValueHeaders\": {\"content-type\": \"text/plain\", \"accept\": [\"application/json\"]}," - + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" - + "}"; + String eventJson = "{" + + "\"path\": \"/test\"," + + "\"httpMethod\": \"GET\"," + + "\"multiValueHeaders\": {\"content-type\": \"text/plain\", \"accept\": [\"application/json\"]}," + + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Map capturedHeaders = new HashMap<>(); @@ -565,24 +538,20 @@ void nullJsonEventReturnsEmpty() { @Test void albMultiValueQueryParamsHandlesNonListValue() { - String eventJson = - "{" - + "\"path\": \"/test\"," - + "\"httpMethod\": \"GET\"," - + "\"multiValueHeaders\": {\"accept\": [\"text/html\"]}," - + "\"multiValueQueryStringParameters\": {\"foo\": \"plain-string\"}," - + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" - + "}"; + String eventJson = "{" + + "\"path\": \"/test\"," + + "\"httpMethod\": \"GET\"," + + "\"multiValueHeaders\": {\"accept\": [\"text/html\"]}," + + "\"multiValueQueryStringParameters\": {\"foo\": \"plain-string\"}," + + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedQuery = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedQuery[0] = uri.query(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedQuery[0] = uri.query(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -593,13 +562,12 @@ void albMultiValueQueryParamsHandlesNonListValue() { @Test void handlesMultiValueHeadersWithEmptyList() { - String eventJson = - "{" - + "\"path\": \"/test\"," - + "\"httpMethod\": \"GET\"," - + "\"multiValueHeaders\": {\"accept\": [], \"x-custom\": [\"value1\"]}," - + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" - + "}"; + String eventJson = "{" + + "\"path\": \"/test\"," + + "\"httpMethod\": \"GET\"," + + "\"multiValueHeaders\": {\"accept\": [], \"x-custom\": [\"value1\"]}," + + "\"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn:aws:...\"}}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Map capturedHeaders = new HashMap<>(); @@ -615,28 +583,25 @@ void handlesMultiValueHeadersWithEmptyList() { @Test void extractsWebSocketDataCorrectly() { - String eventJson = - "{" - + "\"requestContext\": {" - + " \"routeKey\": \"$connect\"," - + " \"connectionId\": \"conn-abc123\"," - + " \"identity\": {\"sourceIp\": \"192.168.0.100\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"requestContext\": {" + + " \"routeKey\": \"$connect\"," + + " \"connectionId\": \"conn-abc123\"," + + " \"identity\": {\"sourceIp\": \"192.168.0.100\"}" + + "}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedMethod = {null}; String[] capturedPath = {null}; String[] capturedSourceIp = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedMethod[0] = method; - capturedPath[0] = uri.path(); - }) - .onSocketAddress((ip, port) -> capturedSourceIp[0] = ip)); + setupMockCallbacks(new Callbacks() + .onMethodUri((method, uri) -> { + capturedMethod[0] = method; + capturedPath[0] = uri.path(); + }) + .onSocketAddress((ip, port) -> capturedSourceIp[0] = ip)); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -650,14 +615,13 @@ void extractsWebSocketDataCorrectly() { void handlesBase64EncodedBodyCorrectly() { String originalBody = "This is test data"; String base64Body = Base64.getEncoder().encodeToString(originalBody.getBytes()); - String eventJson = - "{" - + "\"body\": \"" - + base64Body - + "\"," - + "\"isBase64Encoded\": true," - + "\"requestContext\": {\"httpMethod\": \"POST\"}" - + "}"; + String eventJson = "{" + + "\"body\": \"" + + base64Body + + "\"," + + "\"isBase64Encoded\": true," + + "\"requestContext\": {\"httpMethod\": \"POST\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Object[] capturedBody = {null}; @@ -702,23 +666,19 @@ void handlesEmptyBodyCorrectly() { @Test void handlesPathWithQueryStringCorrectly() { - String eventJson = - "{" - + "\"path\": \"/api/users?id=123&filter=active\"," - + "\"requestContext\": {\"httpMethod\": \"GET\"}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/users?id=123&filter=active\"," + + "\"requestContext\": {\"httpMethod\": \"GET\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedPath = {null}; String[] capturedQuery = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedPath[0] = uri.path(); - capturedQuery[0] = uri.query(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedPath[0] = uri.path(); + capturedQuery[0] = uri.query(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -729,12 +689,11 @@ void handlesPathWithQueryStringCorrectly() { @Test void extractsQueryStringParametersAndBuildsFullUri() { - String eventJson = - "{" - + "\"path\": \"/api/items\"," - + "\"queryStringParameters\": {\"page\": \"2\", \"sort\": \"asc\"}," - + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-456\"}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/items\"," + + "\"queryStringParameters\": {\"page\": \"2\", \"sort\": \"asc\"}," + + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-456\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedPath = {null}; @@ -744,17 +703,14 @@ void extractsQueryStringParametersAndBuildsFullUri() { String[] capturedHost = {"NOT_CALLED"}; String[] capturedFragment = {"NOT_CALLED"}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedPath[0] = uri.path(); - capturedQuery[0] = uri.query(); - capturedRawPath[0] = uri.rawPath(); - capturedRawQuery[0] = uri.rawQuery(); - capturedHost[0] = uri.host(); - capturedFragment[0] = uri.fragment(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedPath[0] = uri.path(); + capturedQuery[0] = uri.query(); + capturedRawPath[0] = uri.rawPath(); + capturedRawQuery[0] = uri.rawQuery(); + capturedHost[0] = uri.host(); + capturedFragment[0] = uri.fragment(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -771,22 +727,18 @@ void extractsQueryStringParametersAndBuildsFullUri() { @Test void extractQueryParametersFiltersNullEntries() { - String eventJson = - "{" - + "\"path\": \"/filter-test\"," - + "\"queryStringParameters\": {\"valid\": \"keep\", \"nullval\": null}," - + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-789\"}" - + "}"; + String eventJson = "{" + + "\"path\": \"/filter-test\"," + + "\"queryStringParameters\": {\"valid\": \"keep\", \"nullval\": null}," + + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-789\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedQuery = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedQuery[0] = uri.query(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedQuery[0] = uri.query(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -800,22 +752,18 @@ void extractQueryParametersFiltersNullEntries() { void buildFullPathEncodesSpecialCharactersInQueryParams() { // Keys/values containing '&', '=', and spaces must be percent-encoded so they are not // misinterpreted as query string delimiters when AppSec parses the raw query string. - String eventJson = - "{" - + "\"path\": \"/search\"," - + "\"queryStringParameters\": {\"q\": \"hello world\", \"filter\": \"a&b\", \"eq\": \"x=y\"}," - + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-special\"}" - + "}"; + String eventJson = "{" + + "\"path\": \"/search\"," + + "\"queryStringParameters\": {\"q\": \"hello world\", \"filter\": \"a&b\", \"eq\": \"x=y\"}," + + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-special\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedQuery = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedQuery[0] = uri.query(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedQuery[0] = uri.query(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -834,24 +782,20 @@ void buildFullPathEncodesSpecialCharactersInQueryParams() { @Test void handlesInvalidXForwardedPortGracefully() { - String eventJson = - "{" - + "\"path\": \"/api/test\"," - + "\"headers\": {\"x-forwarded-proto\": \"https\", \"x-forwarded-port\": \"not-a-number\"}," - + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-123\"}" - + "}"; + String eventJson = "{" + + "\"path\": \"/api/test\"," + + "\"headers\": {\"x-forwarded-proto\": \"https\", \"x-forwarded-port\": \"not-a-number\"}," + + "\"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"req-123\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedScheme = {null}; int[] capturedPort = {-1}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedScheme[0] = uri.scheme(); - capturedPort[0] = uri.port(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedScheme[0] = uri.scheme(); + capturedPort[0] = uri.port(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -862,12 +806,11 @@ void handlesInvalidXForwardedPortGracefully() { @Test void handlesInvalidBase64BodyGracefully() { - String eventJson = - "{" - + "\"body\": \"not-valid-base64\"," - + "\"isBase64Encoded\": true," - + "\"requestContext\": {\"httpMethod\": \"POST\"}" - + "}"; + String eventJson = "{" + + "\"body\": \"not-valid-base64\"," + + "\"isBase64Encoded\": true," + + "\"requestContext\": {\"httpMethod\": \"POST\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedBody = {"NOT_CALLED"}; @@ -883,14 +826,13 @@ void handlesInvalidBase64BodyGracefully() { @Test void handlesBase64DecodedEmptyStringBody() { String base64Empty = Base64.getEncoder().encodeToString("".getBytes()); - String eventJson = - "{" - + "\"body\": \"" - + base64Empty - + "\"," - + "\"isBase64Encoded\": true," - + "\"requestContext\": {\"httpMethod\": \"POST\"}" - + "}"; + String eventJson = "{" + + "\"body\": \"" + + base64Empty + + "\"," + + "\"isBase64Encoded\": true," + + "\"requestContext\": {\"httpMethod\": \"POST\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Object[] capturedBody = {null}; @@ -906,11 +848,10 @@ void handlesBase64DecodedEmptyStringBody() { @Test @SuppressWarnings("unchecked") void handlesBodyWithSpecialCharacters() { - String eventJson = - "{" - + "\"body\": \"{\\\"text\\\": \\\"Hello \\u4e16\\u754c \\uD83C\\uDF0D\\\"}\"," - + "\"requestContext\": {\"httpMethod\": \"POST\"}" - + "}"; + String eventJson = "{" + + "\"body\": \"{\\\"text\\\": \\\"Hello \\u4e16\\u754c \\uD83C\\uDF0D\\\"}\"," + + "\"requestContext\": {\"httpMethod\": \"POST\"}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Object[] capturedBody = {null}; @@ -930,26 +871,23 @@ void handlesBodyWithSpecialCharacters() { @Test void extractsDataFromLambdaUrlWithHttpInRequestContext() { - String eventJson = - "{" - + "\"requestContext\": {" - + " \"http\": {\"method\": \"OPTIONS\", \"path\": \"/options/path\", \"sourceIp\": \"198.51.100.50\"}" - + "}" - + "}"; + String eventJson = "{" + + "\"requestContext\": {" + + " \"http\": {\"method\": \"OPTIONS\", \"path\": \"/options/path\", \"sourceIp\": \"198.51.100.50\"}" + + "}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); String[] capturedMethod = {null}; String[] capturedPath = {null}; String[] capturedSourceIp = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedMethod[0] = method; - capturedPath[0] = uri.path(); - }) - .onSocketAddress((ip, port) -> capturedSourceIp[0] = ip)); + setupMockCallbacks(new Callbacks() + .onMethodUri((method, uri) -> { + capturedMethod[0] = method; + capturedPath[0] = uri.path(); + }) + .onSocketAddress((ip, port) -> capturedSourceIp[0] = ip)); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -968,13 +906,10 @@ void extractsHttpMethodFromRequestContextOfApiGatewayV1Payload() { String[] capturedMethod = {null}; String[] capturedPath = {null}; - setupMockCallbacks( - new Callbacks() - .onMethodUri( - (method, uri) -> { - capturedMethod[0] = method; - capturedPath[0] = uri.path(); - })); + setupMockCallbacks(new Callbacks().onMethodUri((method, uri) -> { + capturedMethod[0] = method; + capturedPath[0] = uri.path(); + })); AgentSpanContext result = LambdaAppSecHandler.processRequestStart(event); @@ -985,12 +920,11 @@ void extractsHttpMethodFromRequestContextOfApiGatewayV1Payload() { @Test void handlesCookiesMergingWithExistingCookieHeader() { - String eventJson = - "{" - + "\"headers\": {\"cookie\": \"existing=value\"}," - + "\"cookies\": [\"new=cookie1\", \"another=cookie2\"]," - + "\"requestContext\": {\"http\": {\"method\": \"GET\", \"path\": \"/\"}}" - + "}"; + String eventJson = "{" + + "\"headers\": {\"cookie\": \"existing=value\"}," + + "\"cookies\": [\"new=cookie1\", \"another=cookie2\"]," + + "\"requestContext\": {\"http\": {\"method\": \"GET\", \"path\": \"/\"}}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Map capturedHeaders = new HashMap<>(); @@ -1005,12 +939,11 @@ void handlesCookiesMergingWithExistingCookieHeader() { @Test void handlesEmptyCookiesArrayCorrectly() { - String eventJson = - "{" - + "\"headers\": {\"content-type\": \"application/json\"}," - + "\"cookies\": []," - + "\"requestContext\": {\"http\": {\"method\": \"GET\", \"path\": \"/\"}}" - + "}"; + String eventJson = "{" + + "\"headers\": {\"content-type\": \"application/json\"}," + + "\"cookies\": []," + + "\"requestContext\": {\"http\": {\"method\": \"GET\", \"path\": \"/\"}}" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); Map capturedHeaders = new HashMap<>(); @@ -1378,13 +1311,12 @@ void processRequestStartHandlesNullPathParamsCallbackGracefully() { @Test void processRequestStartHandlesExceptionDuringStreamReading() { - ByteArrayInputStream mockStream = - new ByteArrayInputStream("data".getBytes()) { - @Override - public synchronized int available() { - throw new RuntimeException("Stream error"); - } - }; + ByteArrayInputStream mockStream = new ByteArrayInputStream("data".getBytes()) { + @Override + public synchronized int available() { + throw new RuntimeException("Stream error"); + } + }; assertNull(LambdaAppSecHandler.processRequestStart(mockStream)); } @@ -1423,13 +1355,12 @@ void temporaryRequestContextNoOpMethodsReturnExpectedDefaults() { } private RequestContext captureTemporaryRequestContext(Object appSecContext) { - String eventJson = - "{\n" - + " \"path\": \"/test\",\n" - + " \"requestContext\": {\n" - + " \"httpMethod\": \"GET\"\n" - + " }\n" - + "}"; + String eventJson = "{\n" + + " \"path\": \"/test\",\n" + + " \"requestContext\": {\n" + + " \"httpMethod\": \"GET\"\n" + + " }\n" + + "}"; ByteArrayInputStream event = createInputStream(eventJson); RequestContext[] captured = {null}; @@ -1439,11 +1370,10 @@ private RequestContext captureTemporaryRequestContext(Object appSecContext) { TriFunction> methodUriCallback = mock(TriFunction.class); - doAnswer( - inv -> { - captured[0] = inv.getArgument(0); - return new Flow.ResultFlow<>(null); - }) + doAnswer(inv -> { + captured[0] = inv.getArgument(0); + return new Flow.ResultFlow<>(null); + }) .when(methodUriCallback) .apply(any(), any(), any()); @@ -1546,9 +1476,8 @@ void processResponseDataSkipsNonApiGwResponseWhenTriggerTypeIsUnknown() { ByteArrayOutputStream result = createOutputStream("{\"result\": \"hello\"}"); Integer[] capturedStatus = {null}; boolean[] headerDoneCalled = {false}; - AgentSpan span = - setupMockResponseCallbacks( - status -> capturedStatus[0] = status, null, () -> headerDoneCalled[0] = true, null); + AgentSpan span = setupMockResponseCallbacks( + status -> capturedStatus[0] = status, null, () -> headerDoneCalled[0] = true, null); LambdaAppSecHandler.processResponseData(span, result); assertNull(capturedStatus[0]); assertFalse(headerDoneCalled[0]); @@ -1563,12 +1492,11 @@ void processResponseDataAppliesFallbackForHttpTriggerWithPlainJsonResponse() { Map capturedHeaders = new HashMap<>(); boolean[] headerDoneCalled = {false}; Object[] capturedBody = {null}; - AgentSpan span = - setupMockResponseCallbacks( - status -> capturedStatus[0] = status, - capturedHeaders::put, - () -> headerDoneCalled[0] = true, - body -> capturedBody[0] = body); + AgentSpan span = setupMockResponseCallbacks( + status -> capturedStatus[0] = status, + capturedHeaders::put, + () -> headerDoneCalled[0] = true, + body -> capturedBody[0] = body); LambdaAppSecHandler.processResponseData(span, result); assertNull(capturedStatus[0]); assertEquals("application/json", capturedHeaders.get("content-type")); @@ -1583,19 +1511,17 @@ void processResponseDataKeepsParsedHeadersAndBodyWhenStatusCodeIsZero() { // A response that has statusCode:0 with explicit headers/body should use the parsed data, // not discard it in favour of the plain-response fallback. LambdaAppSecHandler.setCurrentTriggerType(LambdaTriggerType.API_GATEWAY_V1_REST); - ByteArrayOutputStream result = - createOutputStream( - "{\"statusCode\": 0, \"headers\": {\"content-type\": \"text/plain\"}, \"body\": \"hello\"}"); + ByteArrayOutputStream result = createOutputStream( + "{\"statusCode\": 0, \"headers\": {\"content-type\": \"text/plain\"}, \"body\": \"hello\"}"); Integer[] capturedStatus = {null}; Map capturedHeaders = new HashMap<>(); boolean[] headerDoneCalled = {false}; Object[] capturedBody = {null}; - AgentSpan span = - setupMockResponseCallbacks( - status -> capturedStatus[0] = status, - capturedHeaders::put, - () -> headerDoneCalled[0] = true, - body -> capturedBody[0] = body); + AgentSpan span = setupMockResponseCallbacks( + status -> capturedStatus[0] = status, + capturedHeaders::put, + () -> headerDoneCalled[0] = true, + body -> capturedBody[0] = body); LambdaAppSecHandler.processResponseData(span, result); assertNull(capturedStatus[0]); // statusCode 0 — responseStarted not fired assertEquals("text/plain", capturedHeaders.get("content-type")); // parsed header kept @@ -1611,12 +1537,11 @@ void processResponseDataAppliesFallbackForHttpTriggerWithNonJsonStringResponse() Integer[] capturedStatus = {null}; boolean[] headerDoneCalled = {false}; Object[] capturedBody = {null}; - AgentSpan span = - setupMockResponseCallbacks( - status -> capturedStatus[0] = status, - null, - () -> headerDoneCalled[0] = true, - body -> capturedBody[0] = body); + AgentSpan span = setupMockResponseCallbacks( + status -> capturedStatus[0] = status, + null, + () -> headerDoneCalled[0] = true, + body -> capturedBody[0] = body); LambdaAppSecHandler.processResponseData(span, result); assertNull(capturedStatus[0]); assertTrue(headerDoneCalled[0]); @@ -1631,9 +1556,8 @@ void processResponseDataWebSocketWithStatusCodeFiresResponseStarted() { ByteArrayOutputStream result = createOutputStream("{\"statusCode\": 200}"); Integer[] capturedStatus = {null}; boolean[] headerDoneCalled = {false}; - AgentSpan span = - setupMockResponseCallbacks( - status -> capturedStatus[0] = status, null, () -> headerDoneCalled[0] = true, null); + AgentSpan span = setupMockResponseCallbacks( + status -> capturedStatus[0] = status, null, () -> headerDoneCalled[0] = true, null); LambdaAppSecHandler.processResponseData(span, result); assertEquals(200, capturedStatus[0]); assertTrue(headerDoneCalled[0]); @@ -1647,12 +1571,11 @@ void processResponseDataWebSocketWithoutStatusCodeUsesFallbackWithNoStatus() { Integer[] capturedStatus = {null}; boolean[] headerDoneCalled = {false}; Object[] capturedBody = {null}; - AgentSpan span = - setupMockResponseCallbacks( - status -> capturedStatus[0] = status, - null, - () -> headerDoneCalled[0] = true, - body -> capturedBody[0] = body); + AgentSpan span = setupMockResponseCallbacks( + status -> capturedStatus[0] = status, + null, + () -> headerDoneCalled[0] = true, + body -> capturedBody[0] = body); LambdaAppSecHandler.processResponseData(span, result); assertNull(capturedStatus[0]); // no responseStarted for status-less WebSocket messages assertTrue(headerDoneCalled[0]); @@ -1766,9 +1689,8 @@ void processResponseDataHandlesEmptyHeaders() { ByteArrayOutputStream result = createOutputStream("{\"statusCode\": 200}"); Map capturedHeaders = new HashMap<>(); boolean[] headerDoneCalled = {false}; - AgentSpan span = - setupMockResponseCallbacks( - null, capturedHeaders::put, () -> headerDoneCalled[0] = true, null); + AgentSpan span = setupMockResponseCallbacks( + null, capturedHeaders::put, () -> headerDoneCalled[0] = true, null); LambdaAppSecHandler.processResponseData(span, result); assertTrue(capturedHeaders.isEmpty()); assertTrue(headerDoneCalled[0]); @@ -1823,9 +1745,8 @@ void processResponseDataHandlesBase64EncodedBody() { void processResponseDataHandlesNullBody() { ByteArrayOutputStream result = createOutputStream("{\"statusCode\": 200, \"body\": null}"); String[] capturedBody = {"NOT_CALLED"}; - AgentSpan span = - setupMockResponseCallbacks( - null, null, null, body -> capturedBody[0] = String.valueOf(body)); + AgentSpan span = setupMockResponseCallbacks( + null, null, null, body -> capturedBody[0] = String.valueOf(body)); LambdaAppSecHandler.processResponseData(span, result); assertEquals("NOT_CALLED", capturedBody[0]); } @@ -1834,9 +1755,8 @@ void processResponseDataHandlesNullBody() { void processResponseDataHandlesMissingBodyField() { ByteArrayOutputStream result = createOutputStream("{\"statusCode\": 200}"); String[] capturedBody = {"NOT_CALLED"}; - AgentSpan span = - setupMockResponseCallbacks( - null, null, null, body -> capturedBody[0] = String.valueOf(body)); + AgentSpan span = setupMockResponseCallbacks( + null, null, null, body -> capturedBody[0] = String.valueOf(body)); LambdaAppSecHandler.processResponseData(span, result); assertEquals("NOT_CALLED", capturedBody[0]); } @@ -1875,12 +1795,11 @@ void processResponseDataFiresEventsInCorrectOrder() { ByteArrayOutputStream result = createOutputStream(json); List order = new ArrayList<>(); - AgentSpan span = - setupMockResponseCallbacks( - status -> order.add("responseStarted"), - (name, value) -> order.add("responseHeader"), - () -> order.add("responseHeaderDone"), - body -> order.add("responseBody")); + AgentSpan span = setupMockResponseCallbacks( + status -> order.add("responseStarted"), + (name, value) -> order.add("responseHeader"), + () -> order.add("responseHeaderDone"), + body -> order.add("responseBody")); LambdaAppSecHandler.processResponseData(span, result); @@ -1898,9 +1817,8 @@ void processResponseDataHandlesInvalidBase64ResponseBodyGracefully() { "{\"statusCode\": 200, \"body\": \"not-valid-base64!!!\", \"isBase64Encoded\": true}"; ByteArrayOutputStream result = createOutputStream(json); String[] capturedBody = {"NOT_CALLED"}; - AgentSpan span = - setupMockResponseCallbacks( - null, null, null, body -> capturedBody[0] = String.valueOf(body)); + AgentSpan span = setupMockResponseCallbacks( + null, null, null, body -> capturedBody[0] = String.valueOf(body)); LambdaAppSecHandler.processResponseData(span, result); assertEquals("NOT_CALLED", capturedBody[0]); } @@ -1992,9 +1910,8 @@ void processResponseDataSkipsResponseStartedWhenCallbackIsNull() { ByteArrayOutputStream result = createOutputStream(json); Map capturedHeaders = new HashMap<>(); boolean[] headerDoneCalled = {false}; - AgentSpan span = - setupMockResponseCallbacks( - null, capturedHeaders::put, () -> headerDoneCalled[0] = true, null); + AgentSpan span = setupMockResponseCallbacks( + null, capturedHeaders::put, () -> headerDoneCalled[0] = true, null); assertDoesNotThrow(() -> LambdaAppSecHandler.processResponseData(span, result)); assertTrue(headerDoneCalled[0]); } @@ -2006,9 +1923,8 @@ void processResponseDataSkipsResponseHeaderWhenCallbackIsNull() { ByteArrayOutputStream result = createOutputStream(json); Integer[] capturedStatus = {null}; boolean[] headerDoneCalled = {false}; - AgentSpan span = - setupMockResponseCallbacks( - status -> capturedStatus[0] = status, null, () -> headerDoneCalled[0] = true, null); + AgentSpan span = setupMockResponseCallbacks( + status -> capturedStatus[0] = status, null, () -> headerDoneCalled[0] = true, null); assertDoesNotThrow(() -> LambdaAppSecHandler.processResponseData(span, result)); assertEquals(200, capturedStatus[0]); assertTrue(headerDoneCalled[0]); @@ -2040,15 +1956,13 @@ void extractResponseDataReturnsNullForEmptyString() { @Test void appliesHttpTagsForRestApiEvent() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\":" - + " \"GET\", \"queryStringParameters\": {\"q\": \"hello\"}, \"headers\":" - + " {\"Host\": \"api.example.com\", \"User-Agent\": \"curl/8.1\"," - + " \"X-Forwarded-Proto\": \"https\", \"X-Forwarded-Port\": \"443\"}," - + " \"requestContext\": {\"httpMethod\": \"GET\", \"domainName\":" - + " \"api.example.com\"}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\":" + + " \"GET\", \"queryStringParameters\": {\"q\": \"hello\"}, \"headers\":" + + " {\"Host\": \"api.example.com\", \"User-Agent\": \"curl/8.1\"," + + " \"X-Forwarded-Proto\": \"https\", \"X-Forwarded-Port\": \"443\"}," + + " \"requestContext\": {\"httpMethod\": \"GET\", \"domainName\":" + + " \"api.example.com\"}}")); Map tags = tagsOf(context); assertEquals("GET", tags.get(Tags.HTTP_METHOD)); @@ -2062,13 +1976,11 @@ void appliesHttpTagsForRestApiEvent() { @Test void appliesHttpTagsWithForwardedSchemeAndPort() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"headers\": {\"host\": \"api.example.com\", \"x-forwarded-proto\": \"http\"," - + " \"x-forwarded-port\": \"8080\"}, \"requestContext\": {\"domainName\":" - + " \"api.example.com\", \"routeKey\": \"POST /orders\", \"http\":" - + " {\"method\": \"POST\", \"path\": \"/orders\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart(createInputStream( + "{\"headers\": {\"host\": \"api.example.com\", \"x-forwarded-proto\": \"http\"," + + " \"x-forwarded-port\": \"8080\"}, \"requestContext\": {\"domainName\":" + + " \"api.example.com\", \"routeKey\": \"POST /orders\", \"http\":" + + " {\"method\": \"POST\", \"path\": \"/orders\"}}}")); Map tags = tagsOf(context); assertEquals("POST", tags.get(Tags.HTTP_METHOD)); @@ -2080,12 +1992,10 @@ void appliesHttpTagsWithForwardedSchemeAndPort() { @Test void omitsDefaultPortForForwardedHttpScheme() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb.example.com\", \"x-forwarded-proto\": \"http\"}, \"requestContext\":" - + " {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb.example.com\", \"x-forwarded-proto\": \"http\"}, \"requestContext\":" + + " {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); // No x-forwarded-port: the default must follow the scheme, or ":443" leaks into the URL assertEquals("http://lb.example.com/alb", tagsOf(context).get(Tags.HTTP_URL)); @@ -2094,13 +2004,11 @@ void omitsDefaultPortForForwardedHttpScheme() { @Test void ignoresEmptyForwardedPort() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb.example.com\", \"x-forwarded-proto\": \"http\"," - + " \"x-forwarded-port\": \"\"}, \"requestContext\": {\"elb\":" - + " {\"targetGroupArn\": \"arn\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb.example.com\", \"x-forwarded-proto\": \"http\"," + + " \"x-forwarded-port\": \"\"}, \"requestContext\": {\"elb\":" + + " {\"targetGroupArn\": \"arn\"}}}")); // An empty header value takes the same path as a missing one rather than reaching parseInt assertEquals("http://lb.example.com/alb", tagsOf(context).get(Tags.HTTP_URL)); @@ -2109,12 +2017,10 @@ void ignoresEmptyForwardedPort() { @Test void normalisesForwardedSchemeCasing() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb.example.com\", \"x-forwarded-proto\": \"HTTP\"}, \"requestContext\":" - + " {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb.example.com\", \"x-forwarded-proto\": \"HTTP\"}, \"requestContext\":" + + " {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); // Lowercased before use, or the port default and URIUtils.buildURL both miss and ":443" leaks assertEquals("http://lb.example.com/alb", tagsOf(context).get(Tags.HTTP_URL)); @@ -2123,12 +2029,10 @@ void normalisesForwardedSchemeCasing() { @Test void fallsBackToHttpsForUnrecognisedForwardedScheme() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb.example.com\", \"x-forwarded-proto\": \"https, http\"}," - + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb.example.com\", \"x-forwarded-proto\": \"https, http\"}," + + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); // Lambda comma-joins duplicate request headers, so a client-supplied X-Forwarded-Proto arrives // appended to the real one: taken verbatim it would yield "https, http://lb.example.com/alb" @@ -2138,13 +2042,11 @@ void fallsBackToHttpsForUnrecognisedForwardedScheme() { @Test void keepsRepeatedQueryKeysFromTheV2RawQueryString() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"rawPath\": \"/orders\", \"rawQueryString\": \"a=1&a=2\"," - + " \"queryStringParameters\": {\"a\": \"1,2\"}, \"requestContext\":" - + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," - + " \"path\": \"/orders\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"rawPath\": \"/orders\", \"rawQueryString\": \"a=1&a=2\"," + + " \"queryStringParameters\": {\"a\": \"1,2\"}, \"requestContext\":" + + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," + + " \"path\": \"/orders\"}}}")); // API Gateway comma-joins repeats into queryStringParameters, so rebuilding from that map // would report a=1%2C2 @@ -2154,13 +2056,11 @@ void keepsRepeatedQueryKeysFromTheV2RawQueryString() { @Test void keepsRepeatedQueryKeysFromTheV1MultiValueParameters() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"path\": \"/orders\", \"queryStringParameters\": {\"a\": \"2\"}," - + " \"multiValueQueryStringParameters\": {\"a\": [\"1\", \"2\"]}," - + " \"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"r-1\"," - + " \"domainName\": \"api.example.com\"}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"path\": \"/orders\", \"queryStringParameters\": {\"a\": \"2\"}," + + " \"multiValueQueryStringParameters\": {\"a\": [\"1\", \"2\"]}," + + " \"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"r-1\"," + + " \"domainName\": \"api.example.com\"}}")); // REST APIs keep only the last value in queryStringParameters, unlike v2 which comma-joins assertEquals("a=1&a=2", tagsOf(context).get(DDTags.HTTP_QUERY)); @@ -2169,12 +2069,10 @@ void keepsRepeatedQueryKeysFromTheV1MultiValueParameters() { @Test void keepsPercentEncodingFromTheV2RawPath() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"rawPath\": \"/orders/a%20b\", \"rawQueryString\": \"\", \"requestContext\":" - + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," - + " \"path\": \"/orders/a b\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart(createInputStream( + "{\"rawPath\": \"/orders/a%20b\", \"rawQueryString\": \"\", \"requestContext\":" + + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," + + " \"path\": \"/orders/a b\"}}}")); Map tags = tagsOf(context); assertEquals("https://api.example.com/orders/a%20b", tags.get(Tags.HTTP_URL)); @@ -2185,13 +2083,11 @@ void keepsPercentEncodingFromTheV2RawPath() { @Test void doesNotDuplicateAPortAlreadyInTheHostHeader() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb.example.com:8080\", \"x-forwarded-proto\": \"http\"," - + " \"x-forwarded-port\": \"8080\"}, \"requestContext\": {\"elb\":" - + " {\"targetGroupArn\": \"arn\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb.example.com:8080\", \"x-forwarded-proto\": \"http\"," + + " \"x-forwarded-port\": \"8080\"}, \"requestContext\": {\"elb\":" + + " {\"targetGroupArn\": \"arn\"}}}")); // An ALB listener off 80/443 puts the port in Host as well, and buildURL appends it again assertEquals("http://lb.example.com:8080/alb", tagsOf(context).get(Tags.HTTP_URL)); @@ -2200,13 +2096,11 @@ void doesNotDuplicateAPortAlreadyInTheHostHeader() { @Test void doesNotDuplicateAPortAlreadyInABracketedIpv6Host() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"[2001:db8::1]:8080\", \"x-forwarded-proto\": \"http\"," - + " \"x-forwarded-port\": \"8080\"}, \"requestContext\": {\"elb\":" - + " {\"targetGroupArn\": \"arn\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"[2001:db8::1]:8080\", \"x-forwarded-proto\": \"http\"," + + " \"x-forwarded-port\": \"8080\"}, \"requestContext\": {\"elb\":" + + " {\"targetGroupArn\": \"arn\"}}}")); assertEquals("http://[2001:db8::1]:8080/alb", tagsOf(context).get(Tags.HTTP_URL)); } @@ -2214,13 +2108,11 @@ void doesNotDuplicateAPortAlreadyInABracketedIpv6Host() { @Test void hostnameTagPrefersForwardedHostOverUrlHost() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"headers\": {\"host\": \"api.example.com\", \"x-forwarded-host\":" - + " \"public.example.com\"}, \"requestContext\": {\"domainName\":" - + " \"api.example.com\", \"http\": {\"method\": \"GET\", \"path\":" - + " \"/orders\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"headers\": {\"host\": \"api.example.com\", \"x-forwarded-host\":" + + " \"public.example.com\"}, \"requestContext\": {\"domainName\":" + + " \"api.example.com\", \"http\": {\"method\": \"GET\", \"path\":" + + " \"/orders\"}}}")); Map tags = tagsOf(context); assertEquals("https://api.example.com/orders", tags.get(Tags.HTTP_URL)); @@ -2231,13 +2123,11 @@ void hostnameTagPrefersForwardedHostOverUrlHost() { void resolvesHeadersRegardlessOfEventCasing() { setupMockCallbacks(new Callbacks()); // API Gateway v1 capitalises header names where v2 and ALB send them lowercase - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," - + " \"headers\": {\"Host\": \"api.example.com\", \"User-Agent\":" - + " \"curl/8.1\", \"X-Forwarded-Proto\": \"http\", \"X-Forwarded-Host\":" - + " \"public.example.com\"}, \"requestContext\": {\"httpMethod\": \"GET\"}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart(createInputStream( + "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," + + " \"headers\": {\"Host\": \"api.example.com\", \"User-Agent\":" + + " \"curl/8.1\", \"X-Forwarded-Proto\": \"http\", \"X-Forwarded-Host\":" + + " \"public.example.com\"}, \"requestContext\": {\"httpMethod\": \"GET\"}}")); Map tags = tagsOf(context); assertEquals("http://api.example.com/users/42", tags.get(Tags.HTTP_URL)); @@ -2249,12 +2139,10 @@ void resolvesHeadersRegardlessOfEventCasing() { void omitsMethodTagWhenTheEventCarriesNoMethod() { setupMockCallbacks(new Callbacks()); // Typed as a REST event by requestContext.requestId alone, so no httpMethod is available - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"path\": \"/users/42\", \"headers\": {\"host\": \"api.example.com\"}," - + " \"requestContext\": {\"requestId\": \"req-1\", \"domainName\":" - + " \"api.example.com\"}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"path\": \"/users/42\", \"headers\": {\"host\": \"api.example.com\"}," + + " \"requestContext\": {\"requestId\": \"req-1\", \"domainName\":" + + " \"api.example.com\"}}")); Map tags = tagsOf(context); assertNull(tags.get(Tags.HTTP_METHOD)); @@ -2266,11 +2154,9 @@ void omitsMethodTagWhenTheEventCarriesNoMethod() { @Test void omitsMethodTagForWebSocketEvent() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"requestContext\": {\"connectionId\": \"c1\", \"eventType\": \"MESSAGE\"," - + " \"routeKey\": \"sendMessage\", \"domainName\": \"ws.example.com\"}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart(createInputStream( + "{\"requestContext\": {\"connectionId\": \"c1\", \"eventType\": \"MESSAGE\"," + + " \"routeKey\": \"sendMessage\", \"domainName\": \"ws.example.com\"}}")); Map tags = tagsOf(context); assertNull(tags.get(Tags.HTTP_METHOD)); @@ -2281,12 +2167,10 @@ void omitsMethodTagForWebSocketEvent() { @Test void omitsRouteTagForAlbEvent() { setupMockCallbacks(new Callbacks()); - AgentSpanContext context = - LambdaAppSecHandler.processRequestStart( - createInputStream( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb-123.eu-west-1.elb.amazonaws.com\", \"user-agent\": \"alb-agent\"}," - + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); + AgentSpanContext context = LambdaAppSecHandler.processRequestStart( + createInputStream("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb-123.eu-west-1.elb.amazonaws.com\", \"user-agent\": \"alb-agent\"}," + + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}")); Map tags = tagsOf(context); assertNull(tags.get(Tags.HTTP_ROUTE)); @@ -2419,11 +2303,10 @@ private void setupMockCallbacks(Callbacks callbacks) { if (callbacks.onMethodUri != null) { methodUriCallback = mock(TriFunction.class); BiConsumer capture = callbacks.onMethodUri; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1), inv.getArgument(2)); - return Flow.ResultFlow.empty(); - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1), inv.getArgument(2)); + return Flow.ResultFlow.empty(); + }) .when(methodUriCallback) .apply(any(), anyString(), any(URIDataAdapter.class)); } @@ -2432,11 +2315,10 @@ private void setupMockCallbacks(Callbacks callbacks) { if (callbacks.onHeader != null) { headerCallback = mock(TriConsumer.class); BiConsumer capture = callbacks.onHeader; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1), inv.getArgument(2)); - return null; - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1), inv.getArgument(2)); + return null; + }) .when(headerCallback) .accept(any(), anyString(), anyString()); } @@ -2445,11 +2327,10 @@ private void setupMockCallbacks(Callbacks callbacks) { if (callbacks.onSocketAddress != null) { socketAddressCallback = mock(TriFunction.class); BiConsumer capture = callbacks.onSocketAddress; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1), (Integer) inv.getArgument(2)); - return Flow.ResultFlow.empty(); - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1), (Integer) inv.getArgument(2)); + return Flow.ResultFlow.empty(); + }) .when(socketAddressCallback) .apply(any(), anyString(), anyInt()); } @@ -2461,11 +2342,10 @@ private void setupMockCallbacks(Callbacks callbacks) { if (callbacks.onPathParams != null) { pathParamsCallback = mock(BiFunction.class); Consumer> capture = callbacks.onPathParams; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1)); - return Flow.ResultFlow.empty(); - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1)); + return Flow.ResultFlow.empty(); + }) .when(pathParamsCallback) .apply(any(), any(Map.class)); } @@ -2474,11 +2354,10 @@ private void setupMockCallbacks(Callbacks callbacks) { if (callbacks.onBody != null) { bodyCallback = mock(BiFunction.class); Consumer capture = callbacks.onBody; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1)); - return Flow.ResultFlow.empty(); - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1)); + return Flow.ResultFlow.empty(); + }) .when(bodyCallback) .apply(any(), any()); } @@ -2526,11 +2405,10 @@ private AgentSpan setupMockResponseCallbacks( if (onResponseStarted != null) { responseStartedCb = mock(BiFunction.class); Consumer capture = onResponseStarted; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1)); - return new Flow.ResultFlow<>(null); - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1)); + return new Flow.ResultFlow<>(null); + }) .when(responseStartedCb) .apply(any(RequestContext.class), anyInt()); } @@ -2539,11 +2417,10 @@ private AgentSpan setupMockResponseCallbacks( if (onResponseHeader != null) { responseHeaderCb = mock(TriConsumer.class); BiConsumer capture = onResponseHeader; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1), inv.getArgument(2)); - return null; - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1), inv.getArgument(2)); + return null; + }) .when(responseHeaderCb) .accept(any(), anyString(), anyString()); } @@ -2551,11 +2428,10 @@ private AgentSpan setupMockResponseCallbacks( Function> responseHeaderDoneCb = mock(Function.class); if (onResponseHeaderDone != null) { Runnable capture = onResponseHeaderDone; - doAnswer( - inv -> { - capture.run(); - return new Flow.ResultFlow<>(null); - }) + doAnswer(inv -> { + capture.run(); + return new Flow.ResultFlow<>(null); + }) .when(responseHeaderDoneCb) .apply(any(RequestContext.class)); } else { @@ -2566,11 +2442,10 @@ private AgentSpan setupMockResponseCallbacks( if (onResponseBody != null) { responseBodyCb = mock(BiFunction.class); Consumer capture = onResponseBody; - doAnswer( - inv -> { - capture.accept(inv.getArgument(1)); - return new Flow.ResultFlow<>(null); - }) + doAnswer(inv -> { + capture.accept(inv.getArgument(1)); + return new Flow.ResultFlow<>(null); + }) .when(responseBodyCb) .apply(any(RequestContext.class), any()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaEventParserTest.java b/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaEventParserTest.java index 7811ab23c97..9356a65e338 100644 --- a/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaEventParserTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaEventParserTest.java @@ -25,12 +25,11 @@ class LambdaEventParserTest { @Test void restApiPrefersDomainNameOverHostHeader() { - LambdaRequestData data = - parseEvent( - "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," - + " \"headers\": {\"Host\": \"header.example.com\"}," - + " \"requestContext\": {\"httpMethod\": \"GET\", \"domainName\":" - + " \"context.example.com\"}}"); + LambdaRequestData data = parseEvent( + "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," + + " \"headers\": {\"Host\": \"header.example.com\"}," + + " \"requestContext\": {\"httpMethod\": \"GET\", \"domainName\":" + + " \"context.example.com\"}}"); assertEquals(LambdaTriggerType.API_GATEWAY_V1_REST, data.triggerType); assertEquals("context.example.com", data.host); @@ -39,20 +38,18 @@ void restApiPrefersDomainNameOverHostHeader() { @Test void restApiFallsBackToCapitalisedHostHeader() { LambdaRequestData data = - parseEvent( - "{\"path\": \"/users/42\", \"httpMethod\": \"GET\", \"headers\": {\"Host\":" - + " \"abc123.execute-api.eu-west-1.amazonaws.com\"}, \"requestContext\":" - + " {\"httpMethod\": \"GET\"}}"); + parseEvent("{\"path\": \"/users/42\", \"httpMethod\": \"GET\", \"headers\": {\"Host\":" + + " \"abc123.execute-api.eu-west-1.amazonaws.com\"}, \"requestContext\":" + + " {\"httpMethod\": \"GET\"}}"); assertEquals("abc123.execute-api.eu-west-1.amazonaws.com", data.host); } @Test void restApiRouteIsTheResource() { - LambdaRequestData data = - parseEvent( - "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," - + " \"requestContext\": {\"httpMethod\": \"GET\"}}"); + LambdaRequestData data = parseEvent( + "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," + + " \"requestContext\": {\"httpMethod\": \"GET\"}}"); assertEquals("/users/{id}", data.route); } @@ -60,9 +57,8 @@ void restApiRouteIsTheResource() { @Test void restApiHasNoRouteWhenResourceIsMissing() { LambdaRequestData data = - parseEvent( - "{\"path\": \"/users/42\", \"httpMethod\": \"GET\", \"requestContext\":" - + " {\"httpMethod\": \"GET\"}}"); + parseEvent("{\"path\": \"/users/42\", \"httpMethod\": \"GET\", \"requestContext\":" + + " {\"httpMethod\": \"GET\"}}"); assertNull(data.route); } @@ -73,11 +69,10 @@ void restApiHasNoRouteWhenResourceIsMissing() { @Test void httpApiStripsTheMethodFromTheRouteKey() { - LambdaRequestData data = - parseEvent( - "{\"headers\": {\"host\": \"api.example.com\"}, \"requestContext\": {\"domainName\":" - + " \"api.example.com\", \"routeKey\": \"GET /users/{id}\", \"http\": {\"method\":" - + " \"GET\", \"path\": \"/users/42\"}}}"); + LambdaRequestData data = parseEvent( + "{\"headers\": {\"host\": \"api.example.com\"}, \"requestContext\": {\"domainName\":" + + " \"api.example.com\", \"routeKey\": \"GET /users/{id}\", \"http\": {\"method\":" + + " \"GET\", \"path\": \"/users/42\"}}}"); assertEquals(LambdaTriggerType.API_GATEWAY_V2_HTTP, data.triggerType); assertEquals("api.example.com", data.host); @@ -87,20 +82,17 @@ void httpApiStripsTheMethodFromTheRouteKey() { @Test void httpApiDropsTheDefaultRouteKey() { LambdaRequestData data = - parseEvent( - "{\"requestContext\": {\"domainName\": \"api.example.com\", \"routeKey\":" - + " \"$default\", \"http\": {\"method\": \"GET\", \"path\": \"/\"}}}"); + parseEvent("{\"requestContext\": {\"domainName\": \"api.example.com\", \"routeKey\":" + + " \"$default\", \"http\": {\"method\": \"GET\", \"path\": \"/\"}}}"); assertNull(data.route); } @Test void functionUrlHasNoRouteAndTakesHostFromDomainName() { - LambdaRequestData data = - parseEvent( - "{\"requestContext\": {\"domainName\":" - + " \"abc.lambda-url.eu-west-1.on.aws\", \"routeKey\": \"$default\", \"http\":" - + " {\"method\": \"POST\", \"path\": \"/\"}}}"); + LambdaRequestData data = parseEvent("{\"requestContext\": {\"domainName\":" + + " \"abc.lambda-url.eu-west-1.on.aws\", \"routeKey\": \"$default\", \"http\":" + + " {\"method\": \"POST\", \"path\": \"/\"}}}"); assertEquals(LambdaTriggerType.LAMBDA_URL, data.triggerType); assertEquals("abc.lambda-url.eu-west-1.on.aws", data.host); @@ -109,11 +101,10 @@ void functionUrlHasNoRouteAndTakesHostFromDomainName() { @Test void httpApiExposesTheRawRequestLine() { - LambdaRequestData data = - parseEvent( - "{\"rawPath\": \"/users/42\", \"rawQueryString\": \"a=1&a=2\", \"requestContext\":" - + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," - + " \"path\": \"/users/42\"}}}"); + LambdaRequestData data = parseEvent( + "{\"rawPath\": \"/users/42\", \"rawQueryString\": \"a=1&a=2\", \"requestContext\":" + + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," + + " \"path\": \"/users/42\"}}}"); assertEquals("/users/42?a=1&a=2", data.rawUri); } @@ -121,10 +112,9 @@ void httpApiExposesTheRawRequestLine() { @Test void restApiPrefersTheMultiValueQueryParameters() { LambdaRequestData data = - parseEvent( - "{\"path\": \"/users\", \"queryStringParameters\": {\"a\": \"2\"}," - + " \"multiValueQueryStringParameters\": {\"a\": [\"1\", \"2\"]}," - + " \"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"r-1\"}}"); + parseEvent("{\"path\": \"/users\", \"queryStringParameters\": {\"a\": \"2\"}," + + " \"multiValueQueryStringParameters\": {\"a\": [\"1\", \"2\"]}," + + " \"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"r-1\"}}"); assertEquals(singletonMap("a", asList("1", "2")), data.queryParameters); } @@ -132,9 +122,8 @@ void restApiPrefersTheMultiValueQueryParameters() { @Test void restApiFallsBackToTheSingleValueQueryParameters() { LambdaRequestData data = - parseEvent( - "{\"path\": \"/users\", \"queryStringParameters\": {\"a\": \"2\"}," - + " \"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"r-1\"}}"); + parseEvent("{\"path\": \"/users\", \"queryStringParameters\": {\"a\": \"2\"}," + + " \"requestContext\": {\"httpMethod\": \"GET\", \"requestId\": \"r-1\"}}"); assertEquals(singletonMap("a", singletonList("2")), data.queryParameters); } @@ -143,9 +132,8 @@ void restApiFallsBackToTheSingleValueQueryParameters() { void restApiExposesNoRawRequestLine() { // Only v2 payloads carry rawPath/rawQueryString; v1 has to be rebuilt from its parameter map LambdaRequestData data = - parseEvent( - "{\"path\": \"/users/42\", \"httpMethod\": \"GET\", \"requestContext\":" - + " {\"httpMethod\": \"GET\"}}"); + parseEvent("{\"path\": \"/users/42\", \"httpMethod\": \"GET\", \"requestContext\":" + + " {\"httpMethod\": \"GET\"}}"); assertNull(data.rawUri); } @@ -157,9 +145,8 @@ void restApiExposesNoRawRequestLine() { @Test void webSocketRouteIsTheRawRouteKey() { LambdaRequestData data = - parseEvent( - "{\"requestContext\": {\"connectionId\": \"c1\", \"eventType\": \"CONNECT\"," - + " \"routeKey\": \"$connect\", \"domainName\": \"ws.example.com\"}}"); + parseEvent("{\"requestContext\": {\"connectionId\": \"c1\", \"eventType\": \"CONNECT\"," + + " \"routeKey\": \"$connect\", \"domainName\": \"ws.example.com\"}}"); assertEquals(LambdaTriggerType.API_GATEWAY_V2_WEBSOCKET, data.triggerType); assertEquals("ws.example.com", data.host); @@ -173,10 +160,9 @@ void webSocketRouteIsTheRawRouteKey() { @Test void albTakesHostFromHeaderAndHasNoRoute() { LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb-123.eu-west-1.elb.amazonaws.com\"}, \"requestContext\": {\"elb\":" - + " {\"targetGroupArn\": \"arn\"}}}"); + parseEvent("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb-123.eu-west-1.elb.amazonaws.com\"}, \"requestContext\": {\"elb\":" + + " {\"targetGroupArn\": \"arn\"}}}"); assertEquals(LambdaTriggerType.ALB, data.triggerType); assertEquals("lb-123.eu-west-1.elb.amazonaws.com", data.host); @@ -186,10 +172,9 @@ void albTakesHostFromHeaderAndHasNoRoute() { @Test void albStripsThePortFromTheHostHeader() { LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"lb.example.com:8080\"}, \"requestContext\": {\"elb\": {\"targetGroupArn\":" - + " \"arn\"}}}"); + parseEvent("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"lb.example.com:8080\"}, \"requestContext\": {\"elb\": {\"targetGroupArn\":" + + " \"arn\"}}}"); // The port is carried separately, by x-forwarded-port assertEquals("lb.example.com", data.host); @@ -197,10 +182,9 @@ void albStripsThePortFromTheHostHeader() { @Test void albKeepsAnIpv6HostIntact() { - LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\": \"[::1]\"}," - + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); + LambdaRequestData data = parseEvent( + "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\": \"[::1]\"}," + + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); assertEquals("[::1]", data.host); } @@ -208,10 +192,9 @@ void albKeepsAnIpv6HostIntact() { @Test void albStripsThePortFromABracketedIpv6Host() { LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" - + " \"[2001:db8::1]:8080\"}, \"requestContext\": {\"elb\": {\"targetGroupArn\":" - + " \"arn\"}}}"); + parseEvent("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"headers\": {\"host\":" + + " \"[2001:db8::1]:8080\"}, \"requestContext\": {\"elb\": {\"targetGroupArn\":" + + " \"arn\"}}}"); assertEquals("[2001:db8::1]", data.host); } @@ -219,10 +202,9 @@ void albStripsThePortFromABracketedIpv6Host() { @Test void albMultiValueTakesHostFromMultiValueHeaders() { LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\": {\"host\":" - + " [\"lb-123.eu-west-1.elb.amazonaws.com\"]}, \"requestContext\": {\"elb\":" - + " {\"targetGroupArn\": \"arn\"}}}"); + parseEvent("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\": {\"host\":" + + " [\"lb-123.eu-west-1.elb.amazonaws.com\"]}, \"requestContext\": {\"elb\":" + + " {\"targetGroupArn\": \"arn\"}}}"); assertEquals(LambdaTriggerType.ALB_MULTI_VALUE, data.triggerType); assertEquals("lb-123.eu-west-1.elb.amazonaws.com", data.host); @@ -231,10 +213,9 @@ void albMultiValueTakesHostFromMultiValueHeaders() { @Test void albMultiValueFallsBackToSingleValueHeaders() { LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\":" - + " \"not-a-map\", \"headers\": {\"host\": \"fallback.example.com\"}," - + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); + parseEvent("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\":" + + " \"not-a-map\", \"headers\": {\"host\": \"fallback.example.com\"}," + + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); assertEquals(LambdaTriggerType.ALB_MULTI_VALUE, data.triggerType); assertEquals("fallback.example.com", data.host); @@ -243,10 +224,9 @@ void albMultiValueFallsBackToSingleValueHeaders() { @Test void albMultiValueFallsBackToSingleValueQueryParameters() { LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\": {\"host\":" - + " [\"lb.example.com\"]}, \"queryStringParameters\": {\"q\": \"hello\"}," - + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); + parseEvent("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\": {\"host\":" + + " [\"lb.example.com\"]}, \"queryStringParameters\": {\"q\": \"hello\"}," + + " \"requestContext\": {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); assertEquals(LambdaTriggerType.ALB_MULTI_VALUE, data.triggerType); assertEquals(singletonList("hello"), data.queryParameters.get("q")); @@ -254,11 +234,10 @@ void albMultiValueFallsBackToSingleValueQueryParameters() { @Test void queryParametersKeepEventOrder() { - LambdaRequestData data = - parseEvent( - "{\"resource\": \"/items\", \"path\": \"/items\", \"queryStringParameters\": {\"z\":" - + " \"1\", \"a\": \"2\", \"m\": \"3\"}, \"requestContext\": {\"httpMethod\":" - + " \"GET\", \"domainName\": \"api.example.com\"}}"); + LambdaRequestData data = parseEvent( + "{\"resource\": \"/items\", \"path\": \"/items\", \"queryStringParameters\": {\"z\":" + + " \"1\", \"a\": \"2\", \"m\": \"3\"}, \"requestContext\": {\"httpMethod\":" + + " \"GET\", \"domainName\": \"api.example.com\"}}"); // Order drives the rebuilt query string, so it must follow the event, not a hash order assertEquals(asList("z", "a", "m"), new ArrayList<>(data.queryParameters.keySet())); @@ -288,11 +267,10 @@ void malformedPayloadReturnsEmpty() { @Test void headerKeysAreLowercasedAtExtraction() { - LambdaRequestData data = - parseEvent( - "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," - + " \"headers\": {\"Host\": \"api.example.com\", \"User-Agent\": \"curl/8.1\"}," - + " \"requestContext\": {\"httpMethod\": \"GET\"}}"); + LambdaRequestData data = parseEvent( + "{\"resource\": \"/users/{id}\", \"path\": \"/users/42\", \"httpMethod\": \"GET\"," + + " \"headers\": {\"Host\": \"api.example.com\", \"User-Agent\": \"curl/8.1\"}," + + " \"requestContext\": {\"httpMethod\": \"GET\"}}"); // findHeader is an exact lookup, so a match proves the keys were lowercased on the way in assertEquals("api.example.com", findHeader(data.headers, "host")); @@ -303,10 +281,9 @@ void headerKeysAreLowercasedAtExtraction() { @Test void albMultiValueHeaderKeysAreLowercasedAtExtraction() { LambdaRequestData data = - parseEvent( - "{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\": {\"Host\":" - + " [\"lb.example.com\"], \"User-Agent\": [\"curl/8.1\"]}, \"requestContext\":" - + " {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); + parseEvent("{\"httpMethod\": \"GET\", \"path\": \"/alb\", \"multiValueHeaders\": {\"Host\":" + + " [\"lb.example.com\"], \"User-Agent\": [\"curl/8.1\"]}, \"requestContext\":" + + " {\"elb\": {\"targetGroupArn\": \"arn\"}}}"); assertEquals("lb.example.com", findHeader(data.headers, "host")); assertEquals("curl/8.1", findHeader(data.headers, "user-agent")); @@ -316,11 +293,10 @@ void albMultiValueHeaderKeysAreLowercasedAtExtraction() { void capitalisedCookieHeaderIsMergedWithTheV2CookiesArray() { // The merge in extractHeadersWithCookies looks up "cookie", which only matches once keys are // lowercased at extraction — an API Gateway v1 style "Cookie" used to be left as a second entry - LambdaRequestData data = - parseEvent( - "{\"headers\": {\"Cookie\": \"a=1\"}, \"cookies\": [\"b=2\"], \"requestContext\":" - + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," - + " \"path\": \"/\"}}}"); + LambdaRequestData data = parseEvent( + "{\"headers\": {\"Cookie\": \"a=1\"}, \"cookies\": [\"b=2\"], \"requestContext\":" + + " {\"domainName\": \"api.example.com\", \"http\": {\"method\": \"GET\"," + + " \"path\": \"/\"}}}"); assertEquals("a=1; b=2", findHeader(data.headers, "cookie")); assertEquals(1, data.headers.size()); diff --git a/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaHandlerTest.java b/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaHandlerTest.java index 6eeefd1d19a..b549981ecac 100644 --- a/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaHandlerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/lambda/LambdaHandlerTest.java @@ -47,19 +47,13 @@ public String toString() { void testStartInvocationSuccess() { CoreTracer ct = tracerBuilder().build(); - JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - "/lambda/start-invocation", - api -> - api.getResponse() - .status(200) - .addHeader("x-datadog-trace-id", "1234") - .addHeader("x-datadog-sampling-priority", "2") - .send()))); + JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.post( + "/lambda/start-invocation", + api -> api.getResponse() + .status(200) + .addHeader("x-datadog-trace-id", "1234") + .addHeader("x-datadog-sampling-priority", "2") + .send()))); LambdaHandler.setExtensionBaseUrl(server.getAddress().toString()); AgentSpanContext objTest = @@ -78,20 +72,14 @@ void testStartInvocationSuccess() { void testStartInvocationWith128BitTraceId() { CoreTracer ct = tracerBuilder().build(); - JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - "/lambda/start-invocation", - api -> - api.getResponse() - .status(200) - .addHeader("x-datadog-trace-id", "5744042798732701615") - .addHeader("x-datadog-sampling-priority", "2") - .addHeader("x-datadog-tags", "_dd.p.tid=1914fe7789eb32be") - .send()))); + JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.post( + "/lambda/start-invocation", + api -> api.getResponse() + .status(200) + .addHeader("x-datadog-trace-id", "5744042798732701615") + .addHeader("x-datadog-sampling-priority", "2") + .addHeader("x-datadog-tags", "_dd.p.tid=1914fe7789eb32be") + .send()))); LambdaHandler.setExtensionBaseUrl(server.getAddress().toString()); AgentSpanContext objTest = @@ -110,14 +98,8 @@ void testStartInvocationWith128BitTraceId() { void testStartInvocationFailure() { CoreTracer ct = tracerBuilder().build(); - JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - "/lambda/start-invocation", - api -> api.getResponse().status(500).send()))); + JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> + h.post("/lambda/start-invocation", api -> api.getResponse().status(500).send()))); LambdaHandler.setExtensionBaseUrl(server.getAddress().toString()); AgentSpanContext objTest = @@ -146,14 +128,8 @@ void testEndInvocationSuccess( Object lambdaResult, boolean boolValue, String lambdaReqIdHeaderValue) { - JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - "/lambda/end-invocation", - api -> api.getResponse().status(200).send()))); + JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> + h.post("/lambda/end-invocation", api -> api.getResponse().status(200).send()))); LambdaHandler.setExtensionBaseUrl(server.getAddress().toString()); DDSpan span = mock(DDSpan.class); @@ -187,14 +163,8 @@ void testEndInvocationFailure( Object lambdaResult, boolean boolValue, String lambdaReqIdHeaderValue) { - JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - "/lambda/end-invocation", - api -> api.getResponse().status(500).send()))); + JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> + h.post("/lambda/end-invocation", api -> api.getResponse().status(500).send()))); LambdaHandler.setExtensionBaseUrl(server.getAddress().toString()); DDSpan span = mock(DDSpan.class); @@ -215,14 +185,8 @@ void testEndInvocationFailure( @Test void testEndInvocationSuccessWithErrorMetadata() { - JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.post( - "/lambda/end-invocation", - api -> api.getResponse().status(200).send()))); + JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> + h.post("/lambda/end-invocation", api -> api.getResponse().status(200).send()))); LambdaHandler.setExtensionBaseUrl(server.getAddress().toString()); DDSpan span = mock(DDSpan.class); diff --git a/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapterTest.java b/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapterTest.java index 7839cb17d01..634f59d4671 100644 --- a/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapterTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanDataAdapterTest.java @@ -30,9 +30,8 @@ void convertsAndAppliesEmbeddingDocumentsAndValueOutput() { CoreSpan span = mock(CoreSpan.class); when(span.getTag(SPAN_KIND_TAG)).thenReturn(Tags.LLMOBS_EMBEDDING_SPAN_KIND); when(span.getTag(INPUT_TAG)) - .thenReturn( - Collections.singletonList( - LLMObs.Document.from("original document", "source.txt", "doc-123", 0.75))); + .thenReturn(Collections.singletonList( + LLMObs.Document.from("original document", "source.txt", "doc-123", 0.75))); when(span.getTag(OUTPUT_TAG)).thenReturn("original output"); LLMObsSpanDataAdapter adapter = new LLMObsSpanDataAdapter(span); @@ -61,9 +60,8 @@ void convertsAndAppliesRetrievalOutputDocuments() { CoreSpan span = mock(CoreSpan.class); when(span.getTag(SPAN_KIND_TAG)).thenReturn(Tags.LLMOBS_RETRIEVAL_SPAN_KIND); when(span.getTag(OUTPUT_TAG)) - .thenReturn( - Collections.singletonList( - LLMObs.Document.from("original document", "result.txt", "doc-456", 0.9))); + .thenReturn(Collections.singletonList( + LLMObs.Document.from("original document", "result.txt", "doc-456", 0.9))); LLMObsSpanDataAdapter adapter = new LLMObsSpanDataAdapter(span); diff --git a/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapperTest.java b/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapperTest.java index 909d94ed526..2bb77ea6e7e 100644 --- a/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapperTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapperTest.java @@ -47,38 +47,34 @@ void testLLMObsSpanMapperSerialization() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); // Create a real LLMObs span using the tracer - AgentSpan llmSpan = - tracer - .buildSpan("datadog", "openai.request") - .withResourceName("createCompletion") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.model_name", "gpt-4") - .withTag("_ml_obs_tag.model_provider", "openai") - .withTag("_ml_obs_metric.input_tokens", 50) - .withTag("_ml_obs_metric.output_tokens", 25) - .withTag("_ml_obs_metric.total_tokens", 75) - .withTag("_ml_obs_tag.session_id", "abc-123-session") - .start(); + AgentSpan llmSpan = tracer + .buildSpan("datadog", "openai.request") + .withResourceName("createCompletion") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.model_name", "gpt-4") + .withTag("_ml_obs_tag.model_provider", "openai") + .withTag("_ml_obs_metric.input_tokens", 50) + .withTag("_ml_obs_metric.output_tokens", 25) + .withTag("_ml_obs_metric.total_tokens", 75) + .withTag("_ml_obs_tag.session_id", "abc-123-session") + .start(); llmSpan.setSpanType(InternalSpanTypes.LLMOBS); Map toolCallArgs = Collections.singletonMap("location", "San Francisco"); LLMObs.ToolCall toolCall = LLMObs.ToolCall.from("get_weather", "function_call", "call_123", toolCallArgs); - LLMObs.ToolResult toolResult = - LLMObs.ToolResult.from( - "get_weather", "function_call_output", "call_123", "{\"temperature\":\"72F\"}"); - List inputMessages = - Arrays.asList( - LLMObs.LLMMessage.from("user", "Hello, what's the weather like?"), - LLMObs.LLMMessage.from( - "assistant", - null, - Collections.singletonList(toolCall), - Collections.singletonList(toolResult))); - List outputMessages = - Collections.singletonList( - LLMObs.LLMMessage.from("assistant", "I'll help you check the weather.")); + LLMObs.ToolResult toolResult = LLMObs.ToolResult.from( + "get_weather", "function_call_output", "call_123", "{\"temperature\":\"72F\"}"); + List inputMessages = Arrays.asList( + LLMObs.LLMMessage.from("user", "Hello, what's the weather like?"), + LLMObs.LLMMessage.from( + "assistant", + null, + Collections.singletonList(toolCall), + Collections.singletonList(toolResult))); + List outputMessages = Collections.singletonList( + LLMObs.LLMMessage.from("assistant", "I'll help you check the weather.")); Map chatTemplateEntry = new LinkedHashMap<>(); chatTemplateEntry.put("role", "user"); @@ -241,12 +237,11 @@ void testLLMObsSpanMapperSerializesPromptWithoutInputMessages() throws Exception prompt.put("template", "Hello {{name}}"); prompt.put("variables", Collections.singletonMap("name", "Sam")); - AgentSpan llmSpan = - tracer - .buildSpan("datadog", "chat-completion") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.input_prompt", prompt) - .start(); + AgentSpan llmSpan = tracer + .buildSpan("datadog", "chat-completion") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.input_prompt", prompt) + .start(); llmSpan.setSpanType(InternalSpanTypes.LLMOBS); llmSpan.finish(); @@ -271,12 +266,11 @@ void testLLMObsSpanMapperPreservesNestedPromptInputCompatibility() throws Except input.put("messages", Collections.singletonList(LLMObs.LLMMessage.from("user", "Hello"))); input.put("prompt", prompt); - AgentSpan llmSpan = - tracer - .buildSpan("datadog", "chat-completion") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.input", input) - .start(); + AgentSpan llmSpan = tracer + .buildSpan("datadog", "chat-completion") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.input", input) + .start(); llmSpan.setSpanType(InternalSpanTypes.LLMOBS); llmSpan.finish(); @@ -295,21 +289,19 @@ void testLLMObsSpanMapperWritesNoSpansWhenNoneAreLLMObsSpans() { LLMObsSpanMapper mapper = new LLMObsSpanMapper(); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan regularSpan1 = - tracer - .buildSpan("datadog", "http.request") - .withResourceName("GET /api/users") - .withTag("http.method", "GET") - .withTag("http.url", "https://example.com/api/users") - .start(); + AgentSpan regularSpan1 = tracer + .buildSpan("datadog", "http.request") + .withResourceName("GET /api/users") + .withTag("http.method", "GET") + .withTag("http.url", "https://example.com/api/users") + .start(); regularSpan1.finish(); - AgentSpan regularSpan2 = - tracer - .buildSpan("datadog", "database.query") - .withResourceName("SELECT * FROM users") - .withTag("db.type", "postgresql") - .start(); + AgentSpan regularSpan2 = tracer + .buildSpan("datadog", "database.query") + .withResourceName("SELECT * FROM users") + .withTag("db.type", "postgresql") + .start(); regularSpan2.finish(); List trace = Arrays.asList((DDSpan) regularSpan1, (DDSpan) regularSpan2); @@ -331,34 +323,31 @@ void testConsecutivePackerFormatCallsAccumulateSpansFromMultipleTraces() throws CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); // First trace with 2 LLMObs spans - AgentSpan llmSpan1 = - tracer - .buildSpan("datadog", "chat-completion-1") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.model_name", "gpt-4") - .withTag("_ml_obs_tag.model_provider", "openai") - .start(); + AgentSpan llmSpan1 = tracer + .buildSpan("datadog", "chat-completion-1") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.model_name", "gpt-4") + .withTag("_ml_obs_tag.model_provider", "openai") + .start(); llmSpan1.setSpanType(InternalSpanTypes.LLMOBS); llmSpan1.finish(); - AgentSpan llmSpan2 = - tracer - .buildSpan("datadog", "chat-completion-2") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.model_name", "gpt-3.5") - .withTag("_ml_obs_tag.model_provider", "openai") - .start(); + AgentSpan llmSpan2 = tracer + .buildSpan("datadog", "chat-completion-2") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.model_name", "gpt-3.5") + .withTag("_ml_obs_tag.model_provider", "openai") + .start(); llmSpan2.setSpanType(InternalSpanTypes.LLMOBS); llmSpan2.finish(); // Second trace with 1 LLMObs span - AgentSpan llmSpan3 = - tracer - .buildSpan("datadog", "chat-completion-3") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.model_name", "claude-3") - .withTag("_ml_obs_tag.model_provider", "anthropic") - .start(); + AgentSpan llmSpan3 = tracer + .buildSpan("datadog", "chat-completion-3") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.model_name", "claude-3") + .withTag("_ml_obs_tag.model_provider", "anthropic") + .start(); llmSpan3.setSpanType(InternalSpanTypes.LLMOBS); llmSpan3.finish(); @@ -408,14 +397,13 @@ void testLLMObsSpanMapperOmitsTopLevelSessionIdWhenNotSet() throws Exception { LLMObsSpanMapper mapper = new LLMObsSpanMapper(); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan llmSpan = - tracer - .buildSpan("datadog", "openai.request") - .withResourceName("createCompletion") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.model_name", "gpt-4") - .withTag("_ml_obs_tag.model_provider", "openai") - .start(); + AgentSpan llmSpan = tracer + .buildSpan("datadog", "openai.request") + .withResourceName("createCompletion") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.model_name", "gpt-4") + .withTag("_ml_obs_tag.model_provider", "openai") + .start(); llmSpan.setSpanType(InternalSpanTypes.LLMOBS); llmSpan.finish(); @@ -450,15 +438,14 @@ void testLLMObsSpanMapperOmitsTopLevelSessionIdWhenNotSet() throws Exception { @Test void testLLMObsSpanProcessorModifiesInputAndOutput() throws Exception { - LLMObs.registerProcessor( - span -> { - assertEquals(Tags.LLMOBS_LLM_SPAN_KIND, span.getKind()); - assertEquals("true", span.getTag("redact")); - assertEquals("secret input", span.getInput().get(0).getContent()); - span.setInput(Collections.singletonList(LLMObs.LLMMessage.from("user", "[REDACTED]"))); - span.setOutput(Collections.emptyList()); - return span; - }); + LLMObs.registerProcessor(span -> { + assertEquals(Tags.LLMOBS_LLM_SPAN_KIND, span.getKind()); + assertEquals("true", span.getTag("redact")); + assertEquals("secret input", span.getInput().get(0).getContent()); + span.setInput(Collections.singletonList(LLMObs.LLMMessage.from("user", "[REDACTED]"))); + span.setOutput(Collections.emptyList()); + return span; + }); try { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); @@ -466,16 +453,15 @@ void testLLMObsSpanProcessorModifiesInputAndOutput() throws Exception { originalInput.put( "messages", Collections.singletonList(LLMObs.LLMMessage.from("user", "secret input"))); originalInput.put("prompt", Collections.singletonMap("id", "prompt-id")); - AgentSpan llmSpan = - tracer - .buildSpan("datadog", "processed") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.input", originalInput) - .withTag( - "_ml_obs_tag.output", - Collections.singletonList(LLMObs.LLMMessage.from("assistant", "secret output"))) - .withTag("_ml_obs_tag.redact", true) - .start(); + AgentSpan llmSpan = tracer + .buildSpan("datadog", "processed") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.input", originalInput) + .withTag( + "_ml_obs_tag.output", + Collections.singletonList(LLMObs.LLMMessage.from("assistant", "secret output"))) + .withTag("_ml_obs_tag.redact", true) + .start(); llmSpan.setSpanType(InternalSpanTypes.LLMOBS); llmSpan.finish(); @@ -496,13 +482,12 @@ void testLLMObsSpanProcessorModifiesInputAndOutput() throws Exception { @Test void testLLMObsSpanProcessorAddsMissingInputAndOutput() throws Exception { - LLMObs.registerProcessor( - span -> { - span.setInput(Collections.singletonList(LLMObs.LLMMessage.from("user", "added input"))); - span.setOutput( - Collections.singletonList(LLMObs.LLMMessage.from("assistant", "added output"))); - return span; - }); + LLMObs.registerProcessor(span -> { + span.setInput(Collections.singletonList(LLMObs.LLMMessage.from("user", "added input"))); + span.setOutput( + Collections.singletonList(LLMObs.LLMMessage.from("assistant", "added output"))); + return span; + }); try { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); @@ -526,24 +511,21 @@ void testLLMObsSpanProcessorAddsMissingInputAndOutput() throws Exception { @Test void testLLMObsSpanProcessorModifiesRetrievalOutputDocuments() throws Exception { - LLMObs.registerProcessor( - span -> { - span.setOutput( - Collections.singletonList(LLMObs.LLMMessage.from("", "processed document"))); - return span; - }); + LLMObs.registerProcessor(span -> { + span.setOutput(Collections.singletonList(LLMObs.LLMMessage.from("", "processed document"))); + return span; + }); try { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan retrievalSpan = - tracer - .buildSpan("datadog", "retrieval") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) - .withTag( - "_ml_obs_tag.output", - Collections.singletonList( - LLMObs.Document.from("original document", "result.txt", "doc-456", 0.9))) - .start(); + AgentSpan retrievalSpan = tracer + .buildSpan("datadog", "retrieval") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) + .withTag( + "_ml_obs_tag.output", + Collections.singletonList( + LLMObs.Document.from("original document", "result.txt", "doc-456", 0.9))) + .start(); retrievalSpan.setSpanType(InternalSpanTypes.LLMOBS); retrievalSpan.finish(); @@ -568,57 +550,52 @@ void testLLMObsSpanMapperSerializesDocumentIO() throws Exception { LLMObsSpanMapper mapper = new LLMObsSpanMapper(); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan embeddingSpan = - tracer - .buildSpan("datadog", "embedding") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_EMBEDDING_SPAN_KIND) - .withTag( - "_ml_obs_tag.input", - Arrays.asList( - LLMObs.Document.from("embedding input", "embedding.txt", "embedding-1", 0.75), - LLMObs.Document.from("embedding text only"))) - .start(); + AgentSpan embeddingSpan = tracer + .buildSpan("datadog", "embedding") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_EMBEDDING_SPAN_KIND) + .withTag( + "_ml_obs_tag.input", + Arrays.asList( + LLMObs.Document.from("embedding input", "embedding.txt", "embedding-1", 0.75), + LLMObs.Document.from("embedding text only"))) + .start(); embeddingSpan.setSpanType(InternalSpanTypes.LLMOBS); embeddingSpan.finish(); - AgentSpan retrievalSpan = - tracer - .buildSpan("datadog", "retrieval") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) - .withTag( - "_ml_obs_tag.output", - Collections.singletonList( - LLMObs.Document.from("retrieval output", "retrieval.txt", "retrieval-1", 0.9))) - .start(); + AgentSpan retrievalSpan = tracer + .buildSpan("datadog", "retrieval") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) + .withTag( + "_ml_obs_tag.output", + Collections.singletonList( + LLMObs.Document.from("retrieval output", "retrieval.txt", "retrieval-1", 0.9))) + .start(); retrievalSpan.setSpanType(InternalSpanTypes.LLMOBS); retrievalSpan.finish(); List nonDocumentInput = Arrays.asList("first raw input", "second raw input"); - AgentSpan embeddingWithNonDocumentInput = - tracer - .buildSpan("datadog", "embedding") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_EMBEDDING_SPAN_KIND) - .withTag("_ml_obs_tag.input", nonDocumentInput) - .start(); + AgentSpan embeddingWithNonDocumentInput = tracer + .buildSpan("datadog", "embedding") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_EMBEDDING_SPAN_KIND) + .withTag("_ml_obs_tag.input", nonDocumentInput) + .start(); embeddingWithNonDocumentInput.setSpanType(InternalSpanTypes.LLMOBS); embeddingWithNonDocumentInput.finish(); List nonDocumentOutput = Arrays.asList("first raw result", "second raw result"); - AgentSpan retrievalWithNonDocumentOutput = - tracer - .buildSpan("datadog", "retrieval") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) - .withTag("_ml_obs_tag.output", nonDocumentOutput) - .start(); + AgentSpan retrievalWithNonDocumentOutput = tracer + .buildSpan("datadog", "retrieval") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) + .withTag("_ml_obs_tag.output", nonDocumentOutput) + .start(); retrievalWithNonDocumentOutput.setSpanType(InternalSpanTypes.LLMOBS); retrievalWithNonDocumentOutput.finish(); - List trace = - Arrays.asList( - (DDSpan) embeddingSpan, - (DDSpan) retrievalSpan, - (DDSpan) embeddingWithNonDocumentInput, - (DDSpan) retrievalWithNonDocumentOutput); + List trace = Arrays.asList( + (DDSpan) embeddingSpan, + (DDSpan) retrievalSpan, + (DDSpan) embeddingWithNonDocumentInput, + (DDSpan) retrievalWithNonDocumentOutput); CapturingByteBufferConsumer sink = new CapturingByteBufferConsumer(); MsgPackWriter packer = new MsgPackWriter(new FlushingBuffer(16 * 1024, sink)); packer.format(trace, mapper); @@ -653,12 +630,14 @@ void testLLMObsSpanMapperSerializesDocumentIO() throws Exception { assertEquals(0.9, retrievalDocuments.get(0).get("score")); assertFalse(retrievalOutput.containsKey("value")); - Map fallbackEmbeddingMeta = (Map) spans.get(2).get("meta"); + Map fallbackEmbeddingMeta = + (Map) spans.get(2).get("meta"); Map fallbackInput = (Map) fallbackEmbeddingMeta.get("input"); assertEquals(nonDocumentInput, fallbackInput.get("value")); assertFalse(fallbackInput.containsKey("documents")); - Map fallbackRetrievalMeta = (Map) spans.get(3).get("meta"); + Map fallbackRetrievalMeta = + (Map) spans.get(3).get("meta"); Map fallbackOutput = (Map) fallbackRetrievalMeta.get("output"); assertEquals(nonDocumentOutput, fallbackOutput.get("value")); assertFalse(fallbackOutput.containsKey("documents")); @@ -669,12 +648,11 @@ void testLLMObsSpanMapperSerializesDocumentIO() throws Exception { @Test void testLLMObsSpanMapperPreservesStringRetrievalOutput() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan retrievalSpan = - tracer - .buildSpan("datadog", "retrieval") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) - .withTag("_ml_obs_tag.output", "retrieval output") - .start(); + AgentSpan retrievalSpan = tracer + .buildSpan("datadog", "retrieval") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_RETRIEVAL_SPAN_KIND) + .withTag("_ml_obs_tag.output", "retrieval output") + .start(); retrievalSpan.setSpanType(InternalSpanTypes.LLMOBS); retrievalSpan.finish(); @@ -692,13 +670,12 @@ void testAgentAttributionEmittedWithBothFields() throws Exception { LLMObsSpanMapper mapper = new LLMObsSpanMapper(); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan agentSpan = - tracer - .buildSpan("datadog", "my.agent") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_AGENT_SPAN_KIND) - .withTag("_ml_obs_tag.pagent_span_id", "abc123") - .withTag("_ml_obs_tag.pagent_name", "my-orchestrator") - .start(); + AgentSpan agentSpan = tracer + .buildSpan("datadog", "my.agent") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_AGENT_SPAN_KIND) + .withTag("_ml_obs_tag.pagent_span_id", "abc123") + .withTag("_ml_obs_tag.pagent_name", "my-orchestrator") + .start(); agentSpan.setSpanType(InternalSpanTypes.LLMOBS); agentSpan.finish(); @@ -734,13 +711,12 @@ void testLLMObsSpanProcessorCanDropSpan() throws Exception { @Test void testLLMObsSpanProcessorExceptionDropsSpan() throws Exception { - LLMObs.registerProcessor( - span -> { - if ("true".equals(span.getTag("drop"))) { - throw new IllegalStateException("processor failure"); - } - return span; - }); + LLMObs.registerProcessor(span -> { + if ("true".equals(span.getTag("drop"))) { + throw new IllegalStateException("processor failure"); + } + return span; + }); try { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); @@ -760,13 +736,12 @@ void testLLMObsSpanProcessorExceptionDropsSpan() throws Exception { @Test void testLLMObsSpanProcessorErrorDropsSpan() throws Exception { - LLMObs.registerProcessor( - span -> { - if ("true".equals(span.getTag("drop"))) { - throw new AssertionError("processor failure"); - } - return span; - }); + LLMObs.registerProcessor(span -> { + if ("true".equals(span.getTag("drop"))) { + throw new AssertionError("processor failure"); + } + return span; + }); try { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); @@ -788,11 +763,10 @@ void testLLMObsSpanProcessorErrorDropsSpan() throws Exception { void testLLMObsSpanProcessorRunsOnceWhenSerializationRetries() { AtomicInteger calls = new AtomicInteger(); LLMObsMetricCollector.get().drain(); - LLMObs.registerProcessor( - span -> { - calls.incrementAndGet(); - return "true".equals(span.getTag("drop")) ? null : span; - }); + LLMObs.registerProcessor(span -> { + calls.incrementAndGet(); + return "true".equals(span.getTag("drop")) ? null : span; + }); try { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); @@ -821,9 +795,8 @@ void testLLMObsSpanProcessorRunsOnceWhenSerializationRetries() { assertEquals( 3, LLMObsMetricCollector.get().drain().stream() - .filter( - metric -> - LLMObsMetricCollector.USER_PROCESSOR_CALLED_METRIC.equals(metric.metricName)) + .filter(metric -> + LLMObsMetricCollector.USER_PROCESSOR_CALLED_METRIC.equals(metric.metricName)) .count()); tracer.close(); } finally { @@ -865,12 +838,11 @@ void testLLMObsSpanMapperSerializesAgentManifest() throws Exception { tools.add(tool); manifest.put("tools", tools); - AgentSpan agentSpan = - tracer - .buildSpan("datadog", "my-agent") - .withTag("_ml_obs_tag.span.kind", "agent") - .withTag("_ml_obs_tag.agent_manifest", manifest) - .start(); + AgentSpan agentSpan = tracer + .buildSpan("datadog", "my-agent") + .withTag("_ml_obs_tag.span.kind", "agent") + .withTag("_ml_obs_tag.agent_manifest", manifest) + .start(); agentSpan.setSpanType(InternalSpanTypes.LLMOBS); agentSpan.finish(); @@ -900,12 +872,11 @@ void testAgentManifestDoesNotAppearInTags() throws Exception { manifest.put("name", "my-agent"); manifest.put("framework", "manual"); - AgentSpan agentSpan = - tracer - .buildSpan("datadog", "my-agent") - .withTag("_ml_obs_tag.span.kind", "agent") - .withTag("_ml_obs_tag.agent_manifest", manifest) - .start(); + AgentSpan agentSpan = tracer + .buildSpan("datadog", "my-agent") + .withTag("_ml_obs_tag.span.kind", "agent") + .withTag("_ml_obs_tag.agent_manifest", manifest) + .start(); agentSpan.setSpanType(InternalSpanTypes.LLMOBS); agentSpan.finish(); @@ -917,12 +888,11 @@ void testAgentManifestDoesNotAppearInTags() throws Exception { } private static AgentSpan newLlmObsSpan(CoreTracer tracer, String name, boolean drop) { - AgentSpan span = - tracer - .buildSpan("datadog", name) - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.drop", drop) - .start(); + AgentSpan span = tracer + .buildSpan("datadog", name) + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.drop", drop) + .start(); span.setSpanType(InternalSpanTypes.LLMOBS); span.finish(); return span; @@ -949,12 +919,11 @@ void testAgentAttributionEmitsExplicitNullNameWhenAbsent() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); // Only pagent_span_id is set — pagent_name tag is absent - AgentSpan agentSpan = - tracer - .buildSpan("datadog", "my.agent") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_AGENT_SPAN_KIND) - .withTag("_ml_obs_tag.pagent_span_id", "abc123") - .start(); + AgentSpan agentSpan = tracer + .buildSpan("datadog", "my.agent") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_AGENT_SPAN_KIND) + .withTag("_ml_obs_tag.pagent_span_id", "abc123") + .start(); agentSpan.setSpanType(InternalSpanTypes.LLMOBS); agentSpan.finish(); @@ -976,11 +945,10 @@ void testNoAgentAttributionBlockWhenParentAgentSpanIdAbsent() throws Exception { LLMObsSpanMapper mapper = new LLMObsSpanMapper(); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan llmSpan = - tracer - .buildSpan("datadog", "openai.chat") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .start(); + AgentSpan llmSpan = tracer + .buildSpan("datadog", "openai.chat") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .start(); llmSpan.setSpanType(InternalSpanTypes.LLMOBS); llmSpan.finish(); @@ -994,24 +962,23 @@ void testNoAgentAttributionBlockWhenParentAgentSpanIdAbsent() throws Exception { private static byte[] writeTo(datadog.trace.common.writer.Payload payload) throws IOException { ByteArrayOutputStream channel = new ByteArrayOutputStream(); - payload.writeTo( - new WritableByteChannel() { - @Override - public int write(ByteBuffer src) throws IOException { - byte[] bytes = new byte[src.remaining()]; - src.get(bytes); - channel.write(bytes); - return bytes.length; - } - - @Override - public boolean isOpen() { - return true; - } - - @Override - public void close() throws IOException {} - }); + payload.writeTo(new WritableByteChannel() { + @Override + public int write(ByteBuffer src) throws IOException { + byte[] bytes = new byte[src.remaining()]; + src.get(bytes); + channel.write(bytes); + return bytes.length; + } + + @Override + public boolean isOpen() { + return true; + } + + @Override + public void close() throws IOException {} + }); return channel.toByteArray(); } @@ -1036,11 +1003,10 @@ void testSamplingFieldsDefaultToRetainWhenTheSpanCarriesNoDecision() throws Exce CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); // Both span producers stamp these tags, so this exercises the mapper's fallback branch. - AgentSpan span = - tracer - .buildSpan("datadog", "chat-completion") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "chat-completion") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .start(); span.setSpanType(InternalSpanTypes.LLMOBS); span.finish(); @@ -1058,13 +1024,12 @@ void testSamplingFieldsAreEmittedAndDoNotLeakIntoTags() throws Exception { LLMObsSpanMapper mapper = new LLMObsSpanMapper(); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan span = - tracer - .buildSpan("datadog", "chat-completion") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.sampling_decision", "0") - .withTag("_ml_obs_tag.sample_rate", "0.1") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "chat-completion") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.sampling_decision", "0") + .withTag("_ml_obs_tag.sample_rate", "0.1") + .start(); span.setSpanType(InternalSpanTypes.LLMOBS); span.finish(); @@ -1090,14 +1055,13 @@ void testTopLevelFieldsSurviveASerializationRetry() throws Exception { LLMObsSpanMapper mapper = new LLMObsSpanMapper(); CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - AgentSpan span = - tracer - .buildSpan("datadog", "chat-completion") - .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) - .withTag("_ml_obs_tag.parent_id", "9876543210") - .withTag("_ml_obs_tag.sampling_decision", "0") - .withTag("_ml_obs_tag.sample_rate", "0.1") - .start(); + AgentSpan span = tracer + .buildSpan("datadog", "chat-completion") + .withTag("_ml_obs_tag.span.kind", Tags.LLMOBS_LLM_SPAN_KIND) + .withTag("_ml_obs_tag.parent_id", "9876543210") + .withTag("_ml_obs_tag.sampling_decision", "0") + .withTag("_ml_obs_tag.sample_rate", "0.1") + .start(); span.setSpanType(InternalSpanTypes.LLMOBS); span.finish(); List trace = Collections.singletonList((DDSpan) span); diff --git a/dd-trace-core/src/test/java/datadog/trace/payloadtags/RedactionRulesExtractor.java b/dd-trace-core/src/test/java/datadog/trace/payloadtags/RedactionRulesExtractor.java index a2715a05216..936fde3c4cb 100644 --- a/dd-trace-core/src/test/java/datadog/trace/payloadtags/RedactionRulesExtractor.java +++ b/dd-trace-core/src/test/java/datadog/trace/payloadtags/RedactionRulesExtractor.java @@ -36,10 +36,9 @@ public static void main(String[] args) throws IOException { String json = new String(Files.readAllBytes(jsonFile.toPath())); - JsonAdapter> adapter = - new Moshi.Builder() - .build() - .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); + JsonAdapter> adapter = new Moshi.Builder() + .build() + .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); Map map = adapter.fromJson(json); @@ -83,9 +82,8 @@ public static void main(String[] args) throws IOException { responseSensitivePaths); } - List> errors = - (List>) - operationObject.getOrDefault("errors", Collections.emptyList()); + List> errors = (List>) + operationObject.getOrDefault("errors", Collections.emptyList()); for (Map error : errors) { String errorShape = (String) error.get("shape"); collectSensitivePaths( diff --git a/dd-trace-core/src/traceAgentTest/java/AbstractTraceAgentTest.java b/dd-trace-core/src/traceAgentTest/java/AbstractTraceAgentTest.java index 3c30bbe8cfa..0fe755bbebf 100644 --- a/dd-trace-core/src/traceAgentTest/java/AbstractTraceAgentTest.java +++ b/dd-trace-core/src/traceAgentTest/java/AbstractTraceAgentTest.java @@ -29,17 +29,16 @@ static void setupSpec() { env.put("DD_API_KEY", "invalid_key_but_this_is_fine"); env.put("DD_HOSTNAME", "doesnotexist"); env.put("DD_LOGS_STDOUT", "yes"); - agentContainer = - new GenericContainer<>("datadog/agent:7.40.1") - .withEnv(env) - .withExposedPorts(DEFAULT_TRACE_AGENT_PORT) - .withStartupTimeout(Duration.ofSeconds(120)) - // Apparently we need to sleep for a bit so agent's response - // `{"service:,env:":1}` in rate_by_service. - // This is clearly a race-condition and maybe we should avoid verifying complete - // response - .withStartupCheckStrategy( - new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(10))); + agentContainer = new GenericContainer<>("datadog/agent:7.40.1") + .withEnv(env) + .withExposedPorts(DEFAULT_TRACE_AGENT_PORT) + .withStartupTimeout(Duration.ofSeconds(120)) + // Apparently we need to sleep for a bit so agent's response + // `{"service:,env:":1}` in rate_by_service. + // This is clearly a race-condition and maybe we should avoid verifying complete + // response + .withStartupCheckStrategy( + new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(10))); agentContainer.start(); } } diff --git a/dd-trace-core/src/traceAgentTest/java/DDApiIntegrationTest.java b/dd-trace-core/src/traceAgentTest/java/DDApiIntegrationTest.java index 9518bcd0024..cf08d12f75c 100644 --- a/dd-trace-core/src/traceAgentTest/java/DDApiIntegrationTest.java +++ b/dd-trace-core/src/traceAgentTest/java/DDApiIntegrationTest.java @@ -68,33 +68,29 @@ class DDApiIntegrationTest extends AbstractTraceAgentTest { AtomicReference endpoint = new AtomicReference<>(null); AtomicReference>> agentResponse = new AtomicReference<>(null); - RemoteResponseListener responseListener = - (receivedEndpoint, responseJson) -> { - endpoint.set(receivedEndpoint); - agentResponse.set(responseJson); - }; + RemoteResponseListener responseListener = (receivedEndpoint, responseJson) -> { + endpoint.set(receivedEndpoint); + agentResponse.set(responseJson); + }; @BeforeAll static void startSocatProxy() throws IOException { File tmpDir = Files.createTempDirectory("dd-api-integration-test").toFile(); tmpDir.deleteOnExit(); socketPath = new File(tmpDir, "socket"); - System.out.println( - "!!!socat UNIX-LISTEN:" + System.out.println("!!!socat UNIX-LISTEN:" + + socketPath + + ",reuseaddr,fork TCP-CONNECT:" + + getAgentContainerHost() + + ":" + + getAgentContainerPort()); + process = Runtime.getRuntime() + .exec("socat UNIX-LISTEN:" + socketPath + ",reuseaddr,fork TCP-CONNECT:" + getAgentContainerHost() + ":" + getAgentContainerPort()); - process = - Runtime.getRuntime() - .exec( - "socat UNIX-LISTEN:" - + socketPath - + ",reuseaddr,fork TCP-CONNECT:" - + getAgentContainerHost() - + ":" - + getAgentContainerPort()); } @BeforeEach @@ -213,9 +209,8 @@ void sendingEmptyTracesToUnixDomainSocketSucceeds(ProtocolVersion protocol) thro void sendingTracesToUnixDomainSocketSucceeds(ProtocolVersion protocol) throws IOException { beforeTest(protocol); - RemoteApi.Response response = - unixDomainSocketApi.sendSerializedTraces( - prepareRequest(singletonList(singletonList(span)), mapper)); + RemoteApi.Response response = unixDomainSocketApi.sendSerializedTraces( + prepareRequest(singletonList(singletonList(span)), mapper)); assertFalse(response.response().isEmpty()); assertFalse(response.exception().isPresent()); assertTrue(response.status().isPresent()); diff --git a/dd-trace-core/src/traceAgentTest/java/DataStreamsIntegrationTest.java b/dd-trace-core/src/traceAgentTest/java/DataStreamsIntegrationTest.java index 3af2c6332fb..cb8a121d83a 100644 --- a/dd-trace-core/src/traceAgentTest/java/DataStreamsIntegrationTest.java +++ b/dd-trace-core/src/traceAgentTest/java/DataStreamsIntegrationTest.java @@ -31,14 +31,13 @@ void sendingStatsBucketToAgentShouldNotifyWithOkEvent() throws ReflectiveOperati SharedCommunicationObjects sharedCommunicationObjects = new SharedCommunicationObjects(); sharedCommunicationObjects.createRemaining(Config.get()); - OkHttpSink sink = - new OkHttpSink( - OkHttpUtils.buildHttpClient(HttpUrl.parse(Config.get().getAgentUrl()), 5000L), - Config.get().getAgentUrl(), - DDAgentFeaturesDiscovery.V01_DATASTREAMS_ENDPOINT, - false, - true, - Collections.emptyMap()); + OkHttpSink sink = new OkHttpSink( + OkHttpUtils.buildHttpClient(HttpUrl.parse(Config.get().getAgentUrl()), 5000L), + Config.get().getAgentUrl(), + DDAgentFeaturesDiscovery.V01_DATASTREAMS_ENDPOINT, + false, + true, + Collections.emptyMap()); BlockingListener listener = new BlockingListener(); sink.register(listener); @@ -50,9 +49,8 @@ void sendingStatsBucketToAgentShouldNotifyWithOkEvent() throws ReflectiveOperati DDAgentFeaturesDiscovery ddAgentFeaturesDiscovery = sharedCommunicationObjects.featuresDiscovery(Config.get()); - try (DefaultDataStreamsMonitoring dataStreams = - new DefaultDataStreamsMonitoring( - sink, ddAgentFeaturesDiscovery, timeSource, () -> traceConfig, Config.get())) { + try (DefaultDataStreamsMonitoring dataStreams = new DefaultDataStreamsMonitoring( + sink, ddAgentFeaturesDiscovery, timeSource, () -> traceConfig, Config.get())) { dataStreams.start(); DataStreamsTags tags = diff --git a/dd-trace-core/src/traceAgentTest/java/TraceGenerator.java b/dd-trace-core/src/traceAgentTest/java/TraceGenerator.java index b349e937e68..13647d761f1 100644 --- a/dd-trace-core/src/traceAgentTest/java/TraceGenerator.java +++ b/dd-trace-core/src/traceAgentTest/java/TraceGenerator.java @@ -169,20 +169,19 @@ static class PojoSpan implements CoreSpan { this.error = error; this.type = type; this.measured = measured; - this.metadata = - new Metadata( - currentThread().getId(), - UTF8BytesString.create(currentThread().getName()), - fromMap(tags), - baggage, - UNSET, - measured, - isTopLevel(), - null, - null, - 0, - getTagsForSerialization(), - emptyList()); + this.metadata = new Metadata( + currentThread().getId(), + UTF8BytesString.create(currentThread().getName()), + fromMap(tags), + baggage, + UNSET, + measured, + isTopLevel(), + null, + null, + 0, + getTagsForSerialization(), + emptyList()); } @Override diff --git a/dd-trace-core/src/traceAgentTest/java/TraceMapperRealAgentTest.java b/dd-trace-core/src/traceAgentTest/java/TraceMapperRealAgentTest.java index cedea2c8002..7a1e93c0cf2 100644 --- a/dd-trace-core/src/traceAgentTest/java/TraceMapperRealAgentTest.java +++ b/dd-trace-core/src/traceAgentTest/java/TraceMapperRealAgentTest.java @@ -98,9 +98,8 @@ void sendRandomTraces(int traceCount, boolean lowCardinality, ProtocolVersion pr DDAgentFeaturesDiscovery discovery = new DDAgentFeaturesDiscovery(client, monitoring, agentUrl, protocol, true, false); DDAgentApi api = new DDAgentApi(client, agentUrl, discovery, monitoring, false); - PayloadDispatcherImpl dispatcher = - new PayloadDispatcherImpl( - new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); + PayloadDispatcherImpl dispatcher = new PayloadDispatcherImpl( + new DDAgentMapperDiscovery(discovery), api, healthMetrics, monitoring); List> traces = TraceGenerator.generateRandomTraces(traceCount, lowCardinality); for (List trace : traces) { diff --git a/dd-trace-core/src/traceAgentTest/java/datadog/trace/common/metrics/MetricsIntegrationTest.java b/dd-trace-core/src/traceAgentTest/java/datadog/trace/common/metrics/MetricsIntegrationTest.java index 607512427ae..c5885b6417f 100644 --- a/dd-trace-core/src/traceAgentTest/java/datadog/trace/common/metrics/MetricsIntegrationTest.java +++ b/dd-trace-core/src/traceAgentTest/java/datadog/trace/common/metrics/MetricsIntegrationTest.java @@ -54,15 +54,14 @@ static void setupSpec() { env.put("DD_API_KEY", "invalid_key_but_this_is_fine"); env.put("DD_HOSTNAME", "doesnotexist"); env.put("DD_LOGS_STDOUT", "yes"); - agentContainer = - new GenericContainer<>("datadog/agent:7.40.1") - .withEnv(env) - .withExposedPorts(ConfigDefaults.DEFAULT_TRACE_AGENT_PORT) - .withStartupTimeout(Duration.ofSeconds(120)) - // Sleep for a bit so the agent's rate_by_service response is populated -- mirrors the - // race-condition workaround from the original Spock base. - .withStartupCheckStrategy( - new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(10))); + agentContainer = new GenericContainer<>("datadog/agent:7.40.1") + .withEnv(env) + .withExposedPorts(ConfigDefaults.DEFAULT_TRACE_AGENT_PORT) + .withStartupTimeout(Duration.ofSeconds(120)) + // Sleep for a bit so the agent's rate_by_service response is populated -- mirrors the + // race-condition workaround from the original Spock base. + .withStartupCheckStrategy( + new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(10))); agentContainer.start(); } } @@ -96,68 +95,63 @@ void sendMetricsToTraceAgentShouldNotifyWithOkEvent() throws InterruptedExceptio CountDownLatch latch = new CountDownLatch(1); BlockingListener listener = new BlockingListener(latch); String agentUrl = Config.get().getAgentUrl(); - OkHttpSink sink = - new OkHttpSink( - OkHttpUtils.buildHttpClient(HttpUrl.parse(agentUrl), 5000L), - agentUrl, - V06_METRICS_ENDPOINT, - true, - false, - Collections.emptyMap()); + OkHttpSink sink = new OkHttpSink( + OkHttpUtils.buildHttpClient(HttpUrl.parse(agentUrl), 5000L), + agentUrl, + V06_METRICS_ENDPOINT, + true, + false, + Collections.emptyMap()); sink.register(listener); // when - SerializingMetricWriter writer = - new SerializingMetricWriter( - new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"), - sink); + SerializingMetricWriter writer = new SerializingMetricWriter( + new WellKnownTags("runtimeid", "hostname", "env", "service", "version", "language"), sink); writer.startBucket(2, System.nanoTime(), SECONDS.toNanos(10)); // Build entries through the production AggregateTable.findOrInsert path (canonicalizes the // snapshot and creates/looks up the entry). Both entries use one peer tag (grault:quux) and no // additional tags -> schema names=["grault"], values=["quux"]. AggregateTable table = new AggregateTable(8); PeerTagSchema schema = new PeerTagSchema(new String[] {"grault"}, PeerTagSchema.NO_STATE); - SpanSnapshot snap1 = - new SpanSnapshot( - "resource1", - "service1", - "operation1", - null, - "sql", - (short) 0, - false, - true, - "xyzzy", - schema, - new String[] {"quux"}, - null, - null, - null, - null, - 0L); + SpanSnapshot snap1 = new SpanSnapshot( + "resource1", + "service1", + "operation1", + null, + "sql", + (short) 0, + false, + true, + "xyzzy", + schema, + new String[] {"quux"}, + null, + null, + null, + null, + 0L); AggregateEntry entry1 = table.findOrInsert(snap1); for (long duration : new long[] {2, 1, 2, 250, 4}) { entry1.recordOneDuration(duration); } writer.add(entry1); - SpanSnapshot snap2 = - new SpanSnapshot( - "resource2", - "service2", - "operation2", - null, - "web", - (short) 200, - false, - true, - "xyzzy", - schema, - new String[] {"quux"}, - null, - null, - null, - null, - 0L); + SpanSnapshot snap2 = new SpanSnapshot( + "resource2", + "service2", + "operation2", + null, + "web", + (short) 200, + false, + true, + "xyzzy", + schema, + new String[] {"quux"}, + null, + null, + null, + null, + 0L); AggregateEntry entry2 = table.findOrInsert(snap2); for (long duration : new long[] {1, 1, 200, 2, 3, 4, 5, 6, 7, 8}) { entry2.recordOneDuration(duration); diff --git a/dd-trace-ot/correlation-id-injection/src/test/java/CorrelationIdInjectorTest.java b/dd-trace-ot/correlation-id-injection/src/test/java/CorrelationIdInjectorTest.java index a3228a7094c..ae2f024cce3 100644 --- a/dd-trace-ot/correlation-id-injection/src/test/java/CorrelationIdInjectorTest.java +++ b/dd-trace-ot/correlation-id-injection/src/test/java/CorrelationIdInjectorTest.java @@ -10,12 +10,11 @@ abstract class CorrelationIdInjectorTest extends DDJavaSpecification { - protected static final String LOG_PATTERN = - "TRACE_ID=%X{" - + CorrelationIdentifier.getTraceIdKey() - + "} SPAN_ID=%X{" - + CorrelationIdentifier.getSpanIdKey() - + "} %m"; + protected static final String LOG_PATTERN = "TRACE_ID=%X{" + + CorrelationIdentifier.getTraceIdKey() + + "} SPAN_ID=%X{" + + CorrelationIdentifier.getSpanIdKey() + + "} %m"; @Test void testCorrelationIdInjection() throws Exception { diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java index 9494c772aee..2ca62fb039f 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java @@ -215,7 +215,11 @@ public DDTracer(final Config config) { // This constructor is already used in the wild, so we have to keep it inside this API for now. @Deprecated public DDTracer(final String serviceName, final Writer writer, final Sampler sampler) { - this(CoreTracer.builder().serviceName(serviceName).writer(writer).sampler(sampler).build()); + this(CoreTracer.builder() + .serviceName(serviceName) + .writer(writer) + .sampler(sampler) + .build()); } @Deprecated @@ -224,13 +228,12 @@ public DDTracer(final String serviceName, final Writer writer, final Sampler sam final Writer writer, final Sampler sampler, final Map runtimeTags) { - this( - CoreTracer.builder() - .serviceName(serviceName) - .writer(writer) - .sampler(sampler) - .localRootSpanTags(runtimeTags) - .build()); + this(CoreTracer.builder() + .serviceName(serviceName) + .writer(writer) + .sampler(sampler) + .localRootSpanTags(runtimeTags) + .build()); } @Deprecated @@ -253,16 +256,15 @@ public DDTracer( final Map defaultSpanTags, final Map serviceNameMappings, final Map taggedHeaders) { - this( - CoreTracer.builder() - .serviceName(serviceName) - .writer(writer) - .sampler(sampler) - .localRootSpanTags(customRuntimeTags(runtimeId, localRootSpanTags)) - .defaultSpanTags(defaultSpanTags) - .serviceNameMappings(serviceNameMappings) - .taggedHeaders(taggedHeaders) - .build()); + this(CoreTracer.builder() + .serviceName(serviceName) + .writer(writer) + .sampler(sampler) + .localRootSpanTags(customRuntimeTags(runtimeId, localRootSpanTags)) + .defaultSpanTags(defaultSpanTags) + .serviceNameMappings(serviceNameMappings) + .taggedHeaders(taggedHeaders) + .build()); } @Deprecated @@ -275,16 +277,15 @@ public DDTracer( final Map serviceNameMappings, final Map taggedHeaders) { - this( - CoreTracer.builder() - .serviceName(serviceName) - .writer(writer) - .sampler(sampler) - .localRootSpanTags(localRootSpanTags) - .defaultSpanTags(defaultSpanTags) - .serviceNameMappings(serviceNameMappings) - .taggedHeaders(taggedHeaders) - .build()); + this(CoreTracer.builder() + .serviceName(serviceName) + .writer(writer) + .sampler(sampler) + .localRootSpanTags(localRootSpanTags) + .defaultSpanTags(defaultSpanTags) + .serviceNameMappings(serviceNameMappings) + .taggedHeaders(taggedHeaders) + .build()); } @Deprecated @@ -298,17 +299,16 @@ public DDTracer( final Map taggedHeaders, final int partialFlushMinSpans) { - this( - CoreTracer.builder() - .serviceName(serviceName) - .writer(writer) - .sampler(sampler) - .localRootSpanTags(localRootSpanTags) - .defaultSpanTags(defaultSpanTags) - .serviceNameMappings(serviceNameMappings) - .taggedHeaders(taggedHeaders) - .partialFlushMinSpans(partialFlushMinSpans) - .build()); + this(CoreTracer.builder() + .serviceName(serviceName) + .writer(writer) + .sampler(sampler) + .localRootSpanTags(localRootSpanTags) + .defaultSpanTags(defaultSpanTags) + .serviceNameMappings(serviceNameMappings) + .taggedHeaders(taggedHeaders) + .partialFlushMinSpans(partialFlushMinSpans) + .build()); } // Should only be used internally by TracerInstaller diff --git a/dd-trace-ot/src/ot31CompatibilityTest/java/datadog/opentracing/OT31ApiTest.java b/dd-trace-ot/src/ot31CompatibilityTest/java/datadog/opentracing/OT31ApiTest.java index 5f1e873fb8c..af3dbd26b8a 100644 --- a/dd-trace-ot/src/ot31CompatibilityTest/java/datadog/opentracing/OT31ApiTest.java +++ b/dd-trace-ot/src/ot31CompatibilityTest/java/datadog/opentracing/OT31ApiTest.java @@ -111,23 +111,21 @@ void testInjectExtract( DDTraceId traceId = ((OTSpan) span).getDelegate().spanContext().getTraceId(); long spanId = ((OTSpan) span).getDelegate().spanContext().getSpanId(); - String expectedTraceparent = - "00-" - + traceId.toHexStringPadded(32) - + "-" - + DDSpanId.toHexStringPadded(spanId) - + "-" - + (propagatedPriority > 0 ? "01" : "00"); + String expectedTraceparent = "00-" + + traceId.toHexStringPadded(32) + + "-" + + DDSpanId.toHexStringPadded(spanId) + + "-" + + (propagatedPriority > 0 ? "01" : "00"); int effectiveSamplingMechanism = contextPriority == UNSET ? AGENT_RATE : samplingMechanism; - String expectedTracestate = - "dd=s:" - + propagatedPriority - + ";p:" - + DDSpanId.toHexStringPadded(spanId) - + (propagatedPriority > 0 ? ";t.dm:-" + effectiveSamplingMechanism : "") - + ";t.tid:" - + traceId.toHexStringPadded(32).substring(0, 16) - + (contextPriority == UNSET ? ";t.ksr:1" : ""); + String expectedTracestate = "dd=s:" + + propagatedPriority + + ";p:" + + DDSpanId.toHexStringPadded(spanId) + + (propagatedPriority > 0 ? ";t.dm:-" + effectiveSamplingMechanism : "") + + ";t.tid:" + + traceId.toHexStringPadded(32).substring(0, 16) + + (contextPriority == UNSET ? ";t.ksr:1" : ""); Map expectedTextMap = new HashMap<>(); OTSpanContext otContext = (OTSpanContext) context; diff --git a/dd-trace-ot/src/ot33CompatibilityTest/java/datadog/opentracing/OT33ApiTest.java b/dd-trace-ot/src/ot33CompatibilityTest/java/datadog/opentracing/OT33ApiTest.java index a2d6270bb3a..427cc2c1315 100644 --- a/dd-trace-ot/src/ot33CompatibilityTest/java/datadog/opentracing/OT33ApiTest.java +++ b/dd-trace-ot/src/ot33CompatibilityTest/java/datadog/opentracing/OT33ApiTest.java @@ -97,23 +97,21 @@ void testInjectExtract( DDTraceId traceId = ((OTSpan) span).getDelegate().spanContext().getTraceId(); long spanId = ((OTSpan) span).getDelegate().spanContext().getSpanId(); - String expectedTraceparent = - "00-" - + traceId.toHexStringPadded(32) - + "-" - + DDSpanId.toHexStringPadded(spanId) - + "-" - + (propagatedPriority > 0 ? "01" : "00"); + String expectedTraceparent = "00-" + + traceId.toHexStringPadded(32) + + "-" + + DDSpanId.toHexStringPadded(spanId) + + "-" + + (propagatedPriority > 0 ? "01" : "00"); int effectiveSamplingMechanism = contextPriority == UNSET ? AGENT_RATE : samplingMechanism; - String expectedTracestate = - "dd=s:" - + propagatedPriority - + ";p:" - + DDSpanId.toHexStringPadded(spanId) - + (propagatedPriority > 0 ? ";t.dm:-" + effectiveSamplingMechanism : "") - + ";t.tid:" - + traceId.toHexStringPadded(32).substring(0, 16) - + (contextPriority == UNSET ? ";t.ksr:1" : ""); + String expectedTracestate = "dd=s:" + + propagatedPriority + + ";p:" + + DDSpanId.toHexStringPadded(spanId) + + (propagatedPriority > 0 ? ";t.dm:-" + effectiveSamplingMechanism : "") + + ";t.tid:" + + traceId.toHexStringPadded(32).substring(0, 16) + + (contextPriority == UNSET ? ";t.ksr:1" : ""); Map expectedTextMap = new HashMap<>(); expectedTextMap.put("x-datadog-trace-id", context.toTraceId()); diff --git a/dd-trace-ot/src/test/java/datadog/opentracing/DDTracerAPITest.java b/dd-trace-ot/src/test/java/datadog/opentracing/DDTracerAPITest.java index a95cb2b360d..2d1e86f6719 100644 --- a/dd-trace-ot/src/test/java/datadog/opentracing/DDTracerAPITest.java +++ b/dd-trace-ot/src/test/java/datadog/opentracing/DDTracerAPITest.java @@ -35,8 +35,11 @@ void verifySamplerWriterConstructor() throws Exception { Object localRootSpanTags = getField(tracer, "localRootSpanTags"); assertNotNull(localRootSpanTags.toString()); // Verify runtime-id and language tags are populated - assertTrue( - ((java.util.Map) localRootSpanTags).get(RUNTIME_ID_TAG).toString().length() > 0); + assertTrue(((java.util.Map) localRootSpanTags) + .get(RUNTIME_ID_TAG) + .toString() + .length() + > 0); assertEquals( LANGUAGE_TAG_VALUE, ((java.util.Map) localRootSpanTags).get(LANGUAGE_TAG_KEY)); } finally { diff --git a/dd-trace-ot/src/test/java/datadog/opentracing/DefaultLogHandlerTest.java b/dd-trace-ot/src/test/java/datadog/opentracing/DefaultLogHandlerTest.java index 3959d8b9af0..b0b97e14866 100644 --- a/dd-trace-ot/src/test/java/datadog/opentracing/DefaultLogHandlerTest.java +++ b/dd-trace-ot/src/test/java/datadog/opentracing/DefaultLogHandlerTest.java @@ -31,7 +31,8 @@ void cleanup() throws Exception { @Test void handlesCorrectlyTheErrorPassedInTheFields() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; String differentMessage = "differentMessage"; Throwable error = new Throwable(errorMessage); @@ -48,7 +49,8 @@ void handlesCorrectlyTheErrorPassedInTheFields() { @Test void handlesCorrectlyTheErrorPassedInTheFieldsWhenCalledWithTimestamp() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; String differentMessage = "differentMessage"; Throwable error = new Throwable(errorMessage); @@ -65,7 +67,8 @@ void handlesCorrectlyTheErrorPassedInTheFieldsWhenCalledWithTimestamp() { @Test void handlesCorrectlyTheMessageInTheFieldsButSpanIsNotAnError() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; Map fields = new HashMap<>(); fields.put(Fields.MESSAGE, errorMessage); @@ -78,7 +81,8 @@ void handlesCorrectlyTheMessageInTheFieldsButSpanIsNotAnError() { @Test void handlesCorrectlyTheMessageInTheFieldsCalledWithTimestampButSpanIsNotAnError() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; Map fields = new HashMap<>(); fields.put(Fields.MESSAGE, errorMessage); @@ -91,7 +95,8 @@ void handlesCorrectlyTheMessageInTheFieldsCalledWithTimestampButSpanIsNotAnError @Test void handlesCorrectlyTheMessageInTheFieldsWhenSpanIsError() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; Map fields = new HashMap<>(); span.setError(true); @@ -105,7 +110,8 @@ void handlesCorrectlyTheMessageInTheFieldsWhenSpanIsError() { @Test void handlesCorrectlyTheMessageInTheFieldsCalledWithTimestampWhenSpanIsError() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; Map fields = new HashMap<>(); span.setError(true); @@ -119,7 +125,8 @@ void handlesCorrectlyTheMessageInTheFieldsCalledWithTimestampWhenSpanIsError() { @Test void handlesCorrectlyTheMessageInTheFieldsWhenEventIsError() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; Map fields = new HashMap<>(); fields.put(Fields.EVENT, "error"); @@ -133,7 +140,8 @@ void handlesCorrectlyTheMessageInTheFieldsWhenEventIsError() { @Test void handlesCorrectlyTheMessageInTheFieldsCalledWithTimestampWhenEventIsError() { LogHandler underTest = new DefaultLogHandler(); - DDSpan span = (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); + DDSpan span = + (DDSpan) tracer.buildSpan("datadog", "op name").withServiceName("foo").start(); String errorMessage = "errorMessage"; Map fields = new HashMap<>(); fields.put(Fields.EVENT, "error"); @@ -194,9 +202,11 @@ void shouldDelegateSimpleLogsToLogHandler() throws Exception { String expectedLogEvent = "fakeEvent"; long timeStamp = System.currentTimeMillis(); - DDTracer loggingTracer = DDTracer.builder().writer(writer).logHandler(logHandler).build(); + DDTracer loggingTracer = + DDTracer.builder().writer(writer).logHandler(logHandler).build(); try { - OTSpan span = (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); + OTSpan span = + (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); span.log(timeStamp, expectedLogEvent); @@ -212,9 +222,11 @@ void shouldDelegateSimpleLogsWithTimestampToLogHandler() throws Exception { String expectedName = "fakeName"; String expectedLogEvent = "fakeEvent"; - DDTracer loggingTracer = DDTracer.builder().writer(writer).logHandler(logHandler).build(); + DDTracer loggingTracer = + DDTracer.builder().writer(writer).logHandler(logHandler).build(); try { - OTSpan span = (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); + OTSpan span = + (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); span.log(expectedLogEvent); @@ -230,9 +242,11 @@ void shouldDelegateLogsWithFieldsToLogHandler() throws Exception { String expectedName = "fakeName"; Map fieldsMap = new HashMap<>(); - DDTracer loggingTracer = DDTracer.builder().writer(writer).logHandler(logHandler).build(); + DDTracer loggingTracer = + DDTracer.builder().writer(writer).logHandler(logHandler).build(); try { - OTSpan span = (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); + OTSpan span = + (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); span.log(fieldsMap); @@ -249,9 +263,11 @@ void shouldDelegateLogsWithFieldsAndTimestampToLogHandler() throws Exception { Map fieldsMap = new HashMap<>(); long timeStamp = System.currentTimeMillis(); - DDTracer loggingTracer = DDTracer.builder().writer(writer).logHandler(logHandler).build(); + DDTracer loggingTracer = + DDTracer.builder().writer(writer).logHandler(logHandler).build(); try { - OTSpan span = (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); + OTSpan span = + (OTSpan) loggingTracer.buildSpan(expectedName).withServiceName("foo").start(); span.log(timeStamp, fieldsMap); diff --git a/dd-trace-ot/src/test/java/datadog/opentracing/OTSpanTest.java b/dd-trace-ot/src/test/java/datadog/opentracing/OTSpanTest.java index de4b33fa919..b172a503844 100644 --- a/dd-trace-ot/src/test/java/datadog/opentracing/OTSpanTest.java +++ b/dd-trace-ot/src/test/java/datadog/opentracing/OTSpanTest.java @@ -29,7 +29,8 @@ static void tearDownClass() throws Exception { @Test void testResourceNameAssignmentThroughMutableSpanCasting() { - OTSpan testSpan = (OTSpan) tracer.buildSpan("parent").withResourceName("test-resource").start(); + OTSpan testSpan = + (OTSpan) tracer.buildSpan("parent").withResourceName("test-resource").start(); OTScopeManager.OTScope testScope = (OTScopeManager.OTScope) tracer.activateSpan(testSpan); Span active = tracer.activeSpan(); diff --git a/dd-trace-ot/src/test/java/datadog/opentracing/OpenTracingAPITest.java b/dd-trace-ot/src/test/java/datadog/opentracing/OpenTracingAPITest.java index 72632f84565..917227e9b0a 100644 --- a/dd-trace-ot/src/test/java/datadog/opentracing/OpenTracingAPITest.java +++ b/dd-trace-ot/src/test/java/datadog/opentracing/OpenTracingAPITest.java @@ -91,14 +91,13 @@ void singleSpan() throws Exception { @Test void spanWithBuilder() throws Exception { - Span testSpan = - tracer - .buildSpan("someOperation") - .withTag(Tags.COMPONENT, "opentracing") - .withTag("someBoolean", true) - .withTag("someNumber", 1) - .withTag(DDTags.SERVICE_NAME, "someService") - .start(); + Span testSpan = tracer + .buildSpan("someOperation") + .withTag(Tags.COMPONENT, "opentracing") + .withTag("someBoolean", true) + .withTag("someNumber", 1) + .withTag(DDTags.SERVICE_NAME, "someService") + .start(); Scope scope = null; try { @@ -222,11 +221,10 @@ void nestedSpans() throws Exception { void spanWithAsyncPropagation() throws Exception { AgentTracer.TracerAPI internalTracer = tracer.getInternalTracer(); - Scope scope = - tracer - .buildSpan("someOperation") - .withTag(DDTags.SERVICE_NAME, "someService") - .startActive(true); + Scope scope = tracer + .buildSpan("someOperation") + .withTag(DDTags.SERVICE_NAME, "someService") + .startActive(true); internalTracer.setAsyncPropagationEnabled(false); assertTrue(scope instanceof TraceScope); @@ -257,21 +255,19 @@ void spanWithAsyncPropagation() throws Exception { void spanInheritsAsyncPropagation() throws Exception { AgentTracer.TracerAPI internalTracer = tracer.getInternalTracer(); - Scope outer = - tracer - .buildSpan("someOperation") - .withTag(DDTags.SERVICE_NAME, "someService") - .startActive(true); + Scope outer = tracer + .buildSpan("someOperation") + .withTag(DDTags.SERVICE_NAME, "someService") + .startActive(true); internalTracer.setAsyncPropagationEnabled(false); assertTrue(!internalTracer.isAsyncPropagationEnabled()); internalTracer.setAsyncPropagationEnabled(true); - Scope inner = - tracer - .buildSpan("otherOperation") - .withTag(DDTags.SERVICE_NAME, "otherService") - .startActive(true); + Scope inner = tracer + .buildSpan("otherOperation") + .withTag(DDTags.SERVICE_NAME, "otherService") + .startActive(true); assertTrue(internalTracer.isAsyncPropagationEnabled()); @@ -296,7 +292,8 @@ void spanInheritsAsyncPropagation() throws Exception { @Test void spanContextIdsEqualTracerIds() throws Exception { - Span testSpan = tracer.buildSpan("someOperation").withServiceName("someService").start(); + Span testSpan = + tracer.buildSpan("someOperation").withServiceName("someService").start(); Scope scope = tracer.activateSpan(testSpan); verify(scopeListener).afterScopeActivated(); @@ -413,12 +410,11 @@ void injectAndExtractContext() throws Exception { tracer.inject(testSpan.context(), Format.Builtin.HTTP_HEADERS, textMap); SpanContext extractedContext = tracer.extract(Format.Builtin.HTTP_HEADERS, textMap); - Span serverSpan = - tracer - .buildSpan("serverOperation") - .withServiceName("someService") - .asChildOf(extractedContext) - .start(); + Span serverSpan = tracer + .buildSpan("serverOperation") + .withServiceName("someService") + .asChildOf(extractedContext) + .start(); tracer.activateSpan(serverSpan).close(); serverSpan.finish(); @@ -460,7 +456,8 @@ void tolerateNullSpanActivation() throws Exception { } // make sure scope stack has been left in a valid state - Span testSpan = tracer.buildSpan("someOperation").withServiceName("someService").start(); + Span testSpan = + tracer.buildSpan("someOperation").withServiceName("someService").start(); Scope testScope = tracer.scopeManager().activate(testSpan); testSpan.finish(); testScope.close(); diff --git a/dd-trace-ot/src/test/java/datadog/opentracing/SpanBuilderTest.java b/dd-trace-ot/src/test/java/datadog/opentracing/SpanBuilderTest.java index 47800466751..5acf67111b4 100644 --- a/dd-trace-ot/src/test/java/datadog/opentracing/SpanBuilderTest.java +++ b/dd-trace-ot/src/test/java/datadog/opentracing/SpanBuilderTest.java @@ -35,24 +35,21 @@ void shouldInheritDDParentAttributesAddReferenceChildOf() { String expectedBaggageItemKey = "fakeKey"; String expectedBaggageItemValue = "fakeValue"; - Span parent = - tracer - .buildSpan(expectedName) - .withServiceName("foo") - .withResourceName(expectedParentResourceName) - .withSpanType(expectedParentType) - .start(); + Span parent = tracer + .buildSpan(expectedName) + .withServiceName("foo") + .withResourceName(expectedParentResourceName) + .withSpanType(expectedParentType) + .start(); parent.setBaggageItem(expectedBaggageItemKey, expectedBaggageItemValue); // ServiceName and SpanType are always set by the parent if they are not present in the child - OTSpan span = - (OTSpan) - tracer - .buildSpan(expectedName) - .withServiceName(expectedParentServiceName) - .addReference("child_of", parent.context()) - .start(); + OTSpan span = (OTSpan) tracer + .buildSpan(expectedName) + .withServiceName(expectedParentServiceName) + .addReference("child_of", parent.context()) + .start(); assertEquals(expectedName, span.getDelegate().getOperationName()); assertEquals(expectedBaggageItemValue, span.getBaggageItem(expectedBaggageItemKey)); @@ -65,15 +62,13 @@ void shouldInheritDDParentAttributesAddReferenceChildOf() { assertNull(((DDSpanContext) ((OTSpanContext) span.context()).getDelegate()).getSpanType()); // ServiceName and SpanType are always overwritten by the child if they are present - span = - (OTSpan) - tracer - .buildSpan(expectedName) - .withServiceName(expectedChildServiceName) - .withResourceName(expectedChildResourceName) - .withSpanType(expectedChildType) - .addReference("child_of", parent.context()) - .start(); + span = (OTSpan) tracer + .buildSpan(expectedName) + .withServiceName(expectedChildServiceName) + .withResourceName(expectedChildResourceName) + .withSpanType(expectedChildType) + .addReference("child_of", parent.context()) + .start(); assertEquals(expectedName, span.getDelegate().getOperationName()); assertEquals(expectedBaggageItemValue, span.getBaggageItem(expectedBaggageItemKey)); @@ -100,24 +95,21 @@ void shouldInheritDDParentAttributesAddReferenceFollowsFrom() { String expectedBaggageItemKey = "fakeKey"; String expectedBaggageItemValue = "fakeValue"; - Span parent = - tracer - .buildSpan(expectedName) - .withServiceName("foo") - .withResourceName(expectedParentResourceName) - .withSpanType(expectedParentType) - .start(); + Span parent = tracer + .buildSpan(expectedName) + .withServiceName("foo") + .withResourceName(expectedParentResourceName) + .withSpanType(expectedParentType) + .start(); parent.setBaggageItem(expectedBaggageItemKey, expectedBaggageItemValue); // ServiceName and SpanType are always set by the parent if they are not present in the child - OTSpan span = - (OTSpan) - tracer - .buildSpan(expectedName) - .withServiceName(expectedParentServiceName) - .addReference("follows_from", parent.context()) - .start(); + OTSpan span = (OTSpan) tracer + .buildSpan(expectedName) + .withServiceName(expectedParentServiceName) + .addReference("follows_from", parent.context()) + .start(); assertEquals(expectedName, span.getDelegate().getOperationName()); assertEquals(expectedBaggageItemValue, span.getBaggageItem(expectedBaggageItemKey)); @@ -130,15 +122,13 @@ void shouldInheritDDParentAttributesAddReferenceFollowsFrom() { assertNull(((DDSpanContext) ((OTSpanContext) span.context()).getDelegate()).getSpanType()); // ServiceName and SpanType are always overwritten by the child if they are present - span = - (OTSpan) - tracer - .buildSpan(expectedName) - .withServiceName(expectedChildServiceName) - .withResourceName(expectedChildResourceName) - .withSpanType(expectedChildType) - .addReference("follows_from", parent.context()) - .start(); + span = (OTSpan) tracer + .buildSpan(expectedName) + .withServiceName(expectedChildServiceName) + .withResourceName(expectedChildResourceName) + .withSpanType(expectedChildType) + .addReference("follows_from", parent.context()) + .start(); assertEquals(expectedName, span.getDelegate().getOperationName()); assertEquals(expectedBaggageItemValue, span.getBaggageItem(expectedBaggageItemKey)); diff --git a/internal-api/internal-api-9/src/jmh/java/datadog/trace/util/stacktrace/JDK9StackWalkerBenchmark.java b/internal-api/internal-api-9/src/jmh/java/datadog/trace/util/stacktrace/JDK9StackWalkerBenchmark.java index cec9f4625df..dfa1122f4b8 100644 --- a/internal-api/internal-api-9/src/jmh/java/datadog/trace/util/stacktrace/JDK9StackWalkerBenchmark.java +++ b/internal-api/internal-api-9/src/jmh/java/datadog/trace/util/stacktrace/JDK9StackWalkerBenchmark.java @@ -61,17 +61,16 @@ private List toLimitedList(final Stream st private void generateStack(final StackWalker stackWalker) { - Runnable runnable = - new Runnable() { - @Override - public void run() { - stackWalker.walk(this::toLimitedList); - } + Runnable runnable = new Runnable() { + @Override + public void run() { + stackWalker.walk(this::toLimitedList); + } - private List toLimitedList(final Stream stack) { - return stack.limit(limit).collect(Collectors.toList()); - } - }; + private List toLimitedList(final Stream stack) { + return stack.limit(limit).collect(Collectors.toList()); + } + }; RecursiveRunner runner = new RecursiveRunner(deep, runnable); runner.run(); diff --git a/internal-api/src/jmh/java/datadog/trace/api/sampling/AdaptiveSamplerBenchmark.java b/internal-api/src/jmh/java/datadog/trace/api/sampling/AdaptiveSamplerBenchmark.java index a425c813f69..0c378a3fd41 100644 --- a/internal-api/src/jmh/java/datadog/trace/api/sampling/AdaptiveSamplerBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/api/sampling/AdaptiveSamplerBenchmark.java @@ -39,13 +39,12 @@ public class AdaptiveSamplerBenchmark { @Setup(Level.Iteration) public void setup() { int averageLookback = (int) (ITERATION_TIME_MILLIS / durationWindowMillis); - sampler = - new AdaptiveSampler( - Duration.of(durationWindowMillis, ChronoUnit.MILLIS), - samplesPerWindow, - averageLookback, - BUDGET_LOOKBACK, - true); + sampler = new AdaptiveSampler( + Duration.of(durationWindowMillis, ChronoUnit.MILLIS), + samplesPerWindow, + averageLookback, + BUDGET_LOOKBACK, + true); } @Threads(4) diff --git a/internal-api/src/jmh/java/datadog/trace/util/AtomicsBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/AtomicsBenchmark.java index b1a7f0d26c1..470db64478e 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/AtomicsBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/AtomicsBenchmark.java @@ -101,25 +101,21 @@ int incrementAndGet() { } } - static final AtomicHolder[] atomicHolders = - init( - () -> { - AtomicHolder[] holders = new AtomicHolder[SIZE]; - for (int i = 0; i < holders.length; ++i) { - holders[i] = new AtomicHolder(i * 2); - } - return holders; - }); - - static final FieldHolder[] fieldHolders = - init( - () -> { - FieldHolder[] holders = new FieldHolder[SIZE]; - for (int i = 0; i < holders.length; ++i) { - holders[i] = new FieldHolder(i * 2); - } - return holders; - }); + static final AtomicHolder[] atomicHolders = init(() -> { + AtomicHolder[] holders = new AtomicHolder[SIZE]; + for (int i = 0; i < holders.length; ++i) { + holders[i] = new AtomicHolder(i * 2); + } + return holders; + }); + + static final FieldHolder[] fieldHolders = init(() -> { + FieldHolder[] holders = new FieldHolder[SIZE]; + for (int i = 0; i < holders.length; ++i) { + holders[i] = new FieldHolder(i * 2); + } + return holders; + }); static final T init(Supplier supplier) { return supplier.get(); diff --git a/internal-api/src/jmh/java/datadog/trace/util/CaseInsensitiveMapBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/CaseInsensitiveMapBenchmark.java index 9cbbddcf299..bf27b16c7c0 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/CaseInsensitiveMapBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/CaseInsensitiveMapBenchmark.java @@ -67,32 +67,28 @@ static T init(Supplier supplier) { return supplier.get(); } - static final String[] UPPER_PREFIXES = - init( - () -> { - String[] upperPrefixes = new String[PREFIXES.length]; - for (int i = 0; i < PREFIXES.length; ++i) { - upperPrefixes[i] = PREFIXES[i].toUpperCase(); - } - return upperPrefixes; - }); - - static final String[] LOOKUP_KEYS = - init( - () -> { - ThreadLocalRandom curRandom = ThreadLocalRandom.current(); - - String[] keys = new String[32]; - for (int i = 0; i < keys.length; ++i) { - int prefixIndex = curRandom.nextInt(PREFIXES.length); - boolean toUpper = curRandom.nextBoolean(); - int suffixIndex = curRandom.nextInt(NUM_SUFFIXES + 1); - - String key = PREFIXES[prefixIndex] + "-" + suffixIndex; - keys[i] = toUpper ? key.toUpperCase() : key.toLowerCase(); - } - return keys; - }); + static final String[] UPPER_PREFIXES = init(() -> { + String[] upperPrefixes = new String[PREFIXES.length]; + for (int i = 0; i < PREFIXES.length; ++i) { + upperPrefixes[i] = PREFIXES[i].toUpperCase(); + } + return upperPrefixes; + }); + + static final String[] LOOKUP_KEYS = init(() -> { + ThreadLocalRandom curRandom = ThreadLocalRandom.current(); + + String[] keys = new String[32]; + for (int i = 0; i < keys.length; ++i) { + int prefixIndex = curRandom.nextInt(PREFIXES.length); + boolean toUpper = curRandom.nextBoolean(); + int suffixIndex = curRandom.nextInt(NUM_SUFFIXES + 1); + + String key = PREFIXES[prefixIndex] + "-" + suffixIndex; + keys[i] = toUpper ? key.toUpperCase() : key.toLowerCase(); + } + return keys; + }); // Per-thread (@State(Scope.Thread)) so cycling the lookup key doesn't contend a shared counter. // The maps stay static/shared (read-only after class-init); only the index is per-thread. A diff --git a/internal-api/src/jmh/java/datadog/trace/util/FlatHashtableIteratorBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/FlatHashtableIteratorBenchmark.java index 43d928176b1..a8e1a8e5a12 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/FlatHashtableIteratorBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/FlatHashtableIteratorBenchmark.java @@ -104,13 +104,12 @@ public long hashOf(ItEntry entry) { } @SuppressWarnings({"unchecked", "rawtypes"}) - static final FlatHashtable.HashStrategy[] STRATEGIES = - new FlatHashtable.HashStrategy[] { - ItHashStrategyA.INSTANCE, - ItHashStrategyB.INSTANCE, - ItHashStrategyC.INSTANCE, - ItHashStrategyD.INSTANCE, - }; + static final FlatHashtable.HashStrategy[] STRATEGIES = new FlatHashtable.HashStrategy[] { + ItHashStrategyA.INSTANCE, + ItHashStrategyB.INSTANCE, + ItHashStrategyC.INSTANCE, + ItHashStrategyD.INSTANCE, + }; ItEntry[] table; diff --git a/internal-api/src/jmh/java/datadog/trace/util/HashingBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/HashingBenchmark.java index 9dc6faf5f6d..4c9f689be5a 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/HashingBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/HashingBenchmark.java @@ -64,32 +64,28 @@ static T init(Supplier supplier) { } // strings used in hashing are set up ahead of time, so that the only allocation is from var-args - static String[] TEST_STRINGS = - init( - () -> { - ThreadLocalRandom random = ThreadLocalRandom.current(); + static String[] TEST_STRINGS = init(() -> { + ThreadLocalRandom random = ThreadLocalRandom.current(); - String[] strings = new String[1024]; - for (int i = 0; i < strings.length; ++i) { - strings[i] = Double.toString(random.nextDouble()); - } - return strings; - }); + String[] strings = new String[1024]; + for (int i = 0; i < strings.length; ++i) { + strings[i] = Double.toString(random.nextDouble()); + } + return strings; + }); static { - Thread updaterThread = - new Thread( - () -> { - ThreadLocalRandom random = ThreadLocalRandom.current(); + Thread updaterThread = new Thread(() -> { + ThreadLocalRandom random = ThreadLocalRandom.current(); - while (!Thread.interrupted()) { - str0 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; - str1 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; - str2 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; - str3 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; - str4 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; - } - }); + while (!Thread.interrupted()) { + str0 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; + str1 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; + str2 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; + str3 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; + str4 = TEST_STRINGS[random.nextInt(0, TEST_STRINGS.length)]; + } + }); updaterThread.setDaemon(true); updaterThread.start(); } diff --git a/internal-api/src/jmh/java/datadog/trace/util/ImmutableMapBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/ImmutableMapBenchmark.java index 39aaf82183c..8bf37984d8f 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/ImmutableMapBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/ImmutableMapBenchmark.java @@ -240,12 +240,10 @@ public void iterate_tagMap(Blackhole blackhole) { @Benchmark public void iterate_tagMap_forEach(Blackhole blackhole) { // Taking advantage of passthrough of contextObj to avoid capturing lambda - tagMap.forEach( - blackhole, - (bh, entry) -> { - bh.consume(entry.tag()); - bh.consume(entry.intValue()); - }); + tagMap.forEach(blackhole, (bh, entry) -> { + bh.consume(entry.tag()); + bh.consume(entry.intValue()); + }); } @Benchmark diff --git a/internal-api/src/jmh/java/datadog/trace/util/ListIterationBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/ListIterationBenchmark.java index 30580f44719..b2def5ffe43 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/ListIterationBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/ListIterationBenchmark.java @@ -118,7 +118,8 @@ List build() { } } - @Param ListSpec listSpec; + @Param + ListSpec listSpec; List list; diff --git a/internal-api/src/jmh/java/datadog/trace/util/SingleThreadedMapBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/SingleThreadedMapBenchmark.java index cb792cc1ca9..f5cdb34a71f 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/SingleThreadedMapBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/SingleThreadedMapBenchmark.java @@ -334,12 +334,9 @@ public void iterate_synchronizedHashMap(Blackhole blackhole) { @Benchmark public void iterate_flatHashtable(Blackhole blackhole) { // Context-passing forEach: blackhole rides through as context, so the lambda doesn't capture. - FlatHashtable.forEach( - flatTable, - blackhole, - (bh, e) -> { - bh.consume(e.key); - bh.consume(e.value); - }); + FlatHashtable.forEach(flatTable, blackhole, (bh, e) -> { + bh.consume(e.key); + bh.consume(e.value); + }); } } diff --git a/internal-api/src/jmh/java/datadog/trace/util/StringSplitBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/StringSplitBenchmark.java index 584c375cdea..d9a6af4a659 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/StringSplitBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/StringSplitBenchmark.java @@ -58,7 +58,8 @@ public enum TestString { } }; - @Param TestString testStr; + @Param + TestString testStr; static final String repeat(String repeat, char separator, int length) { StringBuilder builder = new StringBuilder(length); diff --git a/internal-api/src/jmh/java/datadog/trace/util/escape/EscapeShapeBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/escape/EscapeShapeBenchmark.java index 8f9ab1c63fe..971c0c885da 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/escape/EscapeShapeBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/escape/EscapeShapeBenchmark.java @@ -156,16 +156,15 @@ public void close() {} } /** The absent outcome, reachable from a static, so the merge it takes part in is not local. */ - static final Outcome STATIC_SINGLETON = - new Outcome() { - @Override - public int value() { - return 0; - } - - @Override - public void close() {} - }; + static final Outcome STATIC_SINGLETON = new Outcome() { + @Override + public int value() { + return 0; + } + + @Override + public void close() {} + }; /** One allocation site carrying the outcome in a field: the shape that survives. */ static final class FlaggedAllocation { diff --git a/internal-api/src/jmh/java/datadog/trace/util/stacktrace/HotSpotStackWalkerBenchmark.java b/internal-api/src/jmh/java/datadog/trace/util/stacktrace/HotSpotStackWalkerBenchmark.java index e511e9eb186..519c369ac23 100644 --- a/internal-api/src/jmh/java/datadog/trace/util/stacktrace/HotSpotStackWalkerBenchmark.java +++ b/internal-api/src/jmh/java/datadog/trace/util/stacktrace/HotSpotStackWalkerBenchmark.java @@ -58,18 +58,17 @@ public void defaultStackWalkerWalk() { private void generateStack(final StackWalker stackWalker) { - Runnable runnable = - new Runnable() { - @SuppressForbidden - @Override - public void run() { - stackWalker.walk(this::toLimitedList).forEach(System.out::println); - } + Runnable runnable = new Runnable() { + @SuppressForbidden + @Override + public void run() { + stackWalker.walk(this::toLimitedList).forEach(System.out::println); + } - private List toLimitedList(final Stream stack) { - return stack.limit(limit).collect(Collectors.toList()); - } - }; + private List toLimitedList(final Stream stack) { + return stack.limit(limit).collect(Collectors.toList()); + } + }; RecursiveRunner runner = new RecursiveRunner(deep, runnable); } diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index a97f7bda2d0..93e2962d4a3 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -1000,7 +1000,10 @@ public static String getHostName() { private final boolean jmxFetchEnabled; private final String jmxFetchConfigDir; private final List jmxFetchConfigs; - @Deprecated private final List jmxFetchMetricsConfigs; + + @Deprecated + private final List jmxFetchMetricsConfigs; + private final Integer jmxFetchCheckPeriod; private final Integer jmxFetchInitialRefreshBeansPeriod; private final Integer jmxFetchRefreshBeansPeriod; @@ -1078,7 +1081,10 @@ public static String getHostName() { private final ProfilingEnablement profilingEnabled; private final boolean profilingAgentless; private final boolean isDatadogProfilerEnabled; - @Deprecated private final String profilingUrl; + + @Deprecated + private final String profilingUrl; + private final Map profilingTags; private final int profilingStartDelay; private final boolean profilingStartForceFirst; @@ -1284,7 +1290,10 @@ public static String getHostName() { private final boolean symbolDatabaseCompressed; private final boolean debuggerExceptionEnabled; private final int debuggerMaxExceptionPerSecond; - @Deprecated private final boolean debuggerExceptionOnlyLocalRoot; + + @Deprecated + private final boolean debuggerExceptionOnlyLocalRoot; + private final boolean debuggerExceptionCaptureIntermediateSpansEnabled; private final int debuggerExceptionMaxCapturedFrames; private final int debuggerExceptionCaptureInterval; @@ -1437,8 +1446,13 @@ public static String getHostName() { private final String agentlessLogSubmissionProduct; private final Set cloudPayloadTaggingServices; - @Nullable private final List cloudRequestPayloadTagging; - @Nullable private final List cloudResponsePayloadTagging; + + @Nullable + private final List cloudRequestPayloadTagging; + + @Nullable + private final List cloudResponsePayloadTagging; + private final int cloudPayloadTaggingMaxDepth; private final int cloudPayloadTaggingMaxTags; @@ -1508,24 +1522,22 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins } site = configProvider.getString(SITE, DEFAULT_SITE); - String tmpApplicationKey = - configProvider.getStringExcludingSource( - APPLICATION_KEY, null, SystemPropertiesConfigSource.class, APP_KEY); + String tmpApplicationKey = configProvider.getStringExcludingSource( + APPLICATION_KEY, null, SystemPropertiesConfigSource.class, APP_KEY); String applicationKeyFile = configProvider.getString(APPLICATION_KEY_FILE); if (applicationKeyFile != null) { try { - tmpApplicationKey = - new String(Files.readAllBytes(Paths.get(applicationKeyFile)), StandardCharsets.UTF_8) - .trim(); + tmpApplicationKey = new String( + Files.readAllBytes(Paths.get(applicationKeyFile)), StandardCharsets.UTF_8) + .trim(); } catch (final IOException e) { log.error("Cannot read API key from file {}, skipping", applicationKeyFile, e); } } applicationKey = tmpApplicationKey; - String userProvidedServiceName = - configProvider.getStringExcludingSource( - SERVICE, null, CapturedEnvironmentConfigSource.class, SERVICE_NAME); + String userProvidedServiceName = configProvider.getStringExcludingSource( + SERVICE, null, CapturedEnvironmentConfigSource.class, SERVICE_NAME); if (userProvidedServiceName == null) { serviceNameSetByUser = false; @@ -1536,9 +1548,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins serviceName = userProvidedServiceName; } - rootContextServiceName = - configProvider.getString( - SERVLET_ROOT_CONTEXT_SERVICE_NAME, DEFAULT_SERVLET_ROOT_CONTEXT_SERVICE_NAME); + rootContextServiceName = configProvider.getString( + SERVLET_ROOT_CONTEXT_SERVICE_NAME, DEFAULT_SERVLET_ROOT_CONTEXT_SERVICE_NAME); experimentalFeaturesEnabled = configProvider.getString(TRACE_EXPERIMENTAL_FEATURES_ENABLED, "").equals("all") @@ -1549,9 +1560,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins configProvider.getBoolean(INTEGRATION_SYNAPSE_LEGACY_OPERATION_NAME, false); traceOtelExporter = configProvider.getString(TRACE_OTEL_EXPORTER); boolean otlpTracesExporter = isTraceOtlpExporterEnabled(); - writerType = - configProvider.getString( - WRITER_TYPE, otlpTracesExporter ? OTLP_WRITER_TYPE : DEFAULT_AGENT_WRITER_TYPE); + writerType = configProvider.getString( + WRITER_TYPE, otlpTracesExporter ? OTLP_WRITER_TYPE : DEFAULT_AGENT_WRITER_TYPE); boolean isDatadogTraceWriter = !otlpTracesExporter; injectBaggageAsTagsEnabled = configProvider.getBoolean(WRITER_BAGGAGE_INJECT, isDatadogTraceWriter); @@ -1564,34 +1574,26 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins } else { secureRandom = configProvider.getBoolean(SECURE_RANDOM, DEFAULT_SECURE_RANDOM); } - lambdaSnapStartClockResyncEnabled = - configProvider.getBoolean( - TRACE_LAMBDA_SNAPSTART_CLOCK_RESYNC_ENABLED, - DEFAULT_TRACE_LAMBDA_SNAPSTART_CLOCK_RESYNC_ENABLED); - cassandraKeyspaceStatementExtractionEnabled = - configProvider.getBoolean( - CASSANDRA_KEYSPACE_STATEMENT_EXTRACTION_ENABLED, - DEFAULT_CASSANDRA_KEYSPACE_STATEMENT_EXTRACTION_ENABLED); - couchbaseInternalSpansEnabled = - configProvider.getBoolean( - COUCHBASE_INTERNAL_SPANS_ENABLED, DEFAULT_COUCHBASE_INTERNAL_SPANS_ENABLED); + lambdaSnapStartClockResyncEnabled = configProvider.getBoolean( + TRACE_LAMBDA_SNAPSTART_CLOCK_RESYNC_ENABLED, + DEFAULT_TRACE_LAMBDA_SNAPSTART_CLOCK_RESYNC_ENABLED); + cassandraKeyspaceStatementExtractionEnabled = configProvider.getBoolean( + CASSANDRA_KEYSPACE_STATEMENT_EXTRACTION_ENABLED, + DEFAULT_CASSANDRA_KEYSPACE_STATEMENT_EXTRACTION_ENABLED); + couchbaseInternalSpansEnabled = configProvider.getBoolean( + COUCHBASE_INTERNAL_SPANS_ENABLED, DEFAULT_COUCHBASE_INTERNAL_SPANS_ENABLED); elasticsearchBodyEnabled = configProvider.getBoolean(ELASTICSEARCH_BODY_ENABLED, DEFAULT_ELASTICSEARCH_BODY_ENABLED); - elasticsearchParamsEnabled = - configProvider.getBoolean( - ELASTICSEARCH_PARAMS_ENABLED, DEFAULT_ELASTICSEARCH_PARAMS_ENABLED); - elasticsearchBodyAndParamsEnabled = - configProvider.getBoolean( - ELASTICSEARCH_BODY_AND_PARAMS_ENABLED, DEFAULT_ELASTICSEARCH_BODY_AND_PARAMS_ENABLED); + elasticsearchParamsEnabled = configProvider.getBoolean( + ELASTICSEARCH_PARAMS_ENABLED, DEFAULT_ELASTICSEARCH_PARAMS_ENABLED); + elasticsearchBodyAndParamsEnabled = configProvider.getBoolean( + ELASTICSEARCH_BODY_AND_PARAMS_ENABLED, DEFAULT_ELASTICSEARCH_BODY_AND_PARAMS_ENABLED); String strategyName = configProvider.getString(ID_GENERATION_STRATEGY); - trace128bitTraceIdGenerationEnabled = - configProvider.getBoolean( - TRACE_128_BIT_TRACEID_GENERATION_ENABLED, - DEFAULT_TRACE_128_BIT_TRACEID_GENERATION_ENABLED); + trace128bitTraceIdGenerationEnabled = configProvider.getBoolean( + TRACE_128_BIT_TRACEID_GENERATION_ENABLED, DEFAULT_TRACE_128_BIT_TRACEID_GENERATION_ENABLED); - logs128bitTraceIdEnabled = - configProvider.getBoolean( - TRACE_128_BIT_TRACEID_LOGGING_ENABLED, DEFAULT_TRACE_128_BIT_TRACEID_LOGGING_ENABLED); + logs128bitTraceIdEnabled = configProvider.getBoolean( + TRACE_128_BIT_TRACEID_LOGGING_ENABLED, DEFAULT_TRACE_128_BIT_TRACEID_LOGGING_ENABLED); if (secureRandom) { strategyName = "SECURE_RANDOM"; @@ -1684,11 +1686,10 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins agentNamedPipe = configProvider.getString(AGENT_NAMED_PIPE); - agentConfiguredUsingDefault = - agentHostFromEnvironment == null - && agentPortFromEnvironment < 0 - && unixSocketFromEnvironment == null - && agentNamedPipe == null; + agentConfiguredUsingDefault = agentHostFromEnvironment == null + && agentPortFromEnvironment < 0 + && unixSocketFromEnvironment == null + && agentNamedPipe == null; agentTimeout = configProvider.getInteger(AGENT_TIMEOUT, DEFAULT_AGENT_TIMEOUT); @@ -1735,12 +1736,10 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins logIgnoredSettingWarning(RESPONSE_HEADER_TAGS, HEADER_TAGS, ".legacy.parsing.enabled"); } } else { - requestHeaderTags = - configProvider.getMergedMapWithOptionalMappings( - "http.request.headers.", true, HEADER_TAGS, REQUEST_HEADER_TAGS); - responseHeaderTags = - configProvider.getMergedMapWithOptionalMappings( - "http.response.headers.", true, HEADER_TAGS, RESPONSE_HEADER_TAGS); + requestHeaderTags = configProvider.getMergedMapWithOptionalMappings( + "http.request.headers.", true, HEADER_TAGS, REQUEST_HEADER_TAGS); + responseHeaderTags = configProvider.getMergedMapWithOptionalMappings( + "http.response.headers.", true, HEADER_TAGS, RESPONSE_HEADER_TAGS); } requestHeaderTagsCommaAllowed = configProvider.getBoolean(REQUEST_HEADER_TAGS_COMMA_ALLOWED, true); @@ -1750,8 +1749,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins azureFunctions = getEnv("FUNCTIONS_WORKER_RUNTIME") != null && getEnv("FUNCTIONS_EXTENSION_VERSION") != null; - awsServerless = - getEnv("AWS_LAMBDA_FUNCTION_NAME") != null && !getEnv("AWS_LAMBDA_FUNCTION_NAME").isEmpty(); + awsServerless = getEnv("AWS_LAMBDA_FUNCTION_NAME") != null + && !getEnv("AWS_LAMBDA_FUNCTION_NAME").isEmpty(); sfnInjectDatadogAttributeEnabled = isInjectDatadogAttributeEnabled(DEFAULT_INJECT_DATADOG_ATTRIBUTE, "sfn"); @@ -1787,26 +1786,22 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins httpClientPathResourceNameMapping = configProvider.getOrderedMap(TRACE_HTTP_CLIENT_PATH_RESOURCE_NAME_MAPPING); - httpResourceRemoveTrailingSlash = - configProvider.getBoolean( - TRACE_HTTP_RESOURCE_REMOVE_TRAILING_SLASH, - DEFAULT_TRACE_HTTP_RESOURCE_REMOVE_TRAILING_SLASH); + httpResourceRemoveTrailingSlash = configProvider.getBoolean( + TRACE_HTTP_RESOURCE_REMOVE_TRAILING_SLASH, + DEFAULT_TRACE_HTTP_RESOURCE_REMOVE_TRAILING_SLASH); - httpServerErrorStatuses = - configProvider.getIntegerRange( - TRACE_HTTP_SERVER_ERROR_STATUSES, - DEFAULT_HTTP_SERVER_ERROR_STATUSES, - HTTP_SERVER_ERROR_STATUSES); + httpServerErrorStatuses = configProvider.getIntegerRange( + TRACE_HTTP_SERVER_ERROR_STATUSES, + DEFAULT_HTTP_SERVER_ERROR_STATUSES, + HTTP_SERVER_ERROR_STATUSES); - httpClientErrorStatuses = - configProvider.getIntegerRange( - TRACE_HTTP_CLIENT_ERROR_STATUSES, - DEFAULT_HTTP_CLIENT_ERROR_STATUSES, - HTTP_CLIENT_ERROR_STATUSES); + httpClientErrorStatuses = configProvider.getIntegerRange( + TRACE_HTTP_CLIENT_ERROR_STATUSES, + DEFAULT_HTTP_CLIENT_ERROR_STATUSES, + HTTP_CLIENT_ERROR_STATUSES); - httpServerTagQueryString = - configProvider.getBoolean( - HTTP_SERVER_TAG_QUERY_STRING, DEFAULT_HTTP_SERVER_TAG_QUERY_STRING); + httpServerTagQueryString = configProvider.getBoolean( + HTTP_SERVER_TAG_QUERY_STRING, DEFAULT_HTTP_SERVER_TAG_QUERY_STRING); httpServerRawQueryString = configProvider.getBoolean(HTTP_SERVER_RAW_QUERY_STRING, true); @@ -1815,65 +1810,53 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins httpServerDecodedResourcePreserveSpaces = configProvider.getBoolean(HTTP_SERVER_DECODED_RESOURCE_PRESERVE_SPACES, true); - httpServerRouteBasedNaming = - configProvider.getBoolean( - HTTP_SERVER_ROUTE_BASED_NAMING, DEFAULT_HTTP_SERVER_ROUTE_BASED_NAMING); + httpServerRouteBasedNaming = configProvider.getBoolean( + HTTP_SERVER_ROUTE_BASED_NAMING, DEFAULT_HTTP_SERVER_ROUTE_BASED_NAMING); - httpClientTagQueryString = - configProvider.getBoolean( - TRACE_HTTP_CLIENT_TAG_QUERY_STRING, - DEFAULT_HTTP_CLIENT_TAG_QUERY_STRING, - HTTP_CLIENT_TAG_QUERY_STRING); + httpClientTagQueryString = configProvider.getBoolean( + TRACE_HTTP_CLIENT_TAG_QUERY_STRING, + DEFAULT_HTTP_CLIENT_TAG_QUERY_STRING, + HTTP_CLIENT_TAG_QUERY_STRING); httpClientTagHeaders = configProvider.getBoolean(HTTP_CLIENT_TAG_HEADERS, true); - httpClientSplitByDomain = - configProvider.getBoolean( - HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN); + httpClientSplitByDomain = configProvider.getBoolean( + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN); - dbClientSplitByInstance = - configProvider.getBoolean( - DB_CLIENT_HOST_SPLIT_BY_INSTANCE, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE); + dbClientSplitByInstance = configProvider.getBoolean( + DB_CLIENT_HOST_SPLIT_BY_INSTANCE, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE); - dbClientSplitByInstanceTypeSuffix = - configProvider.getBoolean( - DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX, - DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX); + dbClientSplitByInstanceTypeSuffix = configProvider.getBoolean( + DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX, + DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX); dbMetadataFetchingOnQuery = configProvider.getBoolean(DB_METADATA_FETCHING_ON_QUERY, true); dbMetadataFetchingOnConnect = configProvider.getBoolean(DB_METADATA_FETCHING_ON_CONNECT, true); - dbClientSplitByHost = - configProvider.getBoolean( - DB_CLIENT_HOST_SPLIT_BY_HOST, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST); + dbClientSplitByHost = configProvider.getBoolean( + DB_CLIENT_HOST_SPLIT_BY_HOST, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST); - dbmPropagationMode = - configProvider.getString( - DB_DBM_PROPAGATION_MODE_MODE, DEFAULT_DB_DBM_PROPAGATION_MODE_MODE); + dbmPropagationMode = configProvider.getString( + DB_DBM_PROPAGATION_MODE_MODE, DEFAULT_DB_DBM_PROPAGATION_MODE_MODE); - dbmTracePreparedStatements = - configProvider.getBoolean( - DB_DBM_TRACE_PREPARED_STATEMENTS, DEFAULT_DB_DBM_TRACE_PREPARED_STATEMENTS); + dbmTracePreparedStatements = configProvider.getBoolean( + DB_DBM_TRACE_PREPARED_STATEMENTS, DEFAULT_DB_DBM_TRACE_PREPARED_STATEMENTS); - dbmAlwaysAppendSqlComment = - configProvider.getBoolean( - DB_DBM_ALWAYS_APPEND_SQL_COMMENT, DEFAULT_DB_DBM_ALWAYS_APPEND_SQL_COMMENT); + dbmAlwaysAppendSqlComment = configProvider.getBoolean( + DB_DBM_ALWAYS_APPEND_SQL_COMMENT, DEFAULT_DB_DBM_ALWAYS_APPEND_SQL_COMMENT); - dbmInjectSqlBaseHash = - configProvider.getBoolean(DB_DBM_INJECT_SQL_BASEHASH, false) - || DBM_PROPAGATION_MODE_DYNAMIC_SERVICE.equals(dbmPropagationMode); + dbmInjectSqlBaseHash = configProvider.getBoolean(DB_DBM_INJECT_SQL_BASEHASH, false) + || DBM_PROPAGATION_MODE_DYNAMIC_SERVICE.equals(dbmPropagationMode); splitByTags = tryMakeImmutableSet(configProvider.getList(SPLIT_BY_TAGS)); - traceStatsAdditionalTags = - experimentalFeaturesEnabled.contains( - propertyNameToEnvironmentVariableName(TRACE_STATS_ADDITIONAL_TAGS)) - ? tryMakeImmutableSet(configProvider.getList(TRACE_STATS_ADDITIONAL_TAGS)) - : Collections.emptySet(); + traceStatsAdditionalTags = experimentalFeaturesEnabled.contains( + propertyNameToEnvironmentVariableName(TRACE_STATS_ADDITIONAL_TAGS)) + ? tryMakeImmutableSet(configProvider.getList(TRACE_STATS_ADDITIONAL_TAGS)) + : Collections.emptySet(); - jeeSplitByDeployment = - configProvider.getBoolean( - EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT, DEFAULT_EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT); + jeeSplitByDeployment = configProvider.getBoolean( + EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT, DEFAULT_EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT); springDataRepositoryInterfaceResourceName = configProvider.getBoolean(SPRING_DATA_REPOSITORY_INTERFACE_RESOURCE_NAME, true); @@ -1886,37 +1869,31 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins configProvider.getInteger(SCOPE_ITERATION_KEEP_ALIVE, DEFAULT_SCOPE_ITERATION_KEEP_ALIVE); boolean partialFlushEnabled = configProvider.getBoolean(PARTIAL_FLUSH_ENABLED, true); - partialFlushMinSpans = - !partialFlushEnabled - ? 0 - : configProvider.getInteger(PARTIAL_FLUSH_MIN_SPANS, DEFAULT_PARTIAL_FLUSH_MIN_SPANS); + partialFlushMinSpans = !partialFlushEnabled + ? 0 + : configProvider.getInteger(PARTIAL_FLUSH_MIN_SPANS, DEFAULT_PARTIAL_FLUSH_MIN_SPANS); - traceKeepLatencyThreshold = - configProvider.getInteger( - TRACE_KEEP_LATENCY_THRESHOLD_MS, DEFAULT_TRACE_KEEP_LATENCY_THRESHOLD_MS); + traceKeepLatencyThreshold = configProvider.getInteger( + TRACE_KEEP_LATENCY_THRESHOLD_MS, DEFAULT_TRACE_KEEP_LATENCY_THRESHOLD_MS); traceKeepLatencyThresholdEnabled = !partialFlushEnabled && (traceKeepLatencyThreshold > 0); traceStrictWritesEnabled = configProvider.getBoolean(TRACE_STRICT_WRITES_ENABLED, false); - logExtractHeaderNames = - configProvider.getBoolean( - PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED, - DEFAULT_PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED); + logExtractHeaderNames = configProvider.getBoolean( + PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED, + DEFAULT_PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED); - tracePropagationStyleB3PaddingEnabled = - isEnabled( - DEFAULT_PROPAGATION_B3_PADDING_ENABLED, TRACE_PROPAGATION_STYLE, ".b3.padding.enabled"); + tracePropagationStyleB3PaddingEnabled = isEnabled( + DEFAULT_PROPAGATION_B3_PADDING_ENABLED, TRACE_PROPAGATION_STYLE, ".b3.padding.enabled"); TracePropagationBehaviorExtract tmpTracePropagationBehaviorExtract; try { - tmpTracePropagationBehaviorExtract = - TracePropagationBehaviorExtract.valueOf( - configProvider - .getString( - TRACE_PROPAGATION_BEHAVIOR_EXTRACT, - DEFAULT_TRACE_PROPAGATION_BEHAVIOR_EXTRACT.toString()) - .toUpperCase(Locale.ROOT)); + tmpTracePropagationBehaviorExtract = TracePropagationBehaviorExtract.valueOf(configProvider + .getString( + TRACE_PROPAGATION_BEHAVIOR_EXTRACT, + DEFAULT_TRACE_PROPAGATION_BEHAVIOR_EXTRACT.toString()) + .toUpperCase(Locale.ROOT)); } catch (IllegalArgumentException e) { tmpTracePropagationBehaviorExtract = TracePropagationBehaviorExtract.CONTINUE; log.warn("Error while parsing TRACE_PROPAGATION_BEHAVIOR_EXTRACT, defaulting to `continue`"); @@ -1931,21 +1908,16 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins // * dd.trace.propagation.style.(extract|inject) // * dd.trace.propagation.style // * dd.propagation.style.(extract|inject) - Set deprecatedExtract = - getSettingsSetFromEnvironment( - PROPAGATION_STYLE_EXTRACT, PropagationStyle::valueOfConfigName, true); - Set deprecatedInject = - getSettingsSetFromEnvironment( - PROPAGATION_STYLE_INJECT, PropagationStyle::valueOfConfigName, true); - Set common = - getSettingsSetFromEnvironment( - TRACE_PROPAGATION_STYLE, TracePropagationStyle::valueOfDisplayName, false); - Set extract = - getSettingsSetFromEnvironment( - TRACE_PROPAGATION_STYLE_EXTRACT, TracePropagationStyle::valueOfDisplayName, false); - Set inject = - getSettingsSetFromEnvironment( - TRACE_PROPAGATION_STYLE_INJECT, TracePropagationStyle::valueOfDisplayName, false); + Set deprecatedExtract = getSettingsSetFromEnvironment( + PROPAGATION_STYLE_EXTRACT, PropagationStyle::valueOfConfigName, true); + Set deprecatedInject = getSettingsSetFromEnvironment( + PROPAGATION_STYLE_INJECT, PropagationStyle::valueOfConfigName, true); + Set common = getSettingsSetFromEnvironment( + TRACE_PROPAGATION_STYLE, TracePropagationStyle::valueOfDisplayName, false); + Set extract = getSettingsSetFromEnvironment( + TRACE_PROPAGATION_STYLE_EXTRACT, TracePropagationStyle::valueOfDisplayName, false); + Set inject = getSettingsSetFromEnvironment( + TRACE_PROPAGATION_STYLE_INJECT, TracePropagationStyle::valueOfDisplayName, false); String extractOrigin = TRACE_PROPAGATION_STYLE_EXTRACT; String injectOrigin = TRACE_PROPAGATION_STYLE_INJECT; // Check if we should use the common setting for extraction @@ -2005,14 +1977,12 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins tracePropagationStylesToInject = inject.isEmpty() ? DEFAULT_TRACE_PROPAGATION_STYLE : inject; - traceBaggageMaxItems = - nonNegativeBaggageLimit( - TRACE_BAGGAGE_MAX_ITEMS, - configProvider.getInteger(TRACE_BAGGAGE_MAX_ITEMS, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS)); - traceBaggageMaxBytes = - nonNegativeBaggageLimit( - TRACE_BAGGAGE_MAX_BYTES, - configProvider.getInteger(TRACE_BAGGAGE_MAX_BYTES, DEFAULT_TRACE_BAGGAGE_MAX_BYTES)); + traceBaggageMaxItems = nonNegativeBaggageLimit( + TRACE_BAGGAGE_MAX_ITEMS, + configProvider.getInteger(TRACE_BAGGAGE_MAX_ITEMS, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS)); + traceBaggageMaxBytes = nonNegativeBaggageLimit( + TRACE_BAGGAGE_MAX_BYTES, + configProvider.getInteger(TRACE_BAGGAGE_MAX_BYTES, DEFAULT_TRACE_BAGGAGE_MAX_BYTES)); // These setting are here for backwards compatibility until they can be removed in a major // release of the tracer @@ -2022,9 +1992,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins deprecatedInject.isEmpty() ? DEFAULT_PROPAGATION_STYLE : deprecatedInject; } - tracePropagationExtractFirst = - configProvider.getBoolean( - TRACE_PROPAGATION_EXTRACT_FIRST, DEFAULT_TRACE_PROPAGATION_EXTRACT_FIRST); + tracePropagationExtractFirst = configProvider.getBoolean( + TRACE_PROPAGATION_EXTRACT_FIRST, DEFAULT_TRACE_PROPAGATION_EXTRACT_FIRST); traceOrgGuardEnabled = configProvider.getBoolean(TRACE_ORG_GUARD_ENABLED, false); traceOrgGuardStrict = configProvider.getBoolean(TRACE_ORG_GUARD_STRICT, false); traceOrgGuardTrustedOpms = @@ -2039,18 +2008,16 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins logsInjectionEnabled = configProvider.getBoolean(LOGS_INJECTION_ENABLED, false, LOGS_INJECTION); } else { - logsInjectionEnabled = - configProvider.getBoolean( - LOGS_INJECTION_ENABLED, DEFAULT_LOGS_INJECTION_ENABLED, LOGS_INJECTION); + logsInjectionEnabled = configProvider.getBoolean( + LOGS_INJECTION_ENABLED, DEFAULT_LOGS_INJECTION_ENABLED, LOGS_INJECTION); } appLogsCollectionEnabled = configProvider.getBoolean(APP_LOGS_COLLECTION_ENABLED, DEFAULT_APP_LOGS_COLLECTION_ENABLED); dogStatsDNamedPipe = configProvider.getString(DOGSTATSD_NAMED_PIPE); - dogStatsDStartDelay = - configProvider.getInteger( - DOGSTATSD_START_DELAY, DEFAULT_DOGSTATSD_START_DELAY, JMX_FETCH_START_DELAY); + dogStatsDStartDelay = configProvider.getInteger( + DOGSTATSD_START_DELAY, DEFAULT_DOGSTATSD_START_DELAY, JMX_FETCH_START_DELAY); dogStatsDPort = configProvider.getInteger(DOGSTATSD_PORT, DEFAULT_DOGSTATSD_PORT); @@ -2100,34 +2067,26 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins otlpLogsTimeout = otlpTimeout; otlpLogsHeaders = configProvider.getMergedMap(OTLP_LOGS_HEADERS, '='); - otlpLogsProtocol = - configProvider.getEnum( - OTLP_LOGS_PROTOCOL, OtlpConfig.Protocol.class, OtlpConfig.Protocol.HTTP_PROTOBUF); - otlpLogsCompression = - configProvider.getEnum( - OTLP_LOGS_COMPRESSION, OtlpConfig.Compression.class, OtlpConfig.Compression.NONE); + otlpLogsProtocol = configProvider.getEnum( + OTLP_LOGS_PROTOCOL, OtlpConfig.Protocol.class, OtlpConfig.Protocol.HTTP_PROTOBUF); + otlpLogsCompression = configProvider.getEnum( + OTLP_LOGS_COMPRESSION, OtlpConfig.Compression.class, OtlpConfig.Compression.NONE); String otlpLogsEndpointFromEnvironment = configProvider.getString(OTLP_LOGS_ENDPOINT); if (otlpLogsEndpointFromEnvironment == null) { if (otlpLogsProtocol == OtlpConfig.Protocol.GRPC) { otlpLogsEndpointFromEnvironment = "http://" + agentHost + ':' + DEFAULT_OTLP_GRPC_PORT; } else { - otlpLogsEndpointFromEnvironment = - "http://" - + agentHost - + ':' - + DEFAULT_OTLP_HTTP_PORT - + '/' - + DEFAULT_OTLP_HTTP_LOGS_ENDPOINT; + otlpLogsEndpointFromEnvironment = "http://" + agentHost + ':' + DEFAULT_OTLP_HTTP_PORT + '/' + + DEFAULT_OTLP_HTTP_LOGS_ENDPOINT; } } otlpLogsEndpoint = otlpLogsEndpointFromEnvironment; metricsOtelExporter = configProvider.getString(METRICS_OTEL_EXPORTER); - int cardinalityLimit = - configProvider.getInteger( - METRICS_OTEL_CARDINALITY_LIMIT, DEFAULT_METRICS_OTEL_CARDINALITY_LIMIT); + int cardinalityLimit = configProvider.getInteger( + METRICS_OTEL_CARDINALITY_LIMIT, DEFAULT_METRICS_OTEL_CARDINALITY_LIMIT); if (cardinalityLimit < 0) { log.warn( "Invalid OTel metrics cardinality limit: {}. The value must be positive", @@ -2150,9 +2109,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins } metricsOtelTimeout = otelTimeout; - metricsOtelExperimentalEnabled = - configProvider.getBoolean( - METRICS_OTEL_EXPERIMENTAL_ENABLED, DEFAULT_METRICS_OTEL_EXPERIMENTAL_ENABLED); + metricsOtelExperimentalEnabled = configProvider.getBoolean( + METRICS_OTEL_EXPERIMENTAL_ENABLED, DEFAULT_METRICS_OTEL_EXPERIMENTAL_ENABLED); // keep OTLP default timeout below the overall export timeout int defaultOtlpMetricsTimeout = Math.min(metricsOtelTimeout, DEFAULT_METRICS_OTEL_TIMEOUT); @@ -2164,44 +2122,33 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins otlpMetricsTimeout = otlpTimeout; otlpMetricsHeaders = configProvider.getMergedMap(OTLP_METRICS_HEADERS, '='); - otlpMetricsProtocol = - configProvider.getEnum( - OTLP_METRICS_PROTOCOL, OtlpConfig.Protocol.class, OtlpConfig.Protocol.HTTP_PROTOBUF); - otlpMetricsCompression = - configProvider.getEnum( - OTLP_METRICS_COMPRESSION, OtlpConfig.Compression.class, OtlpConfig.Compression.NONE); + otlpMetricsProtocol = configProvider.getEnum( + OTLP_METRICS_PROTOCOL, OtlpConfig.Protocol.class, OtlpConfig.Protocol.HTTP_PROTOBUF); + otlpMetricsCompression = configProvider.getEnum( + OTLP_METRICS_COMPRESSION, OtlpConfig.Compression.class, OtlpConfig.Compression.NONE); String otlpMetricsEndpointFromEnvironment = configProvider.getString(OTLP_METRICS_ENDPOINT); if (otlpMetricsEndpointFromEnvironment == null) { if (otlpMetricsProtocol == OtlpConfig.Protocol.GRPC) { otlpMetricsEndpointFromEnvironment = "http://" + agentHost + ':' + DEFAULT_OTLP_GRPC_PORT; } else { - otlpMetricsEndpointFromEnvironment = - "http://" - + agentHost - + ':' - + DEFAULT_OTLP_HTTP_PORT - + '/' - + DEFAULT_OTLP_HTTP_METRICS_ENDPOINT; + otlpMetricsEndpointFromEnvironment = "http://" + agentHost + ':' + DEFAULT_OTLP_HTTP_PORT + + '/' + DEFAULT_OTLP_HTTP_METRICS_ENDPOINT; } } otlpMetricsEndpoint = otlpMetricsEndpointFromEnvironment; - otlpMetricsTemporalityPreference = - configProvider.getEnum( - OTLP_METRICS_TEMPORALITY_PREFERENCE, - OtlpConfig.Temporality.class, - OtlpConfig.Temporality.DELTA); + otlpMetricsTemporalityPreference = configProvider.getEnum( + OTLP_METRICS_TEMPORALITY_PREFERENCE, + OtlpConfig.Temporality.class, + OtlpConfig.Temporality.DELTA); traceOtelSemanticsEnabled = configProvider.getBoolean(TRACE_OTEL_SEMANTICS_ENABLED, false); // Tri-state default: when unset, SDK-computed OTLP span metrics are emitted iff OTLP trace // export and OTLP metrics export are both enabled. - otelTracesSpanMetricsEnabled = - configProvider.getBoolean( - OTEL_TRACES_SPAN_METRICS_ENABLED, - isTraceOtlpExporterEnabled() - && isMetricsOtelEnabled() - && isMetricsOtlpExporterEnabled()); + otelTracesSpanMetricsEnabled = configProvider.getBoolean( + OTEL_TRACES_SPAN_METRICS_ENABLED, + isTraceOtlpExporterEnabled() && isMetricsOtelEnabled() && isMetricsOtlpExporterEnabled()); otlpTimeout = configProvider.getInteger(OTLP_TRACES_TIMEOUT, DEFAULT_OTLP_TRACES_TIMEOUT); if (otlpTimeout < 0) { @@ -2211,25 +2158,18 @@ && isMetricsOtelEnabled() otlpTracesTimeout = otlpTimeout; otlpTracesHeaders = configProvider.getMergedMap(OTLP_TRACES_HEADERS, '='); - otlpTracesProtocol = - configProvider.getEnum( - OTLP_TRACES_PROTOCOL, OtlpConfig.Protocol.class, OtlpConfig.Protocol.HTTP_PROTOBUF); - otlpTracesCompression = - configProvider.getEnum( - OTLP_TRACES_COMPRESSION, OtlpConfig.Compression.class, OtlpConfig.Compression.NONE); + otlpTracesProtocol = configProvider.getEnum( + OTLP_TRACES_PROTOCOL, OtlpConfig.Protocol.class, OtlpConfig.Protocol.HTTP_PROTOBUF); + otlpTracesCompression = configProvider.getEnum( + OTLP_TRACES_COMPRESSION, OtlpConfig.Compression.class, OtlpConfig.Compression.NONE); String otlpTracesEndpointFromEnvironment = configProvider.getString(OTLP_TRACES_ENDPOINT); if (otlpTracesEndpointFromEnvironment == null) { if (otlpTracesProtocol == OtlpConfig.Protocol.GRPC) { otlpTracesEndpointFromEnvironment = "http://" + agentHost + ':' + DEFAULT_OTLP_GRPC_PORT; } else { - otlpTracesEndpointFromEnvironment = - "http://" - + agentHost - + ':' - + DEFAULT_OTLP_HTTP_PORT - + '/' - + DEFAULT_OTLP_HTTP_TRACES_ENDPOINT; + otlpTracesEndpointFromEnvironment = "http://" + agentHost + ':' + DEFAULT_OTLP_HTTP_PORT + + '/' + DEFAULT_OTLP_HTTP_TRACES_ENDPOINT; } } otlpTracesEndpoint = otlpTracesEndpointFromEnvironment; @@ -2237,9 +2177,8 @@ && isMetricsOtelEnabled() // Runtime metrics are disabled if Otel metrics are enabled and the metrics exporter is none runtimeMetricsEnabled = configProvider.getBoolean(RUNTIME_METRICS_ENABLED, true); - jmxFetchEnabled = - runtimeMetricsEnabled - && configProvider.getBoolean(JMX_FETCH_ENABLED, DEFAULT_JMX_FETCH_ENABLED); + jmxFetchEnabled = runtimeMetricsEnabled + && configProvider.getBoolean(JMX_FETCH_ENABLED, DEFAULT_JMX_FETCH_ENABLED); jmxFetchConfigDir = configProvider.getString(JMX_FETCH_CONFIG_DIR); jmxFetchConfigs = tryMakeImmutableList(configProvider.getList(JMX_FETCH_CONFIG)); jmxFetchMetricsConfigs = @@ -2250,31 +2189,26 @@ && isMetricsOtelEnabled() jmxFetchRefreshBeansPeriod = configProvider.getInteger(JMX_FETCH_REFRESH_BEANS_PERIOD); jmxFetchStatsdPort = configProvider.getInteger(JMX_FETCH_STATSD_PORT, DOGSTATSD_PORT); - jmxFetchStatsdHost = - configProvider.getString( - JMX_FETCH_STATSD_HOST, - // default to agent host if an explicit port has been set - null != jmxFetchStatsdPort && jmxFetchStatsdPort > 0 ? agentHost : null, - DOGSTATSD_HOST); - - jmxFetchMultipleRuntimeServicesEnabled = - configProvider.getBoolean( - JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_ENABLED, - DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_ENABLED); - jmxFetchMultipleRuntimeServicesLimit = - configProvider.getInteger( - JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT, - DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT); + jmxFetchStatsdHost = configProvider.getString( + JMX_FETCH_STATSD_HOST, + // default to agent host if an explicit port has been set + null != jmxFetchStatsdPort && jmxFetchStatsdPort > 0 ? agentHost : null, + DOGSTATSD_HOST); + + jmxFetchMultipleRuntimeServicesEnabled = configProvider.getBoolean( + JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_ENABLED, + DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_ENABLED); + jmxFetchMultipleRuntimeServicesLimit = configProvider.getInteger( + JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT, + DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT); // Writer.Builder createMonitor will use the values of the JMX fetch & agent to fill-in defaults - healthMetricsEnabled = - runtimeMetricsEnabled - && configProvider.getBoolean(HEALTH_METRICS_ENABLED, DEFAULT_HEALTH_METRICS_ENABLED); + healthMetricsEnabled = runtimeMetricsEnabled + && configProvider.getBoolean(HEALTH_METRICS_ENABLED, DEFAULT_HEALTH_METRICS_ENABLED); healthMetricsStatsdHost = configProvider.getString(HEALTH_METRICS_STATSD_HOST); healthMetricsStatsdPort = configProvider.getInteger(HEALTH_METRICS_STATSD_PORT); - perfMetricsEnabled = - runtimeMetricsEnabled - && configProvider.getBoolean(PERF_METRICS_ENABLED, DEFAULT_PERF_METRICS_ENABLED); + perfMetricsEnabled = runtimeMetricsEnabled + && configProvider.getBoolean(PERF_METRICS_ENABLED, DEFAULT_PERF_METRICS_ENABLED); tracerMetricsEnabled = configProvider.getBoolean(TRACE_STATS_COMPUTATION_ENABLED, true, TRACER_METRICS_ENABLED); @@ -2314,9 +2248,8 @@ && isMetricsOtelEnabled() final int defaultMaxAggregates = tightHeap ? 256 : 2048; final int defaultMaxPending = tightHeap ? 64 : 128; - tracerMetricsMaxAggregates = - configProvider.getInteger( - TRACE_STATS_CARDINALITY_LIMIT, defaultMaxAggregates, TRACER_METRICS_MAX_AGGREGATES); + tracerMetricsMaxAggregates = configProvider.getInteger( + TRACE_STATS_CARDINALITY_LIMIT, defaultMaxAggregates, TRACER_METRICS_MAX_AGGREGATES); /* * TRACER_METRICS_MAX_PENDING historically counted conflating Batch slots (~64 spans per batch * via Batch.MAX_BATCH_SIZE). The inbox now holds 1 SpanSnapshot per metrics-eligible span, so @@ -2336,10 +2269,8 @@ && isMetricsOtelEnabled() reportHostName = configProvider.getBoolean(TRACE_REPORT_HOSTNAME, DEFAULT_TRACE_REPORT_HOSTNAME); - ProtocolVersion protocol = - ProtocolVersion.fromConfigValue( - configProvider.getString( - TRACE_AGENT_PROTOCOL_VERSION, DEFAULT_TRACE_AGENT_PROTOCOL_VERSION)); + ProtocolVersion protocol = ProtocolVersion.fromConfigValue(configProvider.getString( + TRACE_AGENT_PROTOCOL_VERSION, DEFAULT_TRACE_AGENT_PROTOCOL_VERSION)); // Check if we need to fall back to legacy flag of `0.5` protocol. if (protocol != ProtocolVersion.V1_0 @@ -2379,21 +2310,18 @@ && isMetricsOtelEnabled() // the profiler was enabled at build time or not. // Otherwise just do the standard config lookup by key. // An extra step is needed to properly handle the 'auto' value for profiling enablement via SSI. - String value = - configProvider.getString( - ProfilingConfig.PROFILING_ENABLED, - String.valueOf(instrumenterConfig.isProfilingEnabled())); + String value = configProvider.getString( + ProfilingConfig.PROFILING_ENABLED, String.valueOf(instrumenterConfig.isProfilingEnabled())); // Run a validator that will emit a warning if the value is not a valid ProfilingEnablement // We don't want it to run in each call to ProfilingEnablement.of(value) not to flood the logs ProfilingEnablement.validate(value); profilingEnabled = ProfilingEnablement.of(value); profilingAgentless = configProvider.getBoolean(PROFILING_AGENTLESS, PROFILING_AGENTLESS_DEFAULT); - isDatadogProfilerEnabled = - !isDatadogProfilerEnablementOverridden() - && configProvider.getBoolean( - PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) - && !(Platform.isNativeImageBuilder() || Platform.isNativeImage()); + isDatadogProfilerEnabled = !isDatadogProfilerEnablementOverridden() + && configProvider.getBoolean( + PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) + && !(Platform.isNativeImageBuilder() || Platform.isNativeImage()); profilingUrl = configProvider.getString(PROFILING_URL); if (tmpApiKey == null) { @@ -2401,10 +2329,9 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) tmpApiKey = getEnv(propertyNameToEnvironmentVariableName(PROFILING_API_KEY_OLD)); if (oldProfilingApiKeyFile != null) { try { - tmpApiKey = - new String( - Files.readAllBytes(Paths.get(oldProfilingApiKeyFile)), StandardCharsets.UTF_8) - .trim(); + tmpApiKey = new String( + Files.readAllBytes(Paths.get(oldProfilingApiKeyFile)), StandardCharsets.UTF_8) + .trim(); } catch (final IOException e) { log.error("Cannot read API key from file {}, skipping", oldProfilingApiKeyFile, e); } @@ -2416,11 +2343,9 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) tmpApiKey = getEnv(propertyNameToEnvironmentVariableName(PROFILING_API_KEY_VERY_OLD)); if (veryOldProfilingApiKeyFile != null) { try { - tmpApiKey = - new String( - Files.readAllBytes(Paths.get(veryOldProfilingApiKeyFile)), - StandardCharsets.UTF_8) - .trim(); + tmpApiKey = new String( + Files.readAllBytes(Paths.get(veryOldProfilingApiKeyFile)), StandardCharsets.UTF_8) + .trim(); } catch (final IOException e) { log.error("Cannot read API key from file {}, skipping", veryOldProfilingApiKeyFile, e); } @@ -2455,59 +2380,45 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) profilingTemplateOverrideFile = configProvider.getString(PROFILING_TEMPLATE_OVERRIDE_FILE); profilingUploadTimeout = configProvider.getInteger(PROFILING_UPLOAD_TIMEOUT, PROFILING_UPLOAD_TIMEOUT_DEFAULT); - profilingUploadCompression = - configProvider.getString( - PROFILING_DEBUG_UPLOAD_COMPRESSION, - PROFILING_DEBUG_UPLOAD_COMPRESSION_DEFAULT, - PROFILING_UPLOAD_COMPRESSION); + profilingUploadCompression = configProvider.getString( + PROFILING_DEBUG_UPLOAD_COMPRESSION, + PROFILING_DEBUG_UPLOAD_COMPRESSION_DEFAULT, + PROFILING_UPLOAD_COMPRESSION); profilingProxyHost = configProvider.getString(PROFILING_PROXY_HOST); profilingProxyPort = configProvider.getInteger(PROFILING_PROXY_PORT, PROFILING_PROXY_PORT_DEFAULT); profilingProxyUsername = configProvider.getString(PROFILING_PROXY_USERNAME); profilingProxyPassword = configProvider.getString(PROFILING_PROXY_PASSWORD); - profilingExceptionSampleLimit = - configProvider.getInteger( - PROFILING_EXCEPTION_SAMPLE_LIMIT, PROFILING_EXCEPTION_SAMPLE_LIMIT_DEFAULT); - profilingBackPressureSampleLimit = - configProvider.getInteger( - PROFILING_EXCEPTION_SAMPLE_LIMIT, PROFILING_BACKPRESSURE_SAMPLE_LIMIT_DEFAULT); - profilingBackPressureEnabled = - configProvider.getBoolean( - PROFILING_BACKPRESSURE_SAMPLING_ENABLED, - PROFILING_BACKPRESSURE_SAMPLING_ENABLED_DEFAULT); - profilingDirectAllocationSampleLimit = - configProvider.getInteger( - PROFILING_DIRECT_ALLOCATION_SAMPLE_LIMIT, - PROFILING_DIRECT_ALLOCATION_SAMPLE_LIMIT_DEFAULT); - profilingExceptionHistogramTopItems = - configProvider.getInteger( - PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS, - PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS_DEFAULT); - profilingExceptionHistogramMaxCollectionSize = - configProvider.getInteger( - PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE, - PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE_DEFAULT); + profilingExceptionSampleLimit = configProvider.getInteger( + PROFILING_EXCEPTION_SAMPLE_LIMIT, PROFILING_EXCEPTION_SAMPLE_LIMIT_DEFAULT); + profilingBackPressureSampleLimit = configProvider.getInteger( + PROFILING_EXCEPTION_SAMPLE_LIMIT, PROFILING_BACKPRESSURE_SAMPLE_LIMIT_DEFAULT); + profilingBackPressureEnabled = configProvider.getBoolean( + PROFILING_BACKPRESSURE_SAMPLING_ENABLED, PROFILING_BACKPRESSURE_SAMPLING_ENABLED_DEFAULT); + profilingDirectAllocationSampleLimit = configProvider.getInteger( + PROFILING_DIRECT_ALLOCATION_SAMPLE_LIMIT, PROFILING_DIRECT_ALLOCATION_SAMPLE_LIMIT_DEFAULT); + profilingExceptionHistogramTopItems = configProvider.getInteger( + PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS, PROFILING_EXCEPTION_HISTOGRAM_TOP_ITEMS_DEFAULT); + profilingExceptionHistogramMaxCollectionSize = configProvider.getInteger( + PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE, + PROFILING_EXCEPTION_HISTOGRAM_MAX_COLLECTION_SIZE_DEFAULT); profilingExcludeAgentThreads = configProvider.getBoolean(PROFILING_EXCLUDE_AGENT_THREADS, true); - profilingRecordExceptionMessage = - configProvider.getBoolean( - PROFILING_EXCEPTION_RECORD_MESSAGE, PROFILING_EXCEPTION_RECORD_MESSAGE_DEFAULT); + profilingRecordExceptionMessage = configProvider.getBoolean( + PROFILING_EXCEPTION_RECORD_MESSAGE, PROFILING_EXCEPTION_RECORD_MESSAGE_DEFAULT); - profilingUploadSummaryOn413Enabled = - configProvider.getBoolean( - PROFILING_UPLOAD_SUMMARY_ON_413, PROFILING_UPLOAD_SUMMARY_ON_413_DEFAULT); + profilingUploadSummaryOn413Enabled = configProvider.getBoolean( + PROFILING_UPLOAD_SUMMARY_ON_413, PROFILING_UPLOAD_SUMMARY_ON_413_DEFAULT); crashTrackingAgentless = configProvider.getBoolean(CRASH_TRACKING_AGENTLESS, CRASH_TRACKING_AGENTLESS_DEFAULT); crashTrackingTags = configProvider.getMergedMap(CRASH_TRACKING_TAGS); - crashTrackingErrorsIntakeEnabled = - configProvider.getBoolean( - CRASH_TRACKING_ERRORS_INTAKE_ENABLED, CRASH_TRACKING_ERRORS_INTAKE_ENABLED_DEFAULT); - crashTrackingExtendedInfoEnabled = - configProvider.getBoolean( - CRASH_TRACKING_EXTENDED_INFO_ENABLED, CRASH_TRACKING_EXTENDED_INFO_ENABLED_DEFAULT); + crashTrackingErrorsIntakeEnabled = configProvider.getBoolean( + CRASH_TRACKING_ERRORS_INTAKE_ENABLED, CRASH_TRACKING_ERRORS_INTAKE_ENABLED_DEFAULT); + crashTrackingExtendedInfoEnabled = configProvider.getBoolean( + CRASH_TRACKING_EXTENDED_INFO_ENABLED, CRASH_TRACKING_EXTENDED_INFO_ENABLED_DEFAULT); float telemetryInterval = configProvider.getFloat(TELEMETRY_HEARTBEAT_INTERVAL, DEFAULT_TELEMETRY_HEARTBEAT_INTERVAL); @@ -2519,9 +2430,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) } telemetryHeartbeatInterval = telemetryInterval; - telemetryExtendedHeartbeatInterval = - configProvider.getLong( - TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL, DEFAULT_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL); + telemetryExtendedHeartbeatInterval = configProvider.getLong( + TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL, DEFAULT_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL); telemetryInterval = configProvider.getFloat(TELEMETRY_METRICS_INTERVAL, DEFAULT_TELEMETRY_METRICS_INTERVAL); @@ -2535,19 +2445,15 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) telemetryMetricsEnabled = configProvider.getBoolean(TELEMETRY_METRICS_ENABLED, true); - isTelemetryLogCollectionEnabled = - instrumenterConfig.isTelemetryEnabled() - && configProvider.getBoolean( - TELEMETRY_LOG_COLLECTION_ENABLED, DEFAULT_TELEMETRY_LOG_COLLECTION_ENABLED); - - isTelemetryDependencyServiceEnabled = - configProvider.getBoolean( - TELEMETRY_DEPENDENCY_COLLECTION_ENABLED, - DEFAULT_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED); - telemetryDependencyResolutionQueueSize = - configProvider.getInteger( - TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE, - DEFAULT_TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE); + isTelemetryLogCollectionEnabled = instrumenterConfig.isTelemetryEnabled() + && configProvider.getBoolean( + TELEMETRY_LOG_COLLECTION_ENABLED, DEFAULT_TELEMETRY_LOG_COLLECTION_ENABLED); + + isTelemetryDependencyServiceEnabled = configProvider.getBoolean( + TELEMETRY_DEPENDENCY_COLLECTION_ENABLED, DEFAULT_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED); + telemetryDependencyResolutionQueueSize = configProvider.getInteger( + TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE, + DEFAULT_TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE); clientIpEnabled = configProvider.getBoolean(CLIENT_IP_ENABLED, DEFAULT_CLIENT_IP_ENABLED); appSecRulesFile = configProvider.getString(APPSEC_RULES_FILE, null); @@ -2572,67 +2478,54 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) configProvider.getString(APPSEC_HTTP_BLOCKED_TEMPLATE_HTML, null); appSecHttpBlockedTemplateJson = configProvider.getString(APPSEC_HTTP_BLOCKED_TEMPLATE_JSON, null); - appSecUserIdCollectionMode = - UserIdCollectionMode.fromString( - configProvider.getStringNotEmpty(APPSEC_AUTO_USER_INSTRUMENTATION_MODE, null), - configProvider.getStringNotEmpty(APPSEC_AUTOMATED_USER_EVENTS_TRACKING, null)); + appSecUserIdCollectionMode = UserIdCollectionMode.fromString( + configProvider.getStringNotEmpty(APPSEC_AUTO_USER_INSTRUMENTATION_MODE, null), + configProvider.getStringNotEmpty(APPSEC_AUTOMATED_USER_EVENTS_TRACKING, null)); appSecScaEnabled = configProvider.getBoolean(APPSEC_SCA_ENABLED); - appSecScaMaxTrackedDependencies = - configProvider.getInteger( - APPSEC_SCA_MAX_TRACKED_DEPENDENCIES, DEFAULT_APPSEC_SCA_MAX_TRACKED_DEPENDENCIES); - appSecStackTraceEnabled = - configProvider.getBoolean( - APPSEC_STACK_TRACE_ENABLED, - DEFAULT_APPSEC_STACK_TRACE_ENABLED, - APPSEC_STACKTRACE_ENABLED_DEPRECATED); - appSecMaxStackTraces = - configProvider.getInteger( - APPSEC_MAX_STACK_TRACES, - DEFAULT_APPSEC_MAX_STACK_TRACES, - APPSEC_MAX_STACKTRACES_DEPRECATED); - appSecMaxStackTraceDepth = - configProvider.getInteger( - APPSEC_MAX_STACK_TRACE_DEPTH, - DEFAULT_APPSEC_MAX_STACK_TRACE_DEPTH, - APPSEC_MAX_STACKTRACE_DEPTH_DEPRECATED); - appSecBodyParsingSizeLimit = - configProvider.getInteger( - APPSEC_BODY_PARSING_SIZE_LIMIT, DEFAULT_APPSEC_BODY_PARSING_SIZE_LIMIT); - appSecMaxFileContentBytes = - configProvider.getInteger( - APPSEC_MAX_FILE_CONTENT_BYTES, DEFAULT_APPSEC_MAX_FILE_CONTENT_BYTES); - appSecMaxFileContentCount = - configProvider.getInteger( - APPSEC_MAX_FILE_CONTENT_COUNT, DEFAULT_APPSEC_MAX_FILE_CONTENT_COUNT); - apiSecurityEnabled = - configProvider.getBoolean( - API_SECURITY_ENABLED, DEFAULT_API_SECURITY_ENABLED, API_SECURITY_ENABLED_EXPERIMENTAL); + appSecScaMaxTrackedDependencies = configProvider.getInteger( + APPSEC_SCA_MAX_TRACKED_DEPENDENCIES, DEFAULT_APPSEC_SCA_MAX_TRACKED_DEPENDENCIES); + appSecStackTraceEnabled = configProvider.getBoolean( + APPSEC_STACK_TRACE_ENABLED, + DEFAULT_APPSEC_STACK_TRACE_ENABLED, + APPSEC_STACKTRACE_ENABLED_DEPRECATED); + appSecMaxStackTraces = configProvider.getInteger( + APPSEC_MAX_STACK_TRACES, + DEFAULT_APPSEC_MAX_STACK_TRACES, + APPSEC_MAX_STACKTRACES_DEPRECATED); + appSecMaxStackTraceDepth = configProvider.getInteger( + APPSEC_MAX_STACK_TRACE_DEPTH, + DEFAULT_APPSEC_MAX_STACK_TRACE_DEPTH, + APPSEC_MAX_STACKTRACE_DEPTH_DEPRECATED); + appSecBodyParsingSizeLimit = configProvider.getInteger( + APPSEC_BODY_PARSING_SIZE_LIMIT, DEFAULT_APPSEC_BODY_PARSING_SIZE_LIMIT); + appSecMaxFileContentBytes = configProvider.getInteger( + APPSEC_MAX_FILE_CONTENT_BYTES, DEFAULT_APPSEC_MAX_FILE_CONTENT_BYTES); + appSecMaxFileContentCount = configProvider.getInteger( + APPSEC_MAX_FILE_CONTENT_COUNT, DEFAULT_APPSEC_MAX_FILE_CONTENT_COUNT); + apiSecurityEnabled = configProvider.getBoolean( + API_SECURITY_ENABLED, DEFAULT_API_SECURITY_ENABLED, API_SECURITY_ENABLED_EXPERIMENTAL); apiSecuritySampleDelay = configProvider.getFloat(API_SECURITY_SAMPLE_DELAY, DEFAULT_API_SECURITY_SAMPLE_DELAY); - apiSecurityEndpointCollectionMessageLimit = - configProvider.getInteger( - API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT, - DEFAULT_API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT); - apiSecurityMaxDownstreamRequestBodyAnalysis = - configProvider.getInteger( - API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS, - DEFAULT_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS); - apiSecurityDownstreamRequestBodyAnalysisSampleRate = - configProvider.getDouble( - API_SECURITY_DOWNSTREAM_BODY_ANALYSIS_SAMPLE_RATE, - DEFAULT_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE, - API_SECURITY_DOWNSTREAM_REQUEST_ANALYSIS_SAMPLE_RATE, - API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE); + apiSecurityEndpointCollectionMessageLimit = configProvider.getInteger( + API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT, + DEFAULT_API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT); + apiSecurityMaxDownstreamRequestBodyAnalysis = configProvider.getInteger( + API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS, + DEFAULT_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS); + apiSecurityDownstreamRequestBodyAnalysisSampleRate = configProvider.getDouble( + API_SECURITY_DOWNSTREAM_BODY_ANALYSIS_SAMPLE_RATE, + DEFAULT_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE, + API_SECURITY_DOWNSTREAM_REQUEST_ANALYSIS_SAMPLE_RATE, + API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE); // Trace Resource Renaming (Endpoint Inference) configuration // Default: enabled if AppSec is enabled, otherwise disabled // Can be explicitly overridden by setting DD_TRACE_RESOURCE_RENAMING_ENABLED Boolean traceResourceRenamingExplicit = configProvider.getBoolean(TRACE_RESOURCE_RENAMING_ENABLED); - this.traceResourceRenamingEnabled = - traceResourceRenamingExplicit != null - ? traceResourceRenamingExplicit - : instrumenterConfig.getAppSecActivation() == ProductActivation.FULLY_ENABLED; + this.traceResourceRenamingEnabled = traceResourceRenamingExplicit != null + ? traceResourceRenamingExplicit + : instrumenterConfig.getAppSecActivation() == ProductActivation.FULLY_ENABLED; this.traceResourceRenamingAlwaysSimplifiedEndpoint = configProvider.getBoolean(TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT, false); @@ -2641,52 +2534,42 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) iastContextMode = configProvider.getEnum(IAST_CONTEXT_MODE, IastContext.Mode.class, IastContext.Mode.REQUEST); - iastDetectionMode = - configProvider.getEnum( - IAST_DETECTION_MODE, IastDetectionMode.class, IastDetectionMode.DEFAULT); + iastDetectionMode = configProvider.getEnum( + IAST_DETECTION_MODE, IastDetectionMode.class, IastDetectionMode.DEFAULT); iastMaxConcurrentRequests = iastDetectionMode.getIastMaxConcurrentRequests(configProvider); iastVulnerabilitiesPerRequest = iastDetectionMode.getIastVulnerabilitiesPerRequest(configProvider); iastRequestSampling = iastDetectionMode.getIastRequestSampling(configProvider); iastDeduplicationEnabled = iastDetectionMode.isIastDeduplicationEnabled(configProvider); - iastWeakHashAlgorithms = - tryMakeImmutableSet( - configProvider.getSet(IAST_WEAK_HASH_ALGORITHMS, DEFAULT_IAST_WEAK_HASH_ALGORITHMS)); - iastWeakCipherAlgorithms = - getPattern( - DEFAULT_IAST_WEAK_CIPHER_ALGORITHMS, - configProvider.getString(IAST_WEAK_CIPHER_ALGORITHMS)); + iastWeakHashAlgorithms = tryMakeImmutableSet( + configProvider.getSet(IAST_WEAK_HASH_ALGORITHMS, DEFAULT_IAST_WEAK_HASH_ALGORITHMS)); + iastWeakCipherAlgorithms = getPattern( + DEFAULT_IAST_WEAK_CIPHER_ALGORITHMS, configProvider.getString(IAST_WEAK_CIPHER_ALGORITHMS)); iastTelemetryVerbosity = configProvider.getEnum(IAST_TELEMETRY_VERBOSITY, Verbosity.class, Verbosity.INFORMATION); iastRedactionEnabled = configProvider.getBoolean(IAST_REDACTION_ENABLED, DEFAULT_IAST_REDACTION_ENABLED); iastRedactionNamePattern = configProvider.getString(IAST_REDACTION_NAME_PATTERN, DEFAULT_IAST_REDACTION_NAME_PATTERN); - iastRedactionValuePattern = - configProvider.getString( - IAST_REDACTION_VALUE_PATTERN, DEFAULT_IAST_REDACTION_VALUE_PATTERN); - iastTruncationMaxValueLength = - configProvider.getInteger( - IAST_TRUNCATION_MAX_VALUE_LENGTH, DEFAULT_IAST_TRUNCATION_MAX_VALUE_LENGTH); + iastRedactionValuePattern = configProvider.getString( + IAST_REDACTION_VALUE_PATTERN, DEFAULT_IAST_REDACTION_VALUE_PATTERN); + iastTruncationMaxValueLength = configProvider.getInteger( + IAST_TRUNCATION_MAX_VALUE_LENGTH, DEFAULT_IAST_TRUNCATION_MAX_VALUE_LENGTH); iastMaxRangeCount = iastDetectionMode.getIastMaxRangeCount(configProvider); - iastStacktraceLeakSuppress = - configProvider.getBoolean( - IAST_STACK_TRACE_LEAK_SUPPRESS, - DEFAULT_IAST_STACKTRACE_LEAK_SUPPRESS, - IAST_STACKTRACE_LEAK_SUPPRESS_DEPRECATED); - iastHardcodedSecretEnabled = - configProvider.getBoolean( - IAST_HARDCODED_SECRET_ENABLED, DEFAULT_IAST_HARDCODED_SECRET_ENABLED); - iastAnonymousClassesEnabled = - configProvider.getBoolean( - IAST_ANONYMOUS_CLASSES_ENABLED, DEFAULT_IAST_ANONYMOUS_CLASSES_ENABLED); + iastStacktraceLeakSuppress = configProvider.getBoolean( + IAST_STACK_TRACE_LEAK_SUPPRESS, + DEFAULT_IAST_STACKTRACE_LEAK_SUPPRESS, + IAST_STACKTRACE_LEAK_SUPPRESS_DEPRECATED); + iastHardcodedSecretEnabled = configProvider.getBoolean( + IAST_HARDCODED_SECRET_ENABLED, DEFAULT_IAST_HARDCODED_SECRET_ENABLED); + iastAnonymousClassesEnabled = configProvider.getBoolean( + IAST_ANONYMOUS_CLASSES_ENABLED, DEFAULT_IAST_ANONYMOUS_CLASSES_ENABLED); iastSourceMappingEnabled = configProvider.getBoolean(IAST_SOURCE_MAPPING_ENABLED, false); iastSourceMappingMaxSize = configProvider.getInteger(IAST_SOURCE_MAPPING_MAX_SIZE, 1000); - iastStackTraceEnabled = - configProvider.getBoolean( - IAST_STACK_TRACE_ENABLED, - DEFAULT_IAST_STACK_TRACE_ENABLED, - IAST_STACKTRACE_ENABLED_DEPRECATED); + iastStackTraceEnabled = configProvider.getBoolean( + IAST_STACK_TRACE_ENABLED, + DEFAULT_IAST_STACK_TRACE_ENABLED, + IAST_STACKTRACE_ENABLED_DEPRECATED); iastExperimentalPropagationEnabled = configProvider.getBoolean(IAST_EXPERIMENTAL_PROPAGATION_ENABLED, false); iastSecurityControlsConfiguration = @@ -2731,18 +2614,15 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) ciVisibilityTraceSanitationEnabled = configProvider.getBoolean(CIVISIBILITY_TRACE_SANITATION_ENABLED, true); - ciVisibilityAgentlessEnabled = - configProvider.getBoolean( - CIVISIBILITY_AGENTLESS_ENABLED, DEFAULT_CIVISIBILITY_AGENTLESS_ENABLED); + ciVisibilityAgentlessEnabled = configProvider.getBoolean( + CIVISIBILITY_AGENTLESS_ENABLED, DEFAULT_CIVISIBILITY_AGENTLESS_ENABLED); - ciVisibilitySourceDataEnabled = - configProvider.getBoolean( - CIVISIBILITY_SOURCE_DATA_ENABLED, DEFAULT_CIVISIBILITY_SOURCE_DATA_ENABLED); + ciVisibilitySourceDataEnabled = configProvider.getBoolean( + CIVISIBILITY_SOURCE_DATA_ENABLED, DEFAULT_CIVISIBILITY_SOURCE_DATA_ENABLED); - ciVisibilityBuildInstrumentationEnabled = - configProvider.getBoolean( - CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED, - DEFAULT_CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED); + ciVisibilityBuildInstrumentationEnabled = configProvider.getBoolean( + CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED, + DEFAULT_CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED); final String ciVisibilityAgentlessUrlStr = configProvider.getString(CIVISIBILITY_AGENTLESS_URL); ciVisibilityAgentlessUrl = @@ -2754,20 +2634,16 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) isValidUrl(ciVisibilityIntakeAgentlessUrlStr) ? ciVisibilityIntakeAgentlessUrlStr : null; ciVisibilityAgentJarUri = configProvider.getString(CIVISIBILITY_AGENT_JAR_URI); - ciVisibilityAutoConfigurationEnabled = - configProvider.getBoolean( - CIVISIBILITY_AUTO_CONFIGURATION_ENABLED, - DEFAULT_CIVISIBILITY_AUTO_CONFIGURATION_ENABLED); + ciVisibilityAutoConfigurationEnabled = configProvider.getBoolean( + CIVISIBILITY_AUTO_CONFIGURATION_ENABLED, DEFAULT_CIVISIBILITY_AUTO_CONFIGURATION_ENABLED); ciVisibilityAdditionalChildProcessJvmArgs = configProvider.getString(CIVISIBILITY_ADDITIONAL_CHILD_PROCESS_JVM_ARGS); - ciVisibilityCompilerPluginAutoConfigurationEnabled = - configProvider.getBoolean( - CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED, - DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED); - ciVisibilityGradleDependencyVerificationEnabled = - configProvider.getBoolean( - CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED, - DEFAULT_CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED); + ciVisibilityCompilerPluginAutoConfigurationEnabled = configProvider.getBoolean( + CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED, + DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED); + ciVisibilityGradleDependencyVerificationEnabled = configProvider.getBoolean( + CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED, + DEFAULT_CIVISIBILITY_GRADLE_DEPENDENCY_VERIFICATION_ENABLED); ciVisibilityCodeCoverageEnabled = configProvider.getBoolean(CIVISIBILITY_CODE_COVERAGE_ENABLED, true); ciVisibilityCoverageLinesEnabled = @@ -2775,23 +2651,16 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) ciVisibilityCodeCoverageReportDumpDir = configProvider.getString(CIVISIBILITY_CODE_COVERAGE_REPORT_DUMP_DIR); codeCoverageFlags = parseCodeCoverageFlags(configProvider.getList(CODE_COVERAGE_FLAGS)); - ciVisibilityCompilerPluginVersion = - configProvider.getString( - CIVISIBILITY_COMPILER_PLUGIN_VERSION, DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_VERSION); - ciVisibilityJacocoPluginVersion = - configProvider.getString( - CIVISIBILITY_JACOCO_PLUGIN_VERSION, DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_VERSION); + ciVisibilityCompilerPluginVersion = configProvider.getString( + CIVISIBILITY_COMPILER_PLUGIN_VERSION, DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_VERSION); + ciVisibilityJacocoPluginVersion = configProvider.getString( + CIVISIBILITY_JACOCO_PLUGIN_VERSION, DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_VERSION); ciVisibilityJacocoPluginVersionProvided = configProvider.getString(CIVISIBILITY_JACOCO_PLUGIN_VERSION) != null; - ciVisibilityCodeCoverageIncludes = - Arrays.asList( - COLON.split(configProvider.getString(CIVISIBILITY_CODE_COVERAGE_INCLUDES, ":"))); - ciVisibilityCodeCoverageExcludes = - Arrays.asList( - COLON.split( - configProvider.getString( - CIVISIBILITY_CODE_COVERAGE_EXCLUDES, - DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_EXCLUDES))); + ciVisibilityCodeCoverageIncludes = Arrays.asList( + COLON.split(configProvider.getString(CIVISIBILITY_CODE_COVERAGE_INCLUDES, ":"))); + ciVisibilityCodeCoverageExcludes = Arrays.asList(COLON.split(configProvider.getString( + CIVISIBILITY_CODE_COVERAGE_EXCLUDES, DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_EXCLUDES))); ciVisibilityCodeCoverageIncludedPackages = convertJacocoExclusionFormatToPackagePrefixes(ciVisibilityCodeCoverageIncludes); ciVisibilityCodeCoverageExcludedPackages = @@ -2802,34 +2671,24 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) configProvider.getBoolean(CIVISIBILITY_CODE_COVERAGE_REPORT_UPLOAD_ENABLED, true); ciVisibilityDebugPort = configProvider.getInteger(CIVISIBILITY_DEBUG_PORT); ciVisibilityGitClientEnabled = configProvider.getBoolean(CIVISIBILITY_GIT_CLIENT_ENABLED, true); - ciVisibilityGitUploadEnabled = - configProvider.getBoolean( - CIVISIBILITY_GIT_UPLOAD_ENABLED, DEFAULT_CIVISIBILITY_GIT_UPLOAD_ENABLED); - ciVisibilityGitUnshallowEnabled = - configProvider.getBoolean( - CIVISIBILITY_GIT_UNSHALLOW_ENABLED, DEFAULT_CIVISIBILITY_GIT_UNSHALLOW_ENABLED); + ciVisibilityGitUploadEnabled = configProvider.getBoolean( + CIVISIBILITY_GIT_UPLOAD_ENABLED, DEFAULT_CIVISIBILITY_GIT_UPLOAD_ENABLED); + ciVisibilityGitUnshallowEnabled = configProvider.getBoolean( + CIVISIBILITY_GIT_UNSHALLOW_ENABLED, DEFAULT_CIVISIBILITY_GIT_UNSHALLOW_ENABLED); ciVisibilityGitUnshallowDefer = configProvider.getBoolean(CIVISIBILITY_GIT_UNSHALLOW_DEFER, true); - ciVisibilityGitCommandTimeoutMillis = - configProvider.getLong( - CIVISIBILITY_GIT_COMMAND_TIMEOUT_MILLIS, - DEFAULT_CIVISIBILITY_GIT_COMMAND_TIMEOUT_MILLIS); - ciVisibilityBackendApiTimeoutMillis = - configProvider.getLong( - CIVISIBILITY_BACKEND_API_TIMEOUT_MILLIS, - DEFAULT_CIVISIBILITY_BACKEND_API_TIMEOUT_MILLIS); - ciVisibilityGitUploadTimeoutMillis = - configProvider.getLong( - CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS, DEFAULT_CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS); - ciVisibilityGitRemoteName = - configProvider.getString( - CIVISIBILITY_GIT_REMOTE_NAME, DEFAULT_CIVISIBILITY_GIT_REMOTE_NAME); - ciVisibilitySignalServerHost = - configProvider.getString( - CIVISIBILITY_SIGNAL_SERVER_HOST, DEFAULT_CIVISIBILITY_SIGNAL_SERVER_HOST); - ciVisibilitySignalServerPort = - configProvider.getInteger( - CIVISIBILITY_SIGNAL_SERVER_PORT, DEFAULT_CIVISIBILITY_SIGNAL_SERVER_PORT); + ciVisibilityGitCommandTimeoutMillis = configProvider.getLong( + CIVISIBILITY_GIT_COMMAND_TIMEOUT_MILLIS, DEFAULT_CIVISIBILITY_GIT_COMMAND_TIMEOUT_MILLIS); + ciVisibilityBackendApiTimeoutMillis = configProvider.getLong( + CIVISIBILITY_BACKEND_API_TIMEOUT_MILLIS, DEFAULT_CIVISIBILITY_BACKEND_API_TIMEOUT_MILLIS); + ciVisibilityGitUploadTimeoutMillis = configProvider.getLong( + CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS, DEFAULT_CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS); + ciVisibilityGitRemoteName = configProvider.getString( + CIVISIBILITY_GIT_REMOTE_NAME, DEFAULT_CIVISIBILITY_GIT_REMOTE_NAME); + ciVisibilitySignalServerHost = configProvider.getString( + CIVISIBILITY_SIGNAL_SERVER_HOST, DEFAULT_CIVISIBILITY_SIGNAL_SERVER_HOST); + ciVisibilitySignalServerPort = configProvider.getInteger( + CIVISIBILITY_SIGNAL_SERVER_PORT, DEFAULT_CIVISIBILITY_SIGNAL_SERVER_PORT); ciVisibilitySignalClientTimeoutMillis = configProvider.getInteger(CIVISIBILITY_SIGNAL_CLIENT_TIMEOUT_MILLIS, 10_000); ciVisibilityItrEnabled = configProvider.getBoolean(CIVISIBILITY_ITR_ENABLED, true); @@ -2848,9 +2707,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) configProvider.getInteger(CIVISIBILITY_CODE_COVERAGE_ROOT_PACKAGES_LIMIT, 50); ciVisibilityInjectedTracerVersion = configProvider.getString(CIVISIBILITY_INJECTED_TRACER_VERSION); - ciVisibilityResourceFolderNames = - configProvider.getList( - CIVISIBILITY_RESOURCE_FOLDER_NAMES, DEFAULT_CIVISIBILITY_RESOURCE_FOLDER_NAMES); + ciVisibilityResourceFolderNames = configProvider.getList( + CIVISIBILITY_RESOURCE_FOLDER_NAMES, DEFAULT_CIVISIBILITY_RESOURCE_FOLDER_NAMES); ciVisibilityFlakyRetryEnabled = configProvider.getBoolean(CIVISIBILITY_FLAKY_RETRY_ENABLED, true); ciVisibilityImpactedTestsDetectionEnabled = @@ -2890,29 +2748,23 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) testOptimizationPayloadsInFiles = configProvider.getBoolean(TEST_OPTIMIZATION_PAYLOADS_IN_FILES, false); - remoteConfigEnabled = - configProvider.getBoolean( - REMOTE_CONFIGURATION_ENABLED, DEFAULT_REMOTE_CONFIG_ENABLED, REMOTE_CONFIG_ENABLED); - remoteConfigIntegrityCheckEnabled = - configProvider.getBoolean( - REMOTE_CONFIG_INTEGRITY_CHECK_ENABLED, DEFAULT_REMOTE_CONFIG_INTEGRITY_CHECK_ENABLED); + remoteConfigEnabled = configProvider.getBoolean( + REMOTE_CONFIGURATION_ENABLED, DEFAULT_REMOTE_CONFIG_ENABLED, REMOTE_CONFIG_ENABLED); + remoteConfigIntegrityCheckEnabled = configProvider.getBoolean( + REMOTE_CONFIG_INTEGRITY_CHECK_ENABLED, DEFAULT_REMOTE_CONFIG_INTEGRITY_CHECK_ENABLED); remoteConfigUrl = configProvider.getString(REMOTE_CONFIG_URL); - remoteConfigPollIntervalSeconds = - configProvider.getFloat( - REMOTE_CONFIG_POLL_INTERVAL_SECONDS, DEFAULT_REMOTE_CONFIG_POLL_INTERVAL_SECONDS); - remoteConfigMaxPayloadSize = - configProvider.getInteger( - REMOTE_CONFIG_MAX_PAYLOAD_SIZE, DEFAULT_REMOTE_CONFIG_MAX_PAYLOAD_SIZE) - * 1024L; - remoteConfigTargetsKeyId = - configProvider.getString( - REMOTE_CONFIG_TARGETS_KEY_ID, DEFAULT_REMOTE_CONFIG_TARGETS_KEY_ID); + remoteConfigPollIntervalSeconds = configProvider.getFloat( + REMOTE_CONFIG_POLL_INTERVAL_SECONDS, DEFAULT_REMOTE_CONFIG_POLL_INTERVAL_SECONDS); + remoteConfigMaxPayloadSize = configProvider.getInteger( + REMOTE_CONFIG_MAX_PAYLOAD_SIZE, DEFAULT_REMOTE_CONFIG_MAX_PAYLOAD_SIZE) + * 1024L; + remoteConfigTargetsKeyId = configProvider.getString( + REMOTE_CONFIG_TARGETS_KEY_ID, DEFAULT_REMOTE_CONFIG_TARGETS_KEY_ID); remoteConfigTargetsKey = configProvider.getString(REMOTE_CONFIG_TARGETS_KEY, DEFAULT_REMOTE_CONFIG_TARGETS_KEY); - remoteConfigMaxExtraServices = - configProvider.getInteger( - REMOTE_CONFIG_MAX_EXTRA_SERVICES, DEFAULT_REMOTE_CONFIG_MAX_EXTRA_SERVICES); + remoteConfigMaxExtraServices = configProvider.getInteger( + REMOTE_CONFIG_MAX_EXTRA_SERVICES, DEFAULT_REMOTE_CONFIG_MAX_EXTRA_SERVICES); final Boolean configuredFeatureFlaggingProviderEnabled = configProvider.getBoolean(FEATURE_FLAGS_ENABLED); @@ -2941,13 +2793,11 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) } featureFlaggingProviderEnabled = resolvedFeatureFlaggingConfiguration.isEnabled(); featureFlaggingConfigurationSource = resolvedFeatureFlaggingConfiguration.getSource(); - featureFlaggingConfigurationSourceAgentlessBaseUrl = - configProvider.getStringNotEmpty( - FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_BASE_URL, null); - int configuredFeatureFlaggingPollIntervalSeconds = - configProvider.getInteger( - FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_POLL_INTERVAL_SECONDS, - DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_POLL_INTERVAL_SECONDS); + featureFlaggingConfigurationSourceAgentlessBaseUrl = configProvider.getStringNotEmpty( + FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_BASE_URL, null); + int configuredFeatureFlaggingPollIntervalSeconds = configProvider.getInteger( + FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_POLL_INTERVAL_SECONDS, + DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_POLL_INTERVAL_SECONDS); if (configuredFeatureFlaggingPollIntervalSeconds <= 0) { log.warn( "Invalid Feature Flagging agentless poll interval: {}. The value must be positive", @@ -2957,10 +2807,9 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) } featureFlaggingConfigurationSourcePollIntervalSeconds = configuredFeatureFlaggingPollIntervalSeconds; - int configuredFeatureFlaggingRequestTimeoutSeconds = - configProvider.getInteger( - FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_REQUEST_TIMEOUT_SECONDS, - DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_REQUEST_TIMEOUT_SECONDS); + int configuredFeatureFlaggingRequestTimeoutSeconds = configProvider.getInteger( + FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_REQUEST_TIMEOUT_SECONDS, + DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_REQUEST_TIMEOUT_SECONDS); if (configuredFeatureFlaggingRequestTimeoutSeconds <= 0) { log.warn( "Invalid Feature Flagging agentless request timeout: {}. The value must be positive", @@ -2971,140 +2820,105 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) featureFlaggingConfigurationSourceRequestTimeoutSeconds = configuredFeatureFlaggingRequestTimeoutSeconds; - dynamicInstrumentationEnabled = - configProvider.getBoolean( - DYNAMIC_INSTRUMENTATION_ENABLED, DEFAULT_DYNAMIC_INSTRUMENTATION_ENABLED); + dynamicInstrumentationEnabled = configProvider.getBoolean( + DYNAMIC_INSTRUMENTATION_ENABLED, DEFAULT_DYNAMIC_INSTRUMENTATION_ENABLED); dynamicInstrumentationSnapshotUrl = configProvider.getString(DYNAMIC_INSTRUMENTATION_SNAPSHOT_URL); - distributedDebuggerEnabled = - configProvider.getBoolean( - DISTRIBUTED_DEBUGGER_ENABLED, DEFAULT_DISTRIBUTED_DEBUGGER_ENABLED); - dynamicInstrumentationUploadTimeout = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_UPLOAD_TIMEOUT, DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_TIMEOUT); + distributedDebuggerEnabled = configProvider.getBoolean( + DISTRIBUTED_DEBUGGER_ENABLED, DEFAULT_DISTRIBUTED_DEBUGGER_ENABLED); + dynamicInstrumentationUploadTimeout = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_UPLOAD_TIMEOUT, DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_TIMEOUT); if (configProvider.isSet(DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS)) { - dynamicInstrumentationUploadFlushInterval = - (int) - (configProvider.getFloat( - DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS, - DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL) - * 1000); + dynamicInstrumentationUploadFlushInterval = (int) (configProvider.getFloat( + DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS, + DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL) + * 1000); } else { - dynamicInstrumentationUploadFlushInterval = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL, - DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL); + dynamicInstrumentationUploadFlushInterval = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL, + DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL); } - dynamicInstrumentationClassFileDumpEnabled = - configProvider.getBoolean( - DYNAMIC_INSTRUMENTATION_CLASSFILE_DUMP_ENABLED, - DEFAULT_DYNAMIC_INSTRUMENTATION_CLASSFILE_DUMP_ENABLED); - dynamicInstrumentationPollInterval = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_POLL_INTERVAL, DEFAULT_DYNAMIC_INSTRUMENTATION_POLL_INTERVAL); - dynamicInstrumentationDiagnosticsInterval = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_DIAGNOSTICS_INTERVAL, - DEFAULT_DYNAMIC_INSTRUMENTATION_DIAGNOSTICS_INTERVAL); - dynamicInstrumentationMetricEnabled = - runtimeMetricsEnabled - && configProvider.getBoolean( - DYNAMIC_INSTRUMENTATION_METRICS_ENABLED, - DEFAULT_DYNAMIC_INSTRUMENTATION_METRICS_ENABLED); + dynamicInstrumentationClassFileDumpEnabled = configProvider.getBoolean( + DYNAMIC_INSTRUMENTATION_CLASSFILE_DUMP_ENABLED, + DEFAULT_DYNAMIC_INSTRUMENTATION_CLASSFILE_DUMP_ENABLED); + dynamicInstrumentationPollInterval = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_POLL_INTERVAL, DEFAULT_DYNAMIC_INSTRUMENTATION_POLL_INTERVAL); + dynamicInstrumentationDiagnosticsInterval = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_DIAGNOSTICS_INTERVAL, + DEFAULT_DYNAMIC_INSTRUMENTATION_DIAGNOSTICS_INTERVAL); + dynamicInstrumentationMetricEnabled = runtimeMetricsEnabled + && configProvider.getBoolean( + DYNAMIC_INSTRUMENTATION_METRICS_ENABLED, + DEFAULT_DYNAMIC_INSTRUMENTATION_METRICS_ENABLED); dynamicInstrumentationProbeFile = configProvider.getString(DYNAMIC_INSTRUMENTATION_PROBE_FILE); - dynamicInstrumentationUploadBatchSize = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_UPLOAD_BATCH_SIZE, - DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_BATCH_SIZE); - dynamicInstrumentationMaxPayloadSize = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_MAX_PAYLOAD_SIZE, - DEFAULT_DYNAMIC_INSTRUMENTATION_MAX_PAYLOAD_SIZE) - * 1024L; - dynamicInstrumentationVerifyByteCode = - configProvider.getBoolean( - DYNAMIC_INSTRUMENTATION_VERIFY_BYTECODE, - DEFAULT_DYNAMIC_INSTRUMENTATION_VERIFY_BYTECODE); + dynamicInstrumentationUploadBatchSize = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_UPLOAD_BATCH_SIZE, + DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_BATCH_SIZE); + dynamicInstrumentationMaxPayloadSize = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_MAX_PAYLOAD_SIZE, + DEFAULT_DYNAMIC_INSTRUMENTATION_MAX_PAYLOAD_SIZE) + * 1024L; + dynamicInstrumentationVerifyByteCode = configProvider.getBoolean( + DYNAMIC_INSTRUMENTATION_VERIFY_BYTECODE, DEFAULT_DYNAMIC_INSTRUMENTATION_VERIFY_BYTECODE); dynamicInstrumentationInstrumentTheWorld = configProvider.getString(DYNAMIC_INSTRUMENTATION_INSTRUMENT_THE_WORLD); dynamicInstrumentationExcludeFiles = configProvider.getString(DYNAMIC_INSTRUMENTATION_EXCLUDE_FILES); dynamicInstrumentationIncludeFiles = configProvider.getString(DYNAMIC_INSTRUMENTATION_INCLUDE_FILES); - dynamicInstrumentationTimeoutCheckerMode = - configProvider.getString( - DYNAMIC_INSTRUMENTATION_TIMEOUT_CHECKER_MODE, - DEFAULT_DYNAMIC_INSTRUMENTATION_TIMEOUT_CHECKER_MODE); - dynamicInstrumentationCaptureTimeout = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT, - DEFAULT_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT, - DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MS); - dynamicInstrumentationEvaluationTimeout = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_EVAL_TIMEOUT_MS, DEFAULT_DYNAMIC_INSTRUMENTATION_EVAL_TIMEOUT); + dynamicInstrumentationTimeoutCheckerMode = configProvider.getString( + DYNAMIC_INSTRUMENTATION_TIMEOUT_CHECKER_MODE, + DEFAULT_DYNAMIC_INSTRUMENTATION_TIMEOUT_CHECKER_MODE); + dynamicInstrumentationCaptureTimeout = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT, + DEFAULT_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT, + DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT_MS); + dynamicInstrumentationEvaluationTimeout = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_EVAL_TIMEOUT_MS, DEFAULT_DYNAMIC_INSTRUMENTATION_EVAL_TIMEOUT); dynamicInstrumentationRedactedIdentifiers = configProvider.getString(DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS, null); - dynamicInstrumentationRedactionExcludedIdentifiers = - tryMakeImmutableSet( - configProvider.getList(DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS)); + dynamicInstrumentationRedactionExcludedIdentifiers = tryMakeImmutableSet( + configProvider.getList(DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS)); dynamicInstrumentationRedactedTypes = configProvider.getString(DYNAMIC_INSTRUMENTATION_REDACTED_TYPES, null); - dynamicInstrumentationLocalVarHoistingLevel = - configProvider.getInteger( - DYNAMIC_INSTRUMENTATION_LOCALVAR_HOISTING_LEVEL, - DEFAULT_DYNAMIC_INSTRUMENTATION_LOCALVAR_HOISTING_LEVEL); + dynamicInstrumentationLocalVarHoistingLevel = configProvider.getInteger( + DYNAMIC_INSTRUMENTATION_LOCALVAR_HOISTING_LEVEL, + DEFAULT_DYNAMIC_INSTRUMENTATION_LOCALVAR_HOISTING_LEVEL); symbolDatabaseEnabled = configProvider.getBoolean(SYMBOL_DATABASE_ENABLED, DEFAULT_SYMBOL_DATABASE_ENABLED); - symbolDatabaseForceUpload = - configProvider.getBoolean( - SYMBOL_DATABASE_FORCE_UPLOAD, DEFAULT_SYMBOL_DATABASE_FORCE_UPLOAD); - symbolDatabaseFlushThreshold = - configProvider.getInteger( - SYMBOL_DATABASE_FLUSH_THRESHOLD, DEFAULT_SYMBOL_DATABASE_FLUSH_THRESHOLD); + symbolDatabaseForceUpload = configProvider.getBoolean( + SYMBOL_DATABASE_FORCE_UPLOAD, DEFAULT_SYMBOL_DATABASE_FORCE_UPLOAD); + symbolDatabaseFlushThreshold = configProvider.getInteger( + SYMBOL_DATABASE_FLUSH_THRESHOLD, DEFAULT_SYMBOL_DATABASE_FLUSH_THRESHOLD); symbolDatabaseCompressed = configProvider.getBoolean(SYMBOL_DATABASE_COMPRESSED, DEFAULT_SYMBOL_DATABASE_COMPRESSED); - debuggerExceptionEnabled = - configProvider.getBoolean( - DEBUGGER_EXCEPTION_ENABLED, - DEFAULT_DEBUGGER_EXCEPTION_ENABLED, - EXCEPTION_REPLAY_ENABLED); - debuggerCodeOriginEnabled = - configProvider.getBoolean( - CODE_ORIGIN_FOR_SPANS_ENABLED, InstrumenterConfig.getDefaultCodeOriginForSpanEnabled()); + debuggerExceptionEnabled = configProvider.getBoolean( + DEBUGGER_EXCEPTION_ENABLED, DEFAULT_DEBUGGER_EXCEPTION_ENABLED, EXCEPTION_REPLAY_ENABLED); + debuggerCodeOriginEnabled = configProvider.getBoolean( + CODE_ORIGIN_FOR_SPANS_ENABLED, InstrumenterConfig.getDefaultCodeOriginForSpanEnabled()); debuggerCodeOriginMaxUserFrames = configProvider.getInteger(CODE_ORIGIN_MAX_USER_FRAMES, DEFAULT_CODE_ORIGIN_MAX_USER_FRAMES); - debuggerMaxExceptionPerSecond = - configProvider.getInteger( - DEBUGGER_MAX_EXCEPTION_PER_SECOND, DEFAULT_DEBUGGER_MAX_EXCEPTION_PER_SECOND); - debuggerExceptionOnlyLocalRoot = - configProvider.getBoolean( - DEBUGGER_EXCEPTION_ONLY_LOCAL_ROOT, DEFAULT_DEBUGGER_EXCEPTION_ONLY_LOCAL_ROOT); - debuggerExceptionCaptureIntermediateSpansEnabled = - configProvider.getBoolean( - DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED, - DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED); - debuggerExceptionMaxCapturedFrames = - configProvider.getInteger( - DEBUGGER_EXCEPTION_MAX_CAPTURED_FRAMES, - DEFAULT_DEBUGGER_EXCEPTION_MAX_CAPTURED_FRAMES, - DEBUGGER_EXCEPTION_CAPTURE_MAX_FRAMES); - debuggerExceptionCaptureInterval = - configProvider.getInteger( - DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS, - DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS); - debuggerSourceFileTrackingEnabled = - configProvider.getBoolean( - DEBUGGER_SOURCE_FILE_TRACKING_ENABLED, DEFAULT_DEBUGGER_SOURCE_FILE_TRACKING_ENABLED); - - debuggerThirdPartyIncludes = - tryMakeImmutableSet( - configProvider.getList( - THIRD_PARTY_INCLUDES, Collections.emptyList(), THIRD_PARTY_DETECTION_INCLUDES)); - debuggerThirdPartyExcludes = - tryMakeImmutableSet( - configProvider.getList( - THIRD_PARTY_EXCLUDES, Collections.emptyList(), THIRD_PARTY_DETECTION_EXCLUDES)); + debuggerMaxExceptionPerSecond = configProvider.getInteger( + DEBUGGER_MAX_EXCEPTION_PER_SECOND, DEFAULT_DEBUGGER_MAX_EXCEPTION_PER_SECOND); + debuggerExceptionOnlyLocalRoot = configProvider.getBoolean( + DEBUGGER_EXCEPTION_ONLY_LOCAL_ROOT, DEFAULT_DEBUGGER_EXCEPTION_ONLY_LOCAL_ROOT); + debuggerExceptionCaptureIntermediateSpansEnabled = configProvider.getBoolean( + DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED, + DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED); + debuggerExceptionMaxCapturedFrames = configProvider.getInteger( + DEBUGGER_EXCEPTION_MAX_CAPTURED_FRAMES, + DEFAULT_DEBUGGER_EXCEPTION_MAX_CAPTURED_FRAMES, + DEBUGGER_EXCEPTION_CAPTURE_MAX_FRAMES); + debuggerExceptionCaptureInterval = configProvider.getInteger( + DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS, + DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS); + debuggerSourceFileTrackingEnabled = configProvider.getBoolean( + DEBUGGER_SOURCE_FILE_TRACKING_ENABLED, DEFAULT_DEBUGGER_SOURCE_FILE_TRACKING_ENABLED); + + debuggerThirdPartyIncludes = tryMakeImmutableSet(configProvider.getList( + THIRD_PARTY_INCLUDES, Collections.emptyList(), THIRD_PARTY_DETECTION_INCLUDES)); + debuggerThirdPartyExcludes = tryMakeImmutableSet(configProvider.getList( + THIRD_PARTY_EXCLUDES, Collections.emptyList(), THIRD_PARTY_DETECTION_EXCLUDES)); debuggerShadingIdentifiers = tryMakeImmutableSet(configProvider.getList(THIRD_PARTY_SHADING_IDENTIFIERS)); @@ -3143,25 +2957,22 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) // starting from interception points if (InstrumenterConfig.get() .isIntegrationEnabled(Collections.singleton("google-pubsub"), true)) { - tmpGrpcIgnoredOutboundMethods.addAll( - configProvider.getList( - GOOGLE_PUBSUB_IGNORED_GRPC_METHODS, - Arrays.asList( - "google.pubsub.v1.Subscriber/ModifyAckDeadline", - "google.pubsub.v1.Subscriber/Acknowledge", - "google.pubsub.v1.Subscriber/Pull", - "google.pubsub.v1.Subscriber/StreamingPull", - "google.pubsub.v1.Publisher/Publish"))); + tmpGrpcIgnoredOutboundMethods.addAll(configProvider.getList( + GOOGLE_PUBSUB_IGNORED_GRPC_METHODS, + Arrays.asList( + "google.pubsub.v1.Subscriber/ModifyAckDeadline", + "google.pubsub.v1.Subscriber/Acknowledge", + "google.pubsub.v1.Subscriber/Pull", + "google.pubsub.v1.Subscriber/StreamingPull", + "google.pubsub.v1.Publisher/Publish"))); } grpcIgnoredOutboundMethods = tryMakeImmutableSet(tmpGrpcIgnoredOutboundMethods); grpcServerTrimPackageResource = configProvider.getBoolean(GRPC_SERVER_TRIM_PACKAGE_RESOURCE, false); - grpcServerErrorStatuses = - configProvider.getIntegerRange( - GRPC_SERVER_ERROR_STATUSES, DEFAULT_GRPC_SERVER_ERROR_STATUSES); - grpcClientErrorStatuses = - configProvider.getIntegerRange( - GRPC_CLIENT_ERROR_STATUSES, DEFAULT_GRPC_CLIENT_ERROR_STATUSES); + grpcServerErrorStatuses = configProvider.getIntegerRange( + GRPC_SERVER_ERROR_STATUSES, DEFAULT_GRPC_SERVER_ERROR_STATUSES); + grpcClientErrorStatuses = configProvider.getIntegerRange( + GRPC_CLIENT_ERROR_STATUSES, DEFAULT_GRPC_CLIENT_ERROR_STATUSES); hystrixTagsEnabled = configProvider.getBoolean(HYSTRIX_TAGS_ENABLED, false); hystrixMeasuredEnabled = configProvider.getBoolean(HYSTRIX_MEASURED_ENABLED, false); @@ -3175,17 +2986,15 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) igniteCacheIncludeKeys = configProvider.getBoolean(IGNITE_CACHE_INCLUDE_KEYS, false); - obfuscationQueryRegexp = - configProvider.getString( - OBFUSCATION_QUERY_STRING_REGEXP, null, "obfuscation.query.string.regexp"); + obfuscationQueryRegexp = configProvider.getString( + OBFUSCATION_QUERY_STRING_REGEXP, null, "obfuscation.query.string.regexp"); playReportHttpStatus = configProvider.getBoolean(PLAY_REPORT_HTTP_STATUS, false); servletPrincipalEnabled = configProvider.getBoolean(SERVLET_PRINCIPAL_ENABLED, false); - xDatadogTagsMaxLength = - configProvider.getInteger( - TRACE_X_DATADOG_TAGS_MAX_LENGTH, DEFAULT_TRACE_X_DATADOG_TAGS_MAX_LENGTH); + xDatadogTagsMaxLength = configProvider.getInteger( + TRACE_X_DATADOG_TAGS_MAX_LENGTH, DEFAULT_TRACE_X_DATADOG_TAGS_MAX_LENGTH); servletAsyncTimeoutError = configProvider.getBoolean(SERVLET_ASYNC_TIMEOUT_ERROR, true); @@ -3205,25 +3014,19 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) cwsEnabled = configProvider.getBoolean(CWS_ENABLED, DEFAULT_CWS_ENABLED); cwsTlsRefresh = configProvider.getInteger(CWS_TLS_REFRESH, DEFAULT_CWS_TLS_REFRESH); - dataJobsOpenLineageEnabled = - configProvider.getBoolean( - DATA_JOBS_OPENLINEAGE_ENABLED, DEFAULT_DATA_JOBS_OPENLINEAGE_ENABLED); - dataJobsOpenLineageTimeoutEnabled = - configProvider.getBoolean( - DATA_JOBS_OPENLINEAGE_TIMEOUT_ENABLED, DEFAULT_DATA_JOBS_OPENLINEAGE_TIMEOUT_ENABLED); - dataJobsParseSparkPlanEnabled = - configProvider.getBoolean( - DATA_JOBS_PARSE_SPARK_PLAN_ENABLED, DEFAULT_DATA_JOBS_PARSE_SPARK_PLAN_ENABLED); - dataJobsExperimentalFeaturesEnabled = - configProvider.getBoolean( - DATA_JOBS_EXPERIMENTAL_FEATURES_ENABLED, - DEFAULT_DATA_JOBS_EXPERIMENTAL_FEATURES_ENABLED); + dataJobsOpenLineageEnabled = configProvider.getBoolean( + DATA_JOBS_OPENLINEAGE_ENABLED, DEFAULT_DATA_JOBS_OPENLINEAGE_ENABLED); + dataJobsOpenLineageTimeoutEnabled = configProvider.getBoolean( + DATA_JOBS_OPENLINEAGE_TIMEOUT_ENABLED, DEFAULT_DATA_JOBS_OPENLINEAGE_TIMEOUT_ENABLED); + dataJobsParseSparkPlanEnabled = configProvider.getBoolean( + DATA_JOBS_PARSE_SPARK_PLAN_ENABLED, DEFAULT_DATA_JOBS_PARSE_SPARK_PLAN_ENABLED); + dataJobsExperimentalFeaturesEnabled = configProvider.getBoolean( + DATA_JOBS_EXPERIMENTAL_FEATURES_ENABLED, DEFAULT_DATA_JOBS_EXPERIMENTAL_FEATURES_ENABLED); dataStreamsEnabled = configProvider.getBoolean(DATA_STREAMS_ENABLED, DEFAULT_DATA_STREAMS_ENABLED); - dataStreamsBucketDurationSeconds = - configProvider.getFloat( - DATA_STREAMS_BUCKET_DURATION_SECONDS, DEFAULT_DATA_STREAMS_BUCKET_DURATION); + dataStreamsBucketDurationSeconds = configProvider.getFloat( + DATA_STREAMS_BUCKET_DURATION_SECONDS, DEFAULT_DATA_STREAMS_BUCKET_DURATION); dataStreamsTransactionExtractors = configProvider.getString(DATA_STREAMS_TRANSACTION_EXTRACTORS); @@ -3234,9 +3037,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) if (traceAgentArgsString == null) { traceAgentArgs = Collections.emptyList(); } else { - traceAgentArgs = - Collections.unmodifiableList( - new ArrayList<>(parseStringIntoSetOfNonEmptyStrings(traceAgentArgsString))); + traceAgentArgs = Collections.unmodifiableList( + new ArrayList<>(parseStringIntoSetOfNonEmptyStrings(traceAgentArgsString))); } dogStatsDPath = configProvider.getString(DOGSTATSD_PATH); @@ -3244,9 +3046,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) if (dogStatsDArgsString == null) { dogStatsDArgs = Collections.emptyList(); } else { - dogStatsDArgs = - Collections.unmodifiableList( - new ArrayList<>(parseStringIntoSetOfNonEmptyStrings(dogStatsDArgsString))); + dogStatsDArgs = Collections.unmodifiableList( + new ArrayList<>(parseStringIntoSetOfNonEmptyStrings(dogStatsDArgsString))); } // Setting this last because we have a few places where this can come from @@ -3254,16 +3055,13 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) boolean longRunningEnabled = configProvider.getBoolean(TRACE_LONG_RUNNING_ENABLED, DEFAULT_TRACE_LONG_RUNNING_ENABLED); - long longRunningTraceInitialFlushInterval = - configProvider.getLong( - TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL, - DEFAULT_TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL); - long longRunningTraceFlushInterval = - configProvider.getLong( - TRACE_LONG_RUNNING_FLUSH_INTERVAL, DEFAULT_TRACE_LONG_RUNNING_FLUSH_INTERVAL); - serviceDiscoveryEnabled = - configProvider.getBoolean( - TRACE_SERVICE_DISCOVERY_ENABLED, DEFAULT_SERVICE_DISCOVERY_ENABLED); + long longRunningTraceInitialFlushInterval = configProvider.getLong( + TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL, + DEFAULT_TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL); + long longRunningTraceFlushInterval = configProvider.getLong( + TRACE_LONG_RUNNING_FLUSH_INTERVAL, DEFAULT_TRACE_LONG_RUNNING_FLUSH_INTERVAL); + serviceDiscoveryEnabled = configProvider.getBoolean( + TRACE_SERVICE_DISCOVERY_ENABLED, DEFAULT_SERVICE_DISCOVERY_ENABLED); if (longRunningEnabled && (longRunningTraceInitialFlushInterval < 10 @@ -3288,35 +3086,29 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) this.longRunningTraceInitialFlushInterval = longRunningTraceInitialFlushInterval; this.longRunningTraceFlushInterval = longRunningTraceFlushInterval; - this.sparkTaskHistogramEnabled = - configProvider.getBoolean( - SPARK_TASK_HISTOGRAM_ENABLED, DEFAULT_SPARK_TASK_HISTOGRAM_ENABLED); + this.sparkTaskHistogramEnabled = configProvider.getBoolean( + SPARK_TASK_HISTOGRAM_ENABLED, DEFAULT_SPARK_TASK_HISTOGRAM_ENABLED); this.sparkAppNameAsService = configProvider.getBoolean(SPARK_APP_NAME_AS_SERVICE, DEFAULT_SPARK_APP_NAME_AS_SERVICE); - this.jaxRsExceptionAsErrorsEnabled = - configProvider.getBoolean( - JAX_RS_EXCEPTION_AS_ERROR_ENABLED, DEFAULT_JAX_RS_EXCEPTION_AS_ERROR_ENABLED); + this.jaxRsExceptionAsErrorsEnabled = configProvider.getBoolean( + JAX_RS_EXCEPTION_AS_ERROR_ENABLED, DEFAULT_JAX_RS_EXCEPTION_AS_ERROR_ENABLED); axisPromoteResourceName = configProvider.getBoolean(AXIS_PROMOTE_RESOURCE_NAME, false); - websocketMessagesInheritSampling = - configProvider.getBoolean( - TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING, DEFAULT_WEBSOCKET_MESSAGES_INHERIT_SAMPLING); - websocketMessagesSeparateTraces = - configProvider.getBoolean( - TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES, DEFAULT_WEBSOCKET_MESSAGES_SEPARATE_TRACES); + websocketMessagesInheritSampling = configProvider.getBoolean( + TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING, DEFAULT_WEBSOCKET_MESSAGES_INHERIT_SAMPLING); + websocketMessagesSeparateTraces = configProvider.getBoolean( + TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES, DEFAULT_WEBSOCKET_MESSAGES_SEPARATE_TRACES); websocketTagSessionId = configProvider.getBoolean(TRACE_WEBSOCKET_TAG_SESSION_ID, DEFAULT_WEBSOCKET_TAG_SESSION_ID); - this.traceFlushIntervalSeconds = - configProvider.getFloat( - TracerConfig.TRACE_FLUSH_INTERVAL, ConfigDefaults.DEFAULT_TRACE_FLUSH_INTERVAL); + this.traceFlushIntervalSeconds = configProvider.getFloat( + TracerConfig.TRACE_FLUSH_INTERVAL, ConfigDefaults.DEFAULT_TRACE_FLUSH_INTERVAL); - this.tracePostProcessingTimeout = - configProvider.getLong( - TRACE_POST_PROCESSING_TIMEOUT, DEFAULT_TRACE_POST_PROCESSING_TIMEOUT); + this.tracePostProcessingTimeout = configProvider.getLong( + TRACE_POST_PROCESSING_TIMEOUT, DEFAULT_TRACE_POST_PROCESSING_TIMEOUT); if (isLlmObsEnabled()) { log.debug( @@ -3351,9 +3143,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) } } - this.telemetryDebugRequestsEnabled = - configProvider.getBoolean( - TELEMETRY_DEBUG_REQUESTS_ENABLED, DEFAULT_TELEMETRY_DEBUG_REQUESTS_ENABLED); + this.telemetryDebugRequestsEnabled = configProvider.getBoolean( + TELEMETRY_DEBUG_REQUESTS_ENABLED, DEFAULT_TELEMETRY_DEBUG_REQUESTS_ENABLED); this.agentlessLogSubmissionQueueSize = configProvider.getInteger(AGENTLESS_LOG_SUBMISSION_QUEUE_SIZE, 1024); @@ -3362,9 +3153,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) this.agentlessLogSubmissionUrl = configProvider.getString(AGENTLESS_LOG_SUBMISSION_URL); this.agentlessLogSubmissionProduct = isCiVisibilityEnabled() ? "citest" : "apm"; - this.cloudPayloadTaggingServices = - configProvider.getSet( - TRACE_CLOUD_PAYLOAD_TAGGING_SERVICES, DEFAULT_TRACE_CLOUD_PAYLOAD_TAGGING_SERVICES); + this.cloudPayloadTaggingServices = configProvider.getSet( + TRACE_CLOUD_PAYLOAD_TAGGING_SERVICES, DEFAULT_TRACE_CLOUD_PAYLOAD_TAGGING_SERVICES); List cloudReqPayloadTaggingConf = configProvider.getList(TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING, null); @@ -3403,14 +3193,11 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) this.cloudPayloadTaggingMaxTags = configProvider.getInteger(TRACE_CLOUD_PAYLOAD_TAGGING_MAX_TAGS, 758); - this.dependecyResolutionPeriodMillis = - configProvider.getLong( - GeneralConfig.TELEMETRY_DEPENDENCY_RESOLUTION_PERIOD_MILLIS, - 1000); // 1 second by default + this.dependecyResolutionPeriodMillis = configProvider.getLong( + GeneralConfig.TELEMETRY_DEPENDENCY_RESOLUTION_PERIOD_MILLIS, 1000); // 1 second by default - timelineEventsEnabled = - configProvider.getBoolean( - PROFILING_TIMELINE_EVENTS_ENABLED, PROFILING_TIMELINE_EVENTS_ENABLED_DEFAULT); + timelineEventsEnabled = configProvider.getBoolean( + PROFILING_TIMELINE_EVENTS_ENABLED, PROFILING_TIMELINE_EVENTS_ENABLED_DEFAULT); if (appSecScaEnabled != null && appSecScaEnabled @@ -3438,10 +3225,9 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) this.tagValueUtf8CacheSize = Math.max(configProvider.getInteger(GeneralConfig.TAG_VALUE_UTF8_CACHE_SIZE, 384), 0); - int defaultStackTraceLengthLimit = - instrumenterConfig.isCiVisibilityEnabled() - ? CIConstants.MAX_META_STRING_VALUE_LENGTH // EVP limit - : Integer.MAX_VALUE; // no effective limit (old behavior) + int defaultStackTraceLengthLimit = instrumenterConfig.isCiVisibilityEnabled() + ? CIConstants.MAX_META_STRING_VALUE_LENGTH // EVP limit + : Integer.MAX_VALUE; // no effective limit (old behavior) this.stackTraceLengthLimit = configProvider.getInteger(STACK_TRACE_LENGTH_LIMIT, defaultStackTraceLengthLimit); @@ -3452,9 +3238,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) this.aiGuardTimeout = configProvider.getInteger(AI_GUARD_TIMEOUT, DEFAULT_AI_GUARD_TIMEOUT); this.aiGuardMaxContentSize = configProvider.getInteger(AI_GUARD_MAX_CONTENT_SIZE, DEFAULT_AI_GUARD_MAX_CONTENT_SIZE); - this.aiGuardMaxMessagesLength = - configProvider.getInteger( - AI_GUARD_MAX_MESSAGES_LENGTH, DEFAULT_AI_GUARD_MAX_MESSAGES_LENGTH); + this.aiGuardMaxMessagesLength = configProvider.getInteger( + AI_GUARD_MAX_MESSAGES_LENGTH, DEFAULT_AI_GUARD_MAX_MESSAGES_LENGTH); log.debug("New instance: {}", this); } @@ -4135,10 +3920,9 @@ public String getSpanSamplingRulesFile() { public boolean isProfilingEnabled() { if (Platform.isNativeImage()) { if (!instrumenterConfig.isProfilingEnabled() && profilingEnabled.isActive()) { - log.warn( - "Profiling was not enabled during the native image build. " - + "Please set DD_PROFILING_ENABLED=true in your native image build configuration if you want" - + "to use profiling."); + log.warn("Profiling was not enabled during the native image build. " + + "Please set DD_PROFILING_ENABLED=true in your native image build configuration if you want" + + "to use profiling."); } } return profilingEnabled.isActive() && instrumenterConfig.isProfilingEnabled(); @@ -4266,10 +4050,9 @@ public static boolean isDatadogProfilerSafeInCurrentEnvironment() { } else { // JDK 18 is missing ASGCT fixes, so we can't use it if (!isJavaVersion(18)) { - result = - isJavaVersionAtLeast(17, 0, 5) - || (isJavaVersion(11) && isJavaVersionAtLeast(11, 0, 17)) - || (isJavaVersion(8) && isJavaVersionAtLeast(8, 0, 352)); + result = isJavaVersionAtLeast(17, 0, 5) + || (isJavaVersion(11) && isJavaVersionAtLeast(11, 0, 17)) + || (isJavaVersion(8) && isJavaVersionAtLeast(8, 0, 352)); } } return result; @@ -5504,9 +5287,8 @@ public Map getMergedSpanTags() { public Map getMergedJmxTags() { final Map runtimeTags = getRuntimeTags(); - final Map result = - newHashMap( - getGlobalTags().size() + jmxTags.size() + runtimeTags.size() + 1 /* for serviceName */); + final Map result = newHashMap( + getGlobalTags().size() + jmxTags.size() + runtimeTags.size() + 1 /* for serviceName */); result.putAll(getGlobalTags()); result.putAll(jmxTags); result.putAll(runtimeTags); @@ -5520,12 +5302,10 @@ public Map getMergedJmxTags() { public Map getMergedProfilingTags() { final Map runtimeTags = getRuntimeTags(); final String host = getHostName(); - final Map result = - newHashMap( - getGlobalTags().size() - + profilingTags.size() - + runtimeTags.size() - + 4 /* for serviceName and host and language and runtime_version */); + final Map result = newHashMap(getGlobalTags().size() + + profilingTags.size() + + runtimeTags.size() + + 4 /* for serviceName and host and language and runtime_version */); result.put(HOST_TAG, host); // Host goes first to allow to override it result.putAll(getGlobalTags()); result.putAll(profilingTags); @@ -5544,13 +5324,11 @@ public Map getMergedProfilingTags() { public Map getMergedCrashTrackingTags() { final Map runtimeTags = getRuntimeTags(); final String host = getHostName(); - final Map result = - newHashMap( - getGlobalTags().size() - + crashTrackingTags.size() - + jmxTags.size() - + runtimeTags.size() - + 5 /* for serviceName and host and language and env and version */); + final Map result = newHashMap(getGlobalTags().size() + + crashTrackingTags.size() + + jmxTags.size() + + runtimeTags.size() + + 5 /* for serviceName and host and language and env and version */); result.put(HOST_TAG, host); // Host goes first to allow to override it result.putAll(getGlobalTags()); result.putAll(jmxTags); @@ -5665,13 +5443,12 @@ private Map getAzureAppServicesTags() { if (subscriptionId != null && siteName != null && resourceGroup != null) { // The resource ID of the site instance in Azure App Services - String resourceId = - "/subscriptions/" - + subscriptionId - + "/resourcegroups/" - + resourceGroup - + "/providers/microsoft.web/sites/" - + siteName; + String resourceId = "/subscriptions/" + + subscriptionId + + "/resourcegroups/" + + resourceGroup + + "/providers/microsoft.web/sites/" + + siteName; resourceId = resourceId.toLowerCase(Locale.ROOT); aasTags.put("aas.resource.id", resourceId); } else { @@ -5945,9 +5722,8 @@ public boolean isRuleEnabled(final String name) { public boolean isRuleEnabled(final String name, boolean defaultEnabled) { boolean enabled = configProvider.getBoolean("trace." + name + ".enabled", defaultEnabled); - boolean lowerEnabled = - configProvider.getBoolean( - "trace." + name.toLowerCase(Locale.ROOT) + ".enabled", defaultEnabled); + boolean lowerEnabled = configProvider.getBoolean( + "trace." + name.toLowerCase(Locale.ROOT) + ".enabled", defaultEnabled); return defaultEnabled ? enabled && lowerEnabled : enabled || lowerEnabled; } @@ -6418,9 +6194,8 @@ static String initHostName() { // Try hostname command try (final TraceScope scope = AgentTracer.get().muteTracing(); - final BufferedReader reader = - new BufferedReader( - new InputStreamReader(Runtime.getRuntime().exec("hostname").getInputStream()))) { + final BufferedReader reader = new BufferedReader( + new InputStreamReader(Runtime.getRuntime().exec("hostname").getInputStream()))) { possibleHostname = reader.readLine(); } catch (final Throwable ignore) { // Ignore. Hostname command is not always available @@ -6479,12 +6254,11 @@ private static String getProp(String name, String def) { } // This has to be placed after all other static fields to give them a chance to initialize - private static final Config INSTANCE = - new Config( - Platform.isNativeImageBuilder() - ? ConfigProvider.withoutCollector() - : ConfigProvider.getInstance(), - InstrumenterConfig.get()); + private static final Config INSTANCE = new Config( + Platform.isNativeImageBuilder() + ? ConfigProvider.withoutCollector() + : ConfigProvider.getInstance(), + InstrumenterConfig.get()); public static Config get() { return INSTANCE; diff --git a/internal-api/src/main/java/datadog/trace/api/Functions.java b/internal-api/src/main/java/datadog/trace/api/Functions.java index 731cd711a9a..aba75d11805 100644 --- a/internal-api/src/main/java/datadog/trace/api/Functions.java +++ b/internal-api/src/main/java/datadog/trace/api/Functions.java @@ -180,12 +180,11 @@ public T apply(Object input) { public static final Function UTF8_BYTES_TO_STRING = bytes -> new String(bytes, UTF_8); - public static final Function BASE64_DECODE = - bytes -> { - try { - return new String(Base64.getDecoder().decode(bytes), UTF_8); - } catch (final Exception ignored) { - return null; - } - }; + public static final Function BASE64_DECODE = bytes -> { + try { + return new String(Base64.getDecoder().decode(bytes), UTF_8); + } catch (final Exception ignored) { + return null; + } + }; } diff --git a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java index 84b407a6836..29a4d748ebe 100644 --- a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java @@ -257,22 +257,18 @@ private InstrumenterConfig() { detailedInstrumentationErrors = configProvider.getBoolean(DETAILED_INSTRUMENTATION_ERRORS, false); - codeOriginEnabled = - configProvider.getBoolean( - CODE_ORIGIN_FOR_SPANS_ENABLED, getDefaultCodeOriginForSpanEnabled()); - codeOriginInterfaceSupport = - configProvider.getBoolean( - CODE_ORIGIN_FOR_SPANS_INTERFACE_SUPPORT, - DEFAULT_CODE_ORIGIN_FOR_SPANS_INTERFACE_SUPPORT); + codeOriginEnabled = configProvider.getBoolean( + CODE_ORIGIN_FOR_SPANS_ENABLED, getDefaultCodeOriginForSpanEnabled()); + codeOriginInterfaceSupport = configProvider.getBoolean( + CODE_ORIGIN_FOR_SPANS_INTERFACE_SUPPORT, DEFAULT_CODE_ORIGIN_FOR_SPANS_INTERFACE_SUPPORT); traceEnabled = configProvider.getBoolean(TRACE_ENABLED, DEFAULT_TRACE_ENABLED); traceOtelEnabled = configProvider.getBoolean(TRACE_OTEL_ENABLED, DEFAULT_TRACE_OTEL_ENABLED); metricsOtelEnabled = configProvider.getBoolean(METRICS_OTEL_ENABLED, DEFAULT_METRICS_OTEL_ENABLED); logsOtelEnabled = configProvider.getBoolean(LOGS_OTEL_ENABLED, DEFAULT_LOGS_OTEL_ENABLED); - profilingEnabled = - ProfilingEnablement.of( - configProvider.getString(PROFILING_ENABLED, String.valueOf(PROFILING_ENABLED_DEFAULT))); + profilingEnabled = ProfilingEnablement.of( + configProvider.getString(PROFILING_ENABLED, String.valueOf(PROFILING_ENABLED_DEFAULT))); rumEnabled = configProvider.getBoolean(RUM_ENABLED, DEFAULT_RUM_ENABLED); dataJobsEnabled = configProvider.getBoolean(DATA_JOBS_ENABLED, DEFAULT_DATA_JOBS_ENABLED); @@ -281,12 +277,10 @@ private InstrumenterConfig() { if (!Platform.isNativeImageBuilder()) { ciVisibilityEnabled = configProvider.getBoolean(CIVISIBILITY_ENABLED, DEFAULT_CIVISIBILITY_ENABLED); - appSecActivation = - ProductActivation.fromString( - configProvider.getStringNotEmpty(APPSEC_ENABLED, DEFAULT_APPSEC_ENABLED)); - iastActivation = - ProductActivation.fromString( - configProvider.getStringNotEmpty(IAST_ENABLED, DEFAULT_IAST_ENABLED)); + appSecActivation = ProductActivation.fromString( + configProvider.getStringNotEmpty(APPSEC_ENABLED, DEFAULT_APPSEC_ENABLED)); + iastActivation = ProductActivation.fromString( + configProvider.getStringNotEmpty(IAST_ENABLED, DEFAULT_IAST_ENABLED)); final Boolean iastEnabled = configProvider.getBoolean(IAST_ENABLED); iastFullyDisabled = iastEnabled != null && !iastEnabled; usmEnabled = configProvider.getBoolean(USM_ENABLED, DEFAULT_USM_ENABLED); @@ -322,9 +316,8 @@ private InstrumenterConfig() { akkaForkJoinExecutorTaskName = configProvider.getString(AKKA_FORK_JOIN_EXECUTOR_TASK_NAME, ""); akkaForkJoinPoolName = configProvider.getString(AKKA_FORK_JOIN_POOL_NAME, ""); - directAllocationProfilingEnabled = - configProvider.getBoolean( - PROFILING_DIRECT_ALLOCATION_ENABLED, PROFILING_DIRECT_ALLOCATION_ENABLED_DEFAULT); + directAllocationProfilingEnabled = configProvider.getBoolean( + PROFILING_DIRECT_ALLOCATION_ENABLED, PROFILING_DIRECT_ALLOCATION_ENABLED_DEFAULT); excludedClasses = tryMakeImmutableList(configProvider.getList(TRACE_CLASSES_EXCLUDE)); excludedClassesFile = configProvider.getString(TRACE_CLASSES_EXCLUDE_FILE); @@ -334,9 +327,8 @@ private InstrumenterConfig() { deferIntegrationsUntil = configProvider.getString(EXPERIMENTAL_DEFER_INTEGRATIONS_UNTIL); - resolverCacheConfig = - configProvider.getEnum( - RESOLVER_CACHE_CONFIG, ResolverCacheConfig.class, ResolverCacheConfig.MEMOS); + resolverCacheConfig = configProvider.getEnum( + RESOLVER_CACHE_CONFIG, ResolverCacheConfig.class, ResolverCacheConfig.MEMOS); resolverCacheDir = configProvider.getString(RESOLVER_CACHE_DIR); resolverNamesAreUnique = configProvider.getBoolean(RESOLVER_NAMES_ARE_UNIQUE, false); resolverSimpleMethodGraph = @@ -344,57 +336,46 @@ private InstrumenterConfig() { configProvider.getBoolean(RESOLVER_SIMPLE_METHOD_GRAPH, !Platform.isNativeImageBuilder()); resolverUseLoadClass = configProvider.getBoolean(RESOLVER_USE_LOADCLASS, true); resolverUseUrlCaches = configProvider.getBoolean(RESOLVER_USE_URL_CACHES); - resolverResetInterval = - Platform.isNativeImageBuilder() - ? 0 - : configProvider.getInteger(RESOLVER_RESET_INTERVAL, DEFAULT_RESOLVER_RESET_INTERVAL); + resolverResetInterval = Platform.isNativeImageBuilder() + ? 0 + : configProvider.getInteger(RESOLVER_RESET_INTERVAL, DEFAULT_RESOLVER_RESET_INTERVAL); unsafeClassInjection = configProvider.getBoolean(UNSAFE_CLASS_INJECTION, false); visitorClassParsing = configProvider.getBoolean(VISITOR_CLASS_PARSING, false); - runtimeContextFieldInjection = - configProvider.getBoolean( - RUNTIME_CONTEXT_FIELD_INJECTION, DEFAULT_RUNTIME_CONTEXT_FIELD_INJECTION); - serialVersionUIDFieldInjection = - configProvider.getBoolean( - SERIALVERSIONUID_FIELD_INJECTION, DEFAULT_SERIALVERSIONUID_FIELD_INJECTION); - runtimeContextMapPerStore = - configProvider.getBoolean( - RUNTIME_CONTEXT_MAP_PER_STORE, DEFAULT_RUNTIME_CONTEXT_MAP_PER_STORE); + runtimeContextFieldInjection = configProvider.getBoolean( + RUNTIME_CONTEXT_FIELD_INJECTION, DEFAULT_RUNTIME_CONTEXT_FIELD_INJECTION); + serialVersionUIDFieldInjection = configProvider.getBoolean( + SERIALVERSIONUID_FIELD_INJECTION, DEFAULT_SERIALVERSIONUID_FIELD_INJECTION); + runtimeContextMapPerStore = configProvider.getBoolean( + RUNTIME_CONTEXT_MAP_PER_STORE, DEFAULT_RUNTIME_CONTEXT_MAP_PER_STORE); instrumentationConfigId = configProvider.getString(INSTRUMENTATION_CONFIG_ID, ""); traceAnnotations = configProvider.getString(TRACE_ANNOTATIONS, DEFAULT_TRACE_ANNOTATIONS); traceAnnotationAsync = configProvider.getBoolean(TRACE_ANNOTATION_ASYNC, DEFAULT_TRACE_ANNOTATION_ASYNC); - traceMethods = - MethodFilterConfigParser.parse( - configProvider.getString(TRACE_METHODS, DEFAULT_TRACE_METHODS)); - traceNativeMethods = - MethodFilterConfigParser.parse( - configProvider.getString(TRACE_NATIVE_METHODS, DEFAULT_TRACE_NATIVE_METHODS)); - measureMethods = - MethodFilterConfigParser.parse( - configProvider.getString(MEASURE_METHODS, DEFAULT_MEASURE_METHODS)); - measureNativeMethods = - MethodFilterConfigParser.parse( - configProvider.getString(MEASURE_NATIVE_METHODS, DEFAULT_MEASURE_NATIVE_METHODS)); + traceMethods = MethodFilterConfigParser.parse( + configProvider.getString(TRACE_METHODS, DEFAULT_TRACE_METHODS)); + traceNativeMethods = MethodFilterConfigParser.parse( + configProvider.getString(TRACE_NATIVE_METHODS, DEFAULT_TRACE_NATIVE_METHODS)); + measureMethods = MethodFilterConfigParser.parse( + configProvider.getString(MEASURE_METHODS, DEFAULT_MEASURE_METHODS)); + measureNativeMethods = MethodFilterConfigParser.parse( + configProvider.getString(MEASURE_NATIVE_METHODS, DEFAULT_MEASURE_NATIVE_METHODS)); internalExitOnFailure = configProvider.getBoolean(INTERNAL_EXIT_ON_FAILURE, false); this.additionalJaxRsAnnotations = tryMakeImmutableSet(configProvider.getList(JAX_RS_ADDITIONAL_ANNOTATIONS)); - this.websocketTracingEnabled = - configProvider.getBoolean( - TRACE_WEBSOCKET_MESSAGES_ENABLED, DEFAULT_WEBSOCKET_MESSAGES_ENABLED); + this.websocketTracingEnabled = configProvider.getBoolean( + TRACE_WEBSOCKET_MESSAGES_ENABLED, DEFAULT_WEBSOCKET_MESSAGES_ENABLED); this.pekkoSchedulerEnabled = configProvider.getBoolean(TRACE_PEKKO_SCHEDULER_ENABLED, false); agentlessLogSubmissionEnabled = configProvider.getBoolean(AGENTLESS_LOG_SUBMISSION_ENABLED, false); - apiSecurityEndpointCollectionEnabled = - configProvider.getBoolean( - API_SECURITY_ENDPOINT_COLLECTION_ENABLED, - DEFAULT_API_SECURITY_ENDPOINT_COLLECTION_ENABLED); + apiSecurityEndpointCollectionEnabled = configProvider.getBoolean( + API_SECURITY_ENDPOINT_COLLECTION_ENABLED, DEFAULT_API_SECURITY_ENDPOINT_COLLECTION_ENABLED); appLogsCollectionEnabled = configProvider.getBoolean(APP_LOGS_COLLECTION_ENABLED, DEFAULT_APP_LOGS_COLLECTION_ENABLED); @@ -752,11 +733,10 @@ public boolean isLegacyContextManagerEnabled() { } // This has to be placed after all other static fields to give them a chance to initialize - private static final InstrumenterConfig INSTANCE = - new InstrumenterConfig( - Platform.isNativeImageBuilder() - ? ConfigProvider.withoutCollector() - : ConfigProvider.getInstance()); + private static final InstrumenterConfig INSTANCE = new InstrumenterConfig( + Platform.isNativeImageBuilder() + ? ConfigProvider.withoutCollector() + : ConfigProvider.getInstance()); public static boolean getDefaultCodeOriginForSpanEnabled() { if (JavaVirtualMachine.isJavaVersionAtLeast(21)) { diff --git a/internal-api/src/main/java/datadog/trace/api/ProcessTags.java b/internal-api/src/main/java/datadog/trace/api/ProcessTags.java index 460238f3cf5..faad7505816 100644 --- a/internal-api/src/main/java/datadog/trace/api/ProcessTags.java +++ b/internal-api/src/main/java/datadog/trace/api/ProcessTags.java @@ -32,7 +32,8 @@ public class ProcessTags { public static final String ENTRYPOINT_BASEDIR = "entrypoint.basedir"; public static final String ENTRYPOINT_WORKDIR = "entrypoint.workdir"; - @VisibleForTesting static Function envGetter = EnvironmentVariables::get; + @VisibleForTesting + static Function envGetter = EnvironmentVariables::get; private static class Lazy { // the tags are used to compute a hash for dsm hence that map must be sorted. @@ -201,19 +202,13 @@ static void calculate() { return; } synchronized (Lazy.TAGS) { - final Stream tagStream = - TAGS.entrySet().stream() - .map( - entry -> - UTF8BytesString.create( - entry.getKey() - + ":" - + TraceUtils.normalizeTagValue( - entry.getValue().replace(':', '_')))); + final Stream tagStream = TAGS.entrySet().stream() + .map(entry -> UTF8BytesString.create(entry.getKey() + + ":" + + TraceUtils.normalizeTagValue(entry.getValue().replace(':', '_')))); utf8ListForm = Collections.unmodifiableList(tagStream.collect(Collectors.toList())); - stringListForm = - Collections.unmodifiableList( - utf8ListForm.stream().map(UTF8BytesString::toString).collect(Collectors.toList())); + stringListForm = Collections.unmodifiableList( + utf8ListForm.stream().map(UTF8BytesString::toString).collect(Collectors.toList())); serializedForm = UTF8BytesString.create(String.join(",", utf8ListForm)); } } diff --git a/internal-api/src/main/java/datadog/trace/api/Stateful.java b/internal-api/src/main/java/datadog/trace/api/Stateful.java index b9532ca6af3..eb0cd4b53bb 100644 --- a/internal-api/src/main/java/datadog/trace/api/Stateful.java +++ b/internal-api/src/main/java/datadog/trace/api/Stateful.java @@ -2,14 +2,13 @@ public interface Stateful extends AutoCloseable { - Stateful DEFAULT = - new Stateful() { - @Override - public void close() {} + Stateful DEFAULT = new Stateful() { + @Override + public void close() {} - @Override - public void activate(Object context) {} - }; + @Override + public void activate(Object context) {} + }; @Override void close(); diff --git a/internal-api/src/main/java/datadog/trace/api/TagMap.java b/internal-api/src/main/java/datadog/trace/api/TagMap.java index 39160ae11ff..8e0182118a8 100644 --- a/internal-api/src/main/java/datadog/trace/api/TagMap.java +++ b/internal-api/src/main/java/datadog/trace/api/TagMap.java @@ -1035,7 +1035,8 @@ public EntryChange next() { * final only so {@link #clear()} can detach it (to null); it is otherwise fixed at construction * and never re-pointed. Package-visible so same-package tests can assert attach/detach directly. */ - @VisibleForTesting TagMap parent; + @VisibleForTesting + TagMap parent; /** * Parent keys removed locally (read-through tombstones). Lazily allocated on the first such @@ -1570,10 +1571,9 @@ private void putAllMerge(TagMap that) { thisBuckets[i] = thatEntry; // replacing entry, no size change } else { - thisBuckets[i] = - new BucketGroup( - thisHash, thisEntry, - thatHash, thatEntry); + thisBuckets[i] = new BucketGroup( + thisHash, thisEntry, + thatHash, thatEntry); this.size += 1; } } else if (thatBucket instanceof BucketGroup) { @@ -2373,7 +2373,7 @@ Entry _entryAt(int index) { case 3: return this.entry3; - // Do not use default case, that creates a 5% cost on entry handling + // Do not use default case, that creates a 5% cost on entry handling } return null; @@ -2393,7 +2393,7 @@ int _hashAt(int index) { case 3: return this.hash3; - // Do not use default case, that creates a 5% cost on entry handling + // Do not use default case, that creates a 5% cost on entry handling } return 0; @@ -2465,29 +2465,21 @@ BucketGroup replaceOrInsertAllInChain(BucketGroup thatHeadGroup) { // First phase - tries to replace or insert each entry in the existing bucket chain // Only need to search the original groups for replacements // The whole chain is eligible for insertions - boolean handled0 = - (thatCurGroup.hash0 == 0) - || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash0, thatCurGroup.entry0) - != null) - || thisNewestHeadGroup.insertInChain(thatCurGroup.hash0, thatCurGroup.entry0); - - boolean handled1 = - (thatCurGroup.hash1 == 0) - || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash1, thatCurGroup.entry1) - != null) - || thisNewestHeadGroup.insertInChain(thatCurGroup.hash1, thatCurGroup.entry1); - - boolean handled2 = - (thatCurGroup.hash2 == 0) - || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash2, thatCurGroup.entry2) - != null) - || thisNewestHeadGroup.insertInChain(thatCurGroup.hash2, thatCurGroup.entry2); - - boolean handled3 = - (thatCurGroup.hash3 == 0) - || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash3, thatCurGroup.entry3) - != null) - || thisNewestHeadGroup.insertInChain(thatCurGroup.hash3, thatCurGroup.entry3); + boolean handled0 = (thatCurGroup.hash0 == 0) + || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash0, thatCurGroup.entry0) != null) + || thisNewestHeadGroup.insertInChain(thatCurGroup.hash0, thatCurGroup.entry0); + + boolean handled1 = (thatCurGroup.hash1 == 0) + || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash1, thatCurGroup.entry1) != null) + || thisNewestHeadGroup.insertInChain(thatCurGroup.hash1, thatCurGroup.entry1); + + boolean handled2 = (thatCurGroup.hash2 == 0) + || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash2, thatCurGroup.entry2) != null) + || thisNewestHeadGroup.insertInChain(thatCurGroup.hash2, thatCurGroup.entry2); + + boolean handled3 = (thatCurGroup.hash3 == 0) + || (thisOrigHeadGroup.replaceInChain(thatCurGroup.hash3, thatCurGroup.entry3) != null) + || thisNewestHeadGroup.insertInChain(thatCurGroup.hash3, thatCurGroup.entry3); // Second phase - takes any entries that weren't handled by phase 1 and puts them // into a new BucketGroup. Since BucketGroups are fixed size, we know that the @@ -3006,14 +2998,13 @@ static boolean isNumericPrimitive(Object value) { } static boolean isObject(Object value) { - boolean isSupportedPrimitive = - (value instanceof Integer) - || (value instanceof Long) - || (value instanceof Double) - || (value instanceof Float) - || (value instanceof Boolean) - || (value instanceof Short) - || (value instanceof Byte); + boolean isSupportedPrimitive = (value instanceof Integer) + || (value instanceof Long) + || (value instanceof Double) + || (value instanceof Float) + || (value instanceof Boolean) + || (value instanceof Short) + || (value instanceof Byte); // NOTE: Character is just treated as Object return !isSupportedPrimitive; diff --git a/internal-api/src/main/java/datadog/trace/api/UserIdCollectionMode.java b/internal-api/src/main/java/datadog/trace/api/UserIdCollectionMode.java index cf2651405cd..9767d3f6bcd 100644 --- a/internal-api/src/main/java/datadog/trace/api/UserIdCollectionMode.java +++ b/internal-api/src/main/java/datadog/trace/api/UserIdCollectionMode.java @@ -18,26 +18,24 @@ public enum UserIdCollectionMode { } public static UserIdCollectionMode fromString(String collectionMode, String trackingMode) { - return CURRENT_MODE.updateAndGet( - current -> { - if (collectionMode == null && trackingMode != null) { - return fromTracking(trackingMode); - } else { - return fromMode(collectionMode); - } - }); + return CURRENT_MODE.updateAndGet(current -> { + if (collectionMode == null && trackingMode != null) { + return fromTracking(trackingMode); + } else { + return fromMode(collectionMode); + } + }); } public static UserIdCollectionMode fromRemoteConfig(final String mode) { - return CURRENT_MODE.updateAndGet( - current -> { - if (mode == null) { - // use locally configured value - return Config.get().getAppSecUserIdCollectionMode(); - } else { - return fromMode(mode); - } - }); + return CURRENT_MODE.updateAndGet(current -> { + if (mode == null) { + // use locally configured value + return Config.get().getAppSecUserIdCollectionMode(); + } else { + return fromMode(mode); + } + }); } private static UserIdCollectionMode fromMode(String mode) { diff --git a/internal-api/src/main/java/datadog/trace/api/WithGlobalTracer.java b/internal-api/src/main/java/datadog/trace/api/WithGlobalTracer.java index 6e11d5d7b65..94cf455f38d 100644 --- a/internal-api/src/main/java/datadog/trace/api/WithGlobalTracer.java +++ b/internal-api/src/main/java/datadog/trace/api/WithGlobalTracer.java @@ -22,17 +22,16 @@ private WithGlobalTracer() {} * the tracer is already installed. */ public static void registerOrExecute(final Callback callback) { - GlobalTracer.registerInstallationCallback( - new GlobalTracer.Callback() { - @Override - public void installed(Tracer tracer) { - if (tracer instanceof TracerAPI) { - callback.withTracer((TracerAPI) tracer); - } else { - log.warn("Unsupported tracer type {}", tracer.getClass().getName()); - } - } - }); + GlobalTracer.registerInstallationCallback(new GlobalTracer.Callback() { + @Override + public void installed(Tracer tracer) { + if (tracer instanceof TracerAPI) { + callback.withTracer((TracerAPI) tracer); + } else { + log.warn("Unsupported tracer type {}", tracer.getClass().getName()); + } + } + }); } public interface Callback { diff --git a/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java b/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java index 5156e0c56ae..4a02233b51a 100644 --- a/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java +++ b/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java @@ -12,9 +12,8 @@ public final class RadixTreeCache { // should cover range [0, 512) to cover all standard HTTP statuses // 16 pages of 32 should keep the tree sparse with typical pages // covering ranges [192, 224), [288, 320), [384, 416), [480, 512) - public static final RadixTreeCache HTTP_STATUSES = - new RadixTreeCache<>( - 16, 32, TO_STRING, 200, 201, 301, 307, 400, 401, 403, 404, 500, 502, 503); + public static final RadixTreeCache HTTP_STATUSES = new RadixTreeCache<>( + 16, 32, TO_STRING, 200, 201, 301, 307, 400, 401, 403, 404, 500, 502, 503); private final int level1; private final int level2; diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/config/BazelMode.java b/internal-api/src/main/java/datadog/trace/api/civisibility/config/BazelMode.java index 56698fe7085..ce2b0b61f0c 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/config/BazelMode.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/config/BazelMode.java @@ -31,15 +31,19 @@ public class BazelMode { /* manifestModeEnabled reports whether a supported manifest was found and can be used for config cache */ private final boolean manifestModeEnabled; /* manifestPath is the resolved absolute path to the Bazel manifest while in manifest mode */ - @Nullable private final String manifestPath; + @Nullable + private final String manifestPath; /* manifestDir is the directory containing the resolved manifest and the cached config files */ - @Nullable private final String manifestDir; + @Nullable + private final String manifestDir; /* payloadFilesEnabled reports whether Bazel payload-in-file mode is enabled */ private final boolean payloadFilesEnabled; /* payloadsDir is the root directory containing payload output directories */ - @Nullable private final String payloadsDir; + @Nullable + private final String payloadsDir; /* repoRoot is the absolute path to the runfiles workspace dir, used as a virtual repo root */ - @Nullable private final String repoRoot; + @Nullable + private final String repoRoot; public static BazelMode get() { if (INSTANCE == null) { @@ -232,7 +236,8 @@ private static boolean isManifestCompatible(String manifestPath) { // manifest.txt first line has the shape `version=` String trimmed = firstLine.trim(); int separatorIdx = trimmed.indexOf('='); - if (separatorIdx < 0 || !"version".equals(trimmed.substring(0, separatorIdx).trim())) { + if (separatorIdx < 0 + || !"version".equals(trimmed.substring(0, separatorIdx).trim())) { LOGGER.warn("[bazel mode] Could not parse manifest version from line: '{}'", trimmed); return false; } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/config/TestSourceData.java b/internal-api/src/main/java/datadog/trace/api/civisibility/config/TestSourceData.java index c14bf647ea9..d7b45316a35 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/config/TestSourceData.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/config/TestSourceData.java @@ -10,16 +10,19 @@ public class TestSourceData { public static final TestSourceData UNKNOWN = new TestSourceData(null, null); - @Nullable private final Class testClass; + @Nullable + private final Class testClass; - @Nullable private final Method testMethod; + @Nullable + private final Method testMethod; /** * The name of the test method. May not correspond to {@code testMethod.getName()} (for instance, * in Spock the testMethod is generated at compile time and has a name that is different from the * source code method name) */ - @Nullable private final String testMethodName; + @Nullable + private final String testMethodName; public TestSourceData(@Nullable Class testClass, @Nullable Method testMethod) { this(testClass, testMethod, testMethod != null ? testMethod.getName() : null); diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java b/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java index f5bda589b3e..854a24ca180 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java @@ -23,11 +23,7 @@ public BitSet getCoveredLines() { @Override public String toString() { - return "TestReportFileEntry{" - + "sourceFileName='" - + sourceFileName - + "', lines=[" - + coveredLines - + "]}"; + return "TestReportFileEntry{" + "sourceFileName='" + sourceFileName + "', lines=[" + + coveredLines + "]}"; } } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/domain/JavaAgent.java b/internal-api/src/main/java/datadog/trace/api/civisibility/domain/JavaAgent.java index a93f44f7f1f..9cadb89a44d 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/domain/JavaAgent.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/domain/JavaAgent.java @@ -7,7 +7,8 @@ public class JavaAgent implements Serializable { private final String path; - @Nullable private final String arguments; + @Nullable + private final String arguments; public JavaAgent(String path, @Nullable String arguments) { this.path = path; diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestSuiteDescriptor.java b/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestSuiteDescriptor.java index 2d5ed960b6f..ed72f3e364b 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestSuiteDescriptor.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestSuiteDescriptor.java @@ -32,12 +32,7 @@ public int hashCode() { @Override public String toString() { - return "TestSuiteDescriptor{" - + "testSuiteName='" - + testSuiteName - + '\'' - + ", testClass=" - + testClass - + '}'; + return "TestSuiteDescriptor{" + "testSuiteName='" + testSuiteName + '\'' + ", testClass=" + + testClass + '}'; } } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java index 43d98bf6955..bbe574a1abe 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java @@ -211,9 +211,8 @@ static class IndexHolder { tagIdxMultipliers[0] = 1; } for (int i = 1; i < tags.length; i++) { - tagIdxMultipliers[i] = - tagIdxMultipliers[i - 1] - * (tagValues[i - 1].length + 1); // +1 to account for "no value" (omitted tag) + tagIdxMultipliers[i] = tagIdxMultipliers[i - 1] + * (tagValues[i - 1].length + 1); // +1 to account for "no value" (omitted tag) } IndexHolder.INDEX = getEndIndex(); @@ -228,11 +227,10 @@ public Class[] getTags() { } public int getEndIndex() { - int delta = - tagValues.length > 0 - ? (tagIdxMultipliers[tagIdxMultipliers.length - 1] - * (tagValues[tagValues.length - 1].length + 1)) - : 1; + int delta = tagValues.length > 0 + ? (tagIdxMultipliers[tagIdxMultipliers.length - 1] + * (tagValues[tagValues.length - 1].length + 1)) + : 1; return index + delta; } @@ -259,13 +257,12 @@ private int calculateIdxDelta(TagValue tagValue) { * (tagValue.ordinal() + 1); // +1 to account for "no value" (omitted tag) } } - throw new IllegalArgumentException( - "Metric " - + name() - + " cannot be tagged with " - + tag.getSimpleName() - + ", allowed tags are " - + Arrays.toString(tags)); + throw new IllegalArgumentException("Metric " + + name() + + " cannot be tagged with " + + tag.getSimpleName() + + ", allowed tags are " + + Arrays.toString(tags)); } public TagValue[] getTagValues(int index) { diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java index 35679200e40..f33569f9694 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java @@ -102,12 +102,11 @@ private void assertValid(TagValue tagValue) { return; } } - throw new IllegalArgumentException( - "Metric " - + name() - + " cannot be tagged with " - + tag.getSimpleName() - + ", allowed tags are " - + Arrays.toString(tags)); + throw new IllegalArgumentException("Metric " + + name() + + " cannot be tagged with " + + tag.getSimpleName() + + ", allowed tags are " + + Arrays.toString(tags)); } } diff --git a/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java b/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java index 3aa95465e68..ca1d7dce1bc 100644 --- a/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java +++ b/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java @@ -51,7 +51,9 @@ public class InferredProxySpan implements ImplicitContextKeyed { } private final Map headers; - @VisibleForTesting AgentSpan span; + + @VisibleForTesting + AgentSpan span; // Service-entry span registered at startSpan() time; used to guard against premature finishing // by child spans (e.g., Spring MVC handler spans) before the response status is known. private AgentSpan registeredServiceEntrySpan; @@ -238,10 +240,9 @@ public void finish(AgentSpan callerSpan) { return; } - boolean isServiceEntryOrFallback = - registeredServiceEntrySpan == null - || callerSpan == null - || callerSpan == registeredServiceEntrySpan; + boolean isServiceEntryOrFallback = registeredServiceEntrySpan == null + || callerSpan == null + || callerSpan == registeredServiceEntrySpan; if (isServiceEntryOrFallback) { // Final call: copy all tags (AppSec + HTTP status/error/useragent) and close the span diff --git a/internal-api/src/main/java/datadog/trace/api/gateway/InstrumentationGateway.java b/internal-api/src/main/java/datadog/trace/api/gateway/InstrumentationGateway.java index 0de586969a4..aef55823dd7 100644 --- a/internal-api/src/main/java/datadog/trace/api/gateway/InstrumentationGateway.java +++ b/internal-api/src/main/java/datadog/trace/api/gateway/InstrumentationGateway.java @@ -173,341 +173,315 @@ public void cancel() { public static C wrap(final EventType eventType, final C callback) { switch (eventType.getId()) { case REQUEST_STARTED_ID: - return (C) - new Supplier>() { - @Override - public Flow get() { - try { - return ((Supplier>) callback).get(); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new Supplier>() { + @Override + public Flow get() { + try { + return ((Supplier>) callback).get(); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case REQUEST_ENDED_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, IGSpanInfo agentSpan) { - try { - return ((BiFunction>) callback) - .apply(ctx, agentSpan); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, IGSpanInfo agentSpan) { + try { + return ((BiFunction>) callback) + .apply(ctx, agentSpan); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case REQUEST_HEADER_DONE_ID: case RESPONSE_HEADER_DONE_ID: - return (C) - new Function>() { - @Override - public Flow apply(RequestContext ctx) { - try { - return ((Function>) callback).apply(ctx); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new Function>() { + @Override + public Flow apply(RequestContext ctx) { + try { + return ((Function>) callback).apply(ctx); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case REQUEST_HEADER_ID: case RESPONSE_HEADER_ID: - return (C) - new TriConsumer() { - @Override - public void accept(RequestContext ctx, String key, String value) { - try { - ((TriConsumer) callback).accept(ctx, key, value); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new TriConsumer() { + @Override + public void accept(RequestContext ctx, String key, String value) { + try { + ((TriConsumer) callback).accept(ctx, key, value); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case REQUEST_METHOD_URI_RAW_ID: - return (C) - new TriFunction>() { - @Override - public Flow apply(RequestContext ctx, String method, URIDataAdapter adapter) { - try { - return ((TriFunction>) - callback) - .apply(ctx, method, adapter); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new TriFunction>() { + @Override + public Flow apply(RequestContext ctx, String method, URIDataAdapter adapter) { + try { + return ((TriFunction>) callback) + .apply(ctx, method, adapter); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case REQUEST_PATH_PARAMS_ID: - return (C) - new BiFunction, Flow>() { - @Override - public Flow apply(RequestContext ctx, Map map) { - try { - return ((BiFunction, Flow>) callback) - .apply(ctx, map); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new BiFunction, Flow>() { + @Override + public Flow apply(RequestContext ctx, Map map) { + try { + return ((BiFunction, Flow>) callback) + .apply(ctx, map); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case REQUEST_CLIENT_SOCKET_ADDRESS_ID: - return (C) - new TriFunction>() { - @Override - public Flow apply(RequestContext ctx, String ip, Integer port) { - try { - return ((TriFunction>) callback) - .apply(ctx, ip, port); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new TriFunction>() { + @Override + public Flow apply(RequestContext ctx, String ip, Integer port) { + try { + return ((TriFunction>) callback) + .apply(ctx, ip, port); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case GRPC_SERVER_METHOD_ID: case REQUEST_INFERRED_CLIENT_ADDRESS_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, String ip) { - try { - return ((BiFunction>) callback).apply(ctx, ip); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - - // Make testing easier by delegating equals - @Override - public boolean equals(Object obj) { - return callback.equals(obj); - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, String ip) { + try { + return ((BiFunction>) callback).apply(ctx, ip); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + + // Make testing easier by delegating equals + @Override + public boolean equals(Object obj) { + return callback.equals(obj); + } + }; case REQUEST_BODY_START_ID: - return (C) - new BiFunction() { - @Override - public Void apply(RequestContext ctx, StoredBodySupplier storedBodySupplier) { - try { - return ((BiFunction) callback) - .apply(ctx, storedBodySupplier); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return null; - } - } - }; + return (C) new BiFunction() { + @Override + public Void apply(RequestContext ctx, StoredBodySupplier storedBodySupplier) { + try { + return ((BiFunction) callback) + .apply(ctx, storedBodySupplier); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return null; + } + } + }; case REQUEST_BODY_DONE_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, StoredBodySupplier storedBodySupplier) { - try { - return ((BiFunction>) callback) - .apply(ctx, storedBodySupplier); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, StoredBodySupplier storedBodySupplier) { + try { + return ((BiFunction>) callback) + .apply(ctx, storedBodySupplier); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case GRPC_SERVER_REQUEST_MESSAGE_ID: case GRAPHQL_SERVER_REQUEST_MESSAGE_ID: case REQUEST_BODY_CONVERTED_ID: case RESPONSE_BODY_ID: case REQUEST_FILES_FILENAMES_ID: case REQUEST_FILES_CONTENT_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, Object obj) { - try { - return ((BiFunction>) callback) - .apply(ctx, obj); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, Object obj) { + try { + return ((BiFunction>) callback).apply(ctx, obj); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case RESPONSE_STARTED_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, Integer status) { - try { - return ((BiFunction>) callback) - .apply(ctx, status); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, Integer status) { + try { + return ((BiFunction>) callback) + .apply(ctx, status); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case DATABASE_CONNECTION_ID: case HTTP_ROUTE_ID: - return (C) - new BiConsumer() { - @Override - public void accept(RequestContext ctx, String arg) { - try { - ((BiConsumer) callback).accept(ctx, arg); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - } - } - }; + return (C) new BiConsumer() { + @Override + public void accept(RequestContext ctx, String arg) { + try { + ((BiConsumer) callback).accept(ctx, arg); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + } + } + }; case USER_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, String userId) { - try { - return ((BiFunction>) callback) - .apply(ctx, userId); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, String userId) { + try { + return ((BiFunction>) callback).apply(ctx, userId); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case LOGIN_EVENT_ID: - return (C) - new TriFunction>() { - - @Override - public Flow apply(RequestContext ctx, LoginEvent event, String user) { - try { - return ((TriFunction>) callback) - .apply(ctx, event, user); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new TriFunction>() { + + @Override + public Flow apply(RequestContext ctx, LoginEvent event, String user) { + try { + return ((TriFunction>) callback) + .apply(ctx, event, user); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case REQUEST_SESSION_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, String arg) { - try { - return ((BiFunction>) callback) - .apply(ctx, arg); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, String arg) { + try { + return ((BiFunction>) callback).apply(ctx, arg); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case DATABASE_SQL_QUERY_ID: case FILE_LOADED_ID: case FILE_WRITTEN_ID: case SHELL_CMD_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, String arg) { - try { - return ((BiFunction>) callback) - .apply(ctx, arg); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, String arg) { + try { + return ((BiFunction>) callback).apply(ctx, arg); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case HTTP_CLIENT_REQUEST_ID: case HTTP_CLIENT_RESPONSE_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, HttpClientPayload arg) { - try { - return ((BiFunction>) callback) - .apply(ctx, arg); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, HttpClientPayload arg) { + try { + return ((BiFunction>) callback) + .apply(ctx, arg); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case HTTP_CLIENT_SAMPLING_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, Long requestId) { - try { - return ((BiFunction>) callback) - .apply(ctx, requestId); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, Long requestId) { + try { + return ((BiFunction>) callback) + .apply(ctx, requestId); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; case EXEC_CMD_ID: - return (C) - new BiFunction>() { - @Override - public Flow apply(RequestContext ctx, String[] arg) { - try { - return ((BiFunction>) callback) - .apply(ctx, arg); - } catch (Throwable t) { - log.warn("Callback for {} threw.", eventType, t); - return Flow.ResultFlow.empty(); - } - } - }; + return (C) new BiFunction>() { + @Override + public Flow apply(RequestContext ctx, String[] arg) { + try { + return ((BiFunction>) callback).apply(ctx, arg); + } catch (Throwable t) { + log.warn("Callback for {} threw.", eventType, t); + return Flow.ResultFlow.empty(); + } + } + }; default: log.warn("Unwrapped callback for {}", eventType); return callback; @@ -530,36 +504,29 @@ private C universalCallback(final EventType eventType) { switch (eventType.getId()) { case REQUEST_ENDED_ID: - return (C) - (BiFunction>) - (ctx, agentSpan) -> { - Flow flowAppSec = - ((BiFunction>) callbackAppSec) - .apply(ctx, agentSpan); - Flow flowIast = - ((BiFunction>) callbackIast) - .apply(ctx, agentSpan); - return mergeFlows(flowAppSec, flowIast); - }; + return (C) (BiFunction>) (ctx, agentSpan) -> { + Flow flowAppSec = ((BiFunction>) + callbackAppSec) + .apply(ctx, agentSpan); + Flow flowIast = ((BiFunction>) callbackIast) + .apply(ctx, agentSpan); + return mergeFlows(flowAppSec, flowIast); + }; case REQUEST_HEADER_ID: - return (C) - (TriConsumer) - (requestContext, s, s2) -> { - ((TriConsumer) callbackAppSec) - .accept(requestContext, s, s2); - ((TriConsumer) callbackIast) - .accept(requestContext, s, s2); - }; + return (C) (TriConsumer) (requestContext, s, s2) -> { + ((TriConsumer) callbackAppSec) + .accept(requestContext, s, s2); + ((TriConsumer) callbackIast) + .accept(requestContext, s, s2); + }; case REQUEST_HEADER_DONE_ID: - return (C) - (Function>) - requestContext -> { - Flow flowAppSec = - ((Function>) callbackAppSec).apply(requestContext); - Flow flowIast = - ((Function>) callbackIast).apply(requestContext); - return mergeFlows(flowAppSec, flowIast); - }; + return (C) (Function>) requestContext -> { + Flow flowAppSec = + ((Function>) callbackAppSec).apply(requestContext); + Flow flowIast = + ((Function>) callbackIast).apply(requestContext); + return mergeFlows(flowAppSec, flowIast); + }; } return null; } diff --git a/internal-api/src/main/java/datadog/trace/api/git/EmbeddedGitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/EmbeddedGitInfoBuilder.java index 5b0c71ce149..4efadf37831 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/EmbeddedGitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/EmbeddedGitInfoBuilder.java @@ -19,18 +19,17 @@ public class EmbeddedGitInfoBuilder implements GitInfoBuilder { public EmbeddedGitInfoBuilder() { // Order is important here, from the most reliable sources to the least reliable ones - this( - Arrays.asList( - // Spring boot fat jars and wars should have the git.properties file in the following - // specific paths, guaranteeing that it's not coming from a dependency - "BOOT-INF/classes/datadog_git.properties", - "BOOT-INF/classes/git.properties", - "WEB-INF/classes/datadog_git.properties", - "WEB-INF/classes/git.properties", - // If we can't find the files above, probably because we're not in a spring context, we - // can look at the root of the classpath. Since it could be tainted by dependencies, - // we're looking for a specific datadog_git.properties file. - "datadog_git.properties")); + this(Arrays.asList( + // Spring boot fat jars and wars should have the git.properties file in the following + // specific paths, guaranteeing that it's not coming from a dependency + "BOOT-INF/classes/datadog_git.properties", + "BOOT-INF/classes/git.properties", + "WEB-INF/classes/datadog_git.properties", + "WEB-INF/classes/git.properties", + // If we can't find the files above, probably because we're not in a spring context, we + // can look at the root of the classpath. Since it could be tainted by dependencies, + // we're looking for a specific datadog_git.properties file. + "datadog_git.properties")); } EmbeddedGitInfoBuilder(List resourceNames) { diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitInfo.java b/internal-api/src/main/java/datadog/trace/api/git/GitInfo.java index 32929b2b3c8..20ef4157224 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitInfo.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitInfo.java @@ -25,10 +25,9 @@ public GitInfo(String repositoryURL, String branch, String tag, CommitInfo commi // GitInfo is reused across many traces, so create entries once and reuse them (see addTags) // null & empty values result in null entries which nop when added to a span this.repositoryEntry = TagMap.Entry.create(DDTags.INTERNAL_GIT_REPOSITORY_URL, repositoryURL); - this.commitEntry = - commit == null - ? null - : TagMap.Entry.create(DDTags.INTERNAL_GIT_COMMIT_SHA, commit.getSha()); + this.commitEntry = commit == null + ? null + : TagMap.Entry.create(DDTags.INTERNAL_GIT_COMMIT_SHA, commit.getSha()); } public String getRepositoryURL() { diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitInfoProvider.java b/internal-api/src/main/java/datadog/trace/api/git/GitInfoProvider.java index 5dc94e713bc..661aec26c5e 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitInfoProvider.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitInfoProvider.java @@ -65,31 +65,30 @@ public GitInfo getGitInfo(@Nullable String repositoryPath) { private GitInfo buildGitInfo(String repositoryPath) { Evaluator evaluator = new Evaluator(repositoryPath, builders); - GitInfo gitInfo = - new GitInfo( - evaluator.get( - gi -> GitUtils.filterSensitiveInfo(gi.getRepositoryURL()), - GitInfoProvider::validateGitRemoteUrl), - evaluator.get(GitInfo::getBranch, Strings::isNotBlank), - evaluator.get(GitInfo::getTag, Strings::isNotBlank), - new CommitInfo( - evaluator.get(gi1 -> gi1.getCommit().getSha(), Strings::isNotBlank), - new PersonInfo( - evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getAuthor().getName(), Strings::isNotBlank), - evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getAuthor().getEmail(), Strings::isNotBlank), - evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getAuthor().getIso8601Date(), Strings::isNotBlank)), - new PersonInfo( - evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getCommitter().getName(), Strings::isNotBlank), - evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getCommitter().getEmail(), Strings::isNotBlank), - evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getCommitter().getIso8601Date(), Strings::isNotBlank)), + GitInfo gitInfo = new GitInfo( + evaluator.get( + gi -> GitUtils.filterSensitiveInfo(gi.getRepositoryURL()), + GitInfoProvider::validateGitRemoteUrl), + evaluator.get(GitInfo::getBranch, Strings::isNotBlank), + evaluator.get(GitInfo::getTag, Strings::isNotBlank), + new CommitInfo( + evaluator.get(gi1 -> gi1.getCommit().getSha(), Strings::isNotBlank), + new PersonInfo( evaluator.getIfCommitShaMatches( - gi -> gi.getCommit().getFullMessage(), Strings::isNotBlank))); + gi -> gi.getCommit().getAuthor().getName(), Strings::isNotBlank), + evaluator.getIfCommitShaMatches( + gi -> gi.getCommit().getAuthor().getEmail(), Strings::isNotBlank), + evaluator.getIfCommitShaMatches( + gi -> gi.getCommit().getAuthor().getIso8601Date(), Strings::isNotBlank)), + new PersonInfo( + evaluator.getIfCommitShaMatches( + gi -> gi.getCommit().getCommitter().getName(), Strings::isNotBlank), + evaluator.getIfCommitShaMatches( + gi -> gi.getCommit().getCommitter().getEmail(), Strings::isNotBlank), + evaluator.getIfCommitShaMatches( + gi -> gi.getCommit().getCommitter().getIso8601Date(), Strings::isNotBlank)), + evaluator.getIfCommitShaMatches( + gi -> gi.getCommit().getFullMessage(), Strings::isNotBlank))); InstrumentationBridge.getMetricCollector() .add( @@ -218,9 +217,8 @@ private String get( discrepancyType = GitShaDiscrepancyType.REPOSITORY_DISCREPANCY; } - shaDiscrepancies.add( - new ShaDiscrepancy( - expectedGitProvider, e.getKey().providerAsDiscrepant(), discrepancyType)); + shaDiscrepancies.add(new ShaDiscrepancy( + expectedGitProvider, e.getKey().providerAsDiscrepant(), discrepancyType)); continue; } } diff --git a/internal-api/src/main/java/datadog/trace/api/git/GitUtils.java b/internal-api/src/main/java/datadog/trace/api/git/GitUtils.java index 892d4986bde..e233eb3bada 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/GitUtils.java +++ b/internal-api/src/main/java/datadog/trace/api/git/GitUtils.java @@ -23,20 +23,19 @@ public class GitUtils { private static final Pattern REFS_TAGS_PATTERN = Pattern.compile("refs/tags/", Pattern.LITERAL); private static final Pattern TAGS_PATTERN = Pattern.compile("tags/", Pattern.LITERAL); // Based on https://git-scm.com/docs/git-check-ref-format - private static final Pattern INVALID_REF_PATTERN = - Pattern.compile( - "^/" // starts with / - + "|//" // contains // - + "|\\.\\." // contains .. - + "|@\\{" // contains @{ - + "|\\.$" // ends with a dot - + "|\\.lock(/|$)" // ends with .lock in any path component - + "|(?:^|/)\\." // any component starts with a dot - + "|\\s" // contains space - + "|[~^:?*\\[\\\\]" // contains ~ ^ : ? * [ \ - + "|^@$" // is only @ - + "|/$" // ends with slash - ); + private static final Pattern INVALID_REF_PATTERN = Pattern.compile( + "^/" // starts with / + + "|//" // contains // + + "|\\.\\." // contains .. + + "|@\\{" // contains @{ + + "|\\.$" // ends with a dot + + "|\\.lock(/|$)" // ends with .lock in any path component + + "|(?:^|/)\\." // any component starts with a dot + + "|\\s" // contains space + + "|[~^:?*\\[\\\\]" // contains ~ ^ : ? * [ \ + + "|^@$" // is only @ + + "|/$" // ends with slash + ); private static final Pattern PATH_PATTERN = Pattern.compile("^[a-zA-Z0-9_./-]+$"); private static final Pattern SHELL_METACHAR_PATTERN = Pattern.compile(".*[`$&|;<>\n\r#].*"); diff --git a/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java index 96f1b7f9d63..1aab927c0e5 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java @@ -63,17 +63,15 @@ public GitInfo build(@Nullable String repositoryPath) { final String gitCommitCommitterEmail = configProvider.getString(DD_GIT_COMMIT_COMMITTER_EMAIL); final String gitCommitCommitterDate = configProvider.getString(DD_GIT_COMMIT_COMMITTER_DATE); - GitInfo gitInfo = - new GitInfo( - gitRepositoryUrl, - gitBranch, - gitTag, - new CommitInfo( - gitCommitSha, - new PersonInfo(gitCommitAuthorName, gitCommitAuthorEmail, gitCommitAuthorDate), - new PersonInfo( - gitCommitCommitterName, gitCommitCommitterEmail, gitCommitCommitterDate), - gitCommitMessage)); + GitInfo gitInfo = new GitInfo( + gitRepositoryUrl, + gitBranch, + gitTag, + new CommitInfo( + gitCommitSha, + new PersonInfo(gitCommitAuthorName, gitCommitAuthorEmail, gitCommitAuthorDate), + new PersonInfo(gitCommitCommitterName, gitCommitCommitterEmail, gitCommitCommitterDate), + gitCommitMessage)); if (!gitInfo.isEmpty()) { // if there is any git metadata supplied by the user, we want to check that repo URL and diff --git a/internal-api/src/main/java/datadog/trace/api/http/StoredByteBody.java b/internal-api/src/main/java/datadog/trace/api/http/StoredByteBody.java index a2c44906855..5c572ff5161 100644 --- a/internal-api/src/main/java/datadog/trace/api/http/StoredByteBody.java +++ b/internal-api/src/main/java/datadog/trace/api/http/StoredByteBody.java @@ -272,16 +272,15 @@ Object forName(Object name) { } } - private static final Cache DECODER_CACHE = - new Cache(CACHE_SIZE) { - boolean hasName(Object ob, Object name) { - return ((CharsetDecoder) ob).charset().equals(name); - } + private static final Cache DECODER_CACHE = new Cache(CACHE_SIZE) { + boolean hasName(Object ob, Object name) { + return ((CharsetDecoder) ob).charset().equals(name); + } - Object create(Object charset) { - return ((Charset) charset).newDecoder().onUnmappableCharacter(CodingErrorAction.REPLACE); - } - }; + Object create(Object charset) { + return ((Charset) charset).newDecoder().onUnmappableCharacter(CodingErrorAction.REPLACE); + } + }; public static CharsetDecoder decoderFor(Charset charset) { CharsetDecoder cd = (CharsetDecoder) DECODER_CACHE.forName(charset); diff --git a/internal-api/src/main/java/datadog/trace/api/http/StoredCharBody.java b/internal-api/src/main/java/datadog/trace/api/http/StoredCharBody.java index aee387eb5ac..1fe12c72301 100644 --- a/internal-api/src/main/java/datadog/trace/api/http/StoredCharBody.java +++ b/internal-api/src/main/java/datadog/trace/api/http/StoredCharBody.java @@ -103,10 +103,9 @@ private boolean maybeExtendStorage(int newDataLen) { } else if (this.storedBodyLen == MAX_BUFFER_SIZE) { return false; } else if (capacityLeft() < newDataLen) { - int newSize = - Math.min( - Math.max(this.storedBodyLen + newDataLen, this.storedBodyLen * GROW_FACTOR), - MAX_BUFFER_SIZE); + int newSize = Math.min( + Math.max(this.storedBodyLen + newDataLen, this.storedBodyLen * GROW_FACTOR), + MAX_BUFFER_SIZE); this.storedBody = Arrays.copyOf(this.storedBody, newSize); } return true; diff --git a/internal-api/src/main/java/datadog/trace/api/iast/secrets/HardcodedSecretMatcher.java b/internal-api/src/main/java/datadog/trace/api/iast/secrets/HardcodedSecretMatcher.java index f90ffde5834..9aec80d200d 100644 --- a/internal-api/src/main/java/datadog/trace/api/iast/secrets/HardcodedSecretMatcher.java +++ b/internal-api/src/main/java/datadog/trace/api/iast/secrets/HardcodedSecretMatcher.java @@ -6,73 +6,57 @@ public class HardcodedSecretMatcher { public static final int MIN_SECRET_LENGTH = 10; - public static final HardcodedSecretMatcher ADOBE_CLIENT_SECRET = - new HardcodedSecretMatcher( - "adobe-client-secret", - Pattern.compile("(?i)\\b((p8e-)(?i)[a-z0-9]{32})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher AGE_SECRET_KEY = - new HardcodedSecretMatcher( - "age-secret-key", - Pattern.compile("AGE-SECRET-KEY-1[QPZRY9X8GF2TVDW0S3JN54KHCE6MUA7L]{58}")); - public static final HardcodedSecretMatcher ALIBABA_ACCESS_KEY_ID = - new HardcodedSecretMatcher( - "alibaba-access-key-id", - Pattern.compile("(?i)\\b((LTAI)(?i)[a-z0-9]{20})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher ADOBE_CLIENT_SECRET = new HardcodedSecretMatcher( + "adobe-client-secret", + Pattern.compile("(?i)\\b((p8e-)(?i)[a-z0-9]{32})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher AGE_SECRET_KEY = new HardcodedSecretMatcher( + "age-secret-key", Pattern.compile("AGE-SECRET-KEY-1[QPZRY9X8GF2TVDW0S3JN54KHCE6MUA7L]{58}")); + public static final HardcodedSecretMatcher ALIBABA_ACCESS_KEY_ID = new HardcodedSecretMatcher( + "alibaba-access-key-id", + Pattern.compile("(?i)\\b((LTAI)(?i)[a-z0-9]{20})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher AUTHRESS_SERVICE_CLIENT_ACCESS_KEY = new HardcodedSecretMatcher( "authress-service-client-access-key", Pattern.compile( "(?i)\\b((?:sc|ext|scauth|authress)_[a-z0-9]{5,30}\\.[a-z0-9]{4,6}\\.acc[_-][a-z0-9-]{10,32}\\.[a-z0-9+/_=-]{30,120})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher AWS_ACCESS_TOKEN = - new HardcodedSecretMatcher( - "aws-access-token", - Pattern.compile( - "\\b((A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher CLOJARS_API_TOKEN = - new HardcodedSecretMatcher( - "clojars-api-token", Pattern.compile("(?i)(CLOJARS_)[a-z0-9]{60}")); - public static final HardcodedSecretMatcher DATABRICKS_API_TOKEN = - new HardcodedSecretMatcher( - "databricks-api-token", - Pattern.compile("(?i)\\b(dapi[a-h0-9]{32})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher DIGITALOCEAN_ACCESS_TOKEN = - new HardcodedSecretMatcher( - "digitalocean-access-token", - Pattern.compile("(?i)\\b(doo_v1_[a-f0-9]{64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher DIGITALOCEAN_PAT = - new HardcodedSecretMatcher( - "digitalocean-pat", - Pattern.compile("(?i)\\b(dop_v1_[a-f0-9]{64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher AWS_ACCESS_TOKEN = new HardcodedSecretMatcher( + "aws-access-token", + Pattern.compile( + "\\b((A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher CLOJARS_API_TOKEN = new HardcodedSecretMatcher( + "clojars-api-token", Pattern.compile("(?i)(CLOJARS_)[a-z0-9]{60}")); + public static final HardcodedSecretMatcher DATABRICKS_API_TOKEN = new HardcodedSecretMatcher( + "databricks-api-token", + Pattern.compile("(?i)\\b(dapi[a-h0-9]{32})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher DIGITALOCEAN_ACCESS_TOKEN = new HardcodedSecretMatcher( + "digitalocean-access-token", + Pattern.compile("(?i)\\b(doo_v1_[a-f0-9]{64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher DIGITALOCEAN_PAT = new HardcodedSecretMatcher( + "digitalocean-pat", + Pattern.compile("(?i)\\b(dop_v1_[a-f0-9]{64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher DIGITALOCEAN_REFRESH_TOKEN = new HardcodedSecretMatcher( "digitalocean-refresh-token", Pattern.compile("(?i)\\b(dor_v1_[a-f0-9]{64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher DOPPLER_API_TOKEN = - new HardcodedSecretMatcher( - "doppler-api-token", Pattern.compile("(dp\\.pt\\.)(?i)[a-z0-9]{43}")); - public static final HardcodedSecretMatcher DUFFEL_API_TOKEN = - new HardcodedSecretMatcher( - "duffel-api-token", Pattern.compile("duffel_(test|live)_(?i)[a-z0-9_\\-=]{43}")); - public static final HardcodedSecretMatcher DYNATRACE_API_TOKEN = - new HardcodedSecretMatcher( - "dynatrace-api-token", Pattern.compile("dt0c01\\.(?i)[a-z0-9]{24}\\.[a-z0-9]{64}")); + public static final HardcodedSecretMatcher DOPPLER_API_TOKEN = new HardcodedSecretMatcher( + "doppler-api-token", Pattern.compile("(dp\\.pt\\.)(?i)[a-z0-9]{43}")); + public static final HardcodedSecretMatcher DUFFEL_API_TOKEN = new HardcodedSecretMatcher( + "duffel-api-token", Pattern.compile("duffel_(test|live)_(?i)[a-z0-9_\\-=]{43}")); + public static final HardcodedSecretMatcher DYNATRACE_API_TOKEN = new HardcodedSecretMatcher( + "dynatrace-api-token", Pattern.compile("dt0c01\\.(?i)[a-z0-9]{24}\\.[a-z0-9]{64}")); public static final HardcodedSecretMatcher EASYPOST_API_TOKEN = new HardcodedSecretMatcher("easypost-api-token", Pattern.compile("\\bEZAK(?i)[a-z0-9]{54}")); - public static final HardcodedSecretMatcher FLUTTERWAVE_PUBLIC_KEY = - new HardcodedSecretMatcher( - "flutterwave-public-key", Pattern.compile("FLWPUBK_TEST-(?i)[a-h0-9]{32}-X")); - public static final HardcodedSecretMatcher FRAMEIO_API_TOKEN = - new HardcodedSecretMatcher( - "frameio-api-token", Pattern.compile("fio-u-(?i)[a-z0-9\\-_=]{64}")); - public static final HardcodedSecretMatcher GCP_API_KEY = - new HardcodedSecretMatcher( - "gcp-api-key", - Pattern.compile("(?i)\\b(AIza[0-9A-Za-z\\-_]{35})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher FLUTTERWAVE_PUBLIC_KEY = new HardcodedSecretMatcher( + "flutterwave-public-key", Pattern.compile("FLWPUBK_TEST-(?i)[a-h0-9]{32}-X")); + public static final HardcodedSecretMatcher FRAMEIO_API_TOKEN = new HardcodedSecretMatcher( + "frameio-api-token", Pattern.compile("fio-u-(?i)[a-z0-9\\-_=]{64}")); + public static final HardcodedSecretMatcher GCP_API_KEY = new HardcodedSecretMatcher( + "gcp-api-key", + Pattern.compile("(?i)\\b(AIza[0-9A-Za-z\\-_]{35})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher GITHUB_APP_TOKEN = new HardcodedSecretMatcher("github-app-token", Pattern.compile("(ghu|ghs)_[0-9a-zA-Z]{36}")); - public static final HardcodedSecretMatcher GITHUB_FINE_GRAINED_PAT = - new HardcodedSecretMatcher( - "github-fine-grained-pat", Pattern.compile("github_pat_[0-9a-zA-Z_]{82}")); + public static final HardcodedSecretMatcher GITHUB_FINE_GRAINED_PAT = new HardcodedSecretMatcher( + "github-fine-grained-pat", Pattern.compile("github_pat_[0-9a-zA-Z_]{82}")); public static final HardcodedSecretMatcher GITHUB_OAUTH = new HardcodedSecretMatcher("github-oauth", Pattern.compile("gho_[0-9a-zA-Z]{36}")); public static final HardcodedSecretMatcher GITHUB_PAT = @@ -83,102 +67,82 @@ public class HardcodedSecretMatcher { new HardcodedSecretMatcher("gitlab-ptt", Pattern.compile("glptt-[0-9a-f]{40}")); public static final HardcodedSecretMatcher GITLAB_RRT = new HardcodedSecretMatcher("gitlab-rrt", Pattern.compile("GR1348941[0-9a-zA-Z\\-_]{20}")); - public static final HardcodedSecretMatcher GRAFANA_API_KEY = - new HardcodedSecretMatcher( - "grafana-api-key", - Pattern.compile( - "(?i)\\b(eyJrIjoi[A-Za-z0-9]{70,400}={0,2})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher GRAFANA_CLOUD_API_TOKEN = - new HardcodedSecretMatcher( - "grafana-cloud-api-token", - Pattern.compile( - "(?i)\\b(glc_[A-Za-z0-9+/]{32,400}={0,2})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher GRAFANA_API_KEY = new HardcodedSecretMatcher( + "grafana-api-key", + Pattern.compile( + "(?i)\\b(eyJrIjoi[A-Za-z0-9]{70,400}={0,2})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher GRAFANA_CLOUD_API_TOKEN = new HardcodedSecretMatcher( + "grafana-cloud-api-token", + Pattern.compile( + "(?i)\\b(glc_[A-Za-z0-9+/]{32,400}={0,2})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher GRAFANA_SERVICE_ACCOUNT_TOKEN = new HardcodedSecretMatcher( "grafana-service-account-token", Pattern.compile( "(?i)\\b(glsa_[A-Za-z0-9]{32}_[A-Fa-f0-9]{8})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher HASHICORP_TF_API_TOKEN = - new HardcodedSecretMatcher( - "hashicorp-tf-api-token", - Pattern.compile("(?i)[a-z0-9]{14}\\.atlasv1\\.[a-z0-9\\-_=]{60,70}")); - public static final HardcodedSecretMatcher JWT = - new HardcodedSecretMatcher( - "jwt", - Pattern.compile( - "\\b(ey[a-zA-Z0-9]{17,}\\.ey[a-zA-Z0-9\\/_-]{17,}\\.(?:[a-zA-Z0-9\\/_-]{10,}={0,2})?)(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher HASHICORP_TF_API_TOKEN = new HardcodedSecretMatcher( + "hashicorp-tf-api-token", + Pattern.compile("(?i)[a-z0-9]{14}\\.atlasv1\\.[a-z0-9\\-_=]{60,70}")); + public static final HardcodedSecretMatcher JWT = new HardcodedSecretMatcher( + "jwt", + Pattern.compile( + "\\b(ey[a-zA-Z0-9]{17,}\\.ey[a-zA-Z0-9\\/_-]{17,}\\.(?:[a-zA-Z0-9\\/_-]{10,}={0,2})?)(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher LINEAR_API_KEY = new HardcodedSecretMatcher("linear-api-key", Pattern.compile("lin_api_(?i)[a-z0-9]{40}")); - public static final HardcodedSecretMatcher NPM_ACCESS_TOKEN = - new HardcodedSecretMatcher( - "npm-access-token", - Pattern.compile("(?i)\\b(npm_[a-z0-9]{36})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher OPENAI_API_KEY = - new HardcodedSecretMatcher( - "openai-api-key", - Pattern.compile( - "(?i)\\b(sk-[a-zA-Z0-9]{20}T3BlbkFJ[a-zA-Z0-9]{20})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher PLANETSCALE_API_TOKEN = - new HardcodedSecretMatcher( - "planetscale-api-token", - Pattern.compile( - "(?i)\\b(pscale_tkn_(?i)[a-z0-9=\\-_\\.]{32,64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher PLANETSCALE_OAUTH_TOKEN = - new HardcodedSecretMatcher( - "planetscale-oauth-token", - Pattern.compile( - "(?i)\\b(pscale_oauth_(?i)[a-z0-9=\\-_\\.]{32,64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher PLANETSCALE_PASSWORD = - new HardcodedSecretMatcher( - "planetscale-password", - Pattern.compile( - "(?i)\\b(pscale_pw_(?i)[a-z0-9=\\-_\\.]{32,64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher POSTMAN_API_TOKEN = - new HardcodedSecretMatcher( - "postman-api-token", - Pattern.compile( - "(?i)\\b(PMAK-(?i)[a-f0-9]{24}\\-[a-f0-9]{34})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher PREFECT_API_TOKEN = - new HardcodedSecretMatcher( - "prefect-api-token", - Pattern.compile("(?i)\\b(pnu_[a-z0-9]{36})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher PRIVATE_KEY = - new HardcodedSecretMatcher( - "private-key", - Pattern.compile( - "(?i)-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY( BLOCK)?-----[\\s\\S-]*KEY( BLOCK)?----")); - public static final HardcodedSecretMatcher PULUMI_API_TOKEN = - new HardcodedSecretMatcher( - "pulumi-api-token", - Pattern.compile("(?i)\\b(pul-[a-f0-9]{40})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher PYPI_UPLOAD_TOKEN = - new HardcodedSecretMatcher( - "pypi-upload-token", Pattern.compile("pypi-AgEIcHlwaS5vcmc[A-Za-z0-9\\-_]{50,1000}")); - public static final HardcodedSecretMatcher README_API_TOKEN = - new HardcodedSecretMatcher( - "readme-api-token", - Pattern.compile("(?i)\\b(rdme_[a-z0-9]{70})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher RUBYGEMS_API_TOKEN = - new HardcodedSecretMatcher( - "rubygems-api-token", - Pattern.compile("(?i)\\b(rubygems_[a-f0-9]{48})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher NPM_ACCESS_TOKEN = new HardcodedSecretMatcher( + "npm-access-token", + Pattern.compile("(?i)\\b(npm_[a-z0-9]{36})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher OPENAI_API_KEY = new HardcodedSecretMatcher( + "openai-api-key", + Pattern.compile( + "(?i)\\b(sk-[a-zA-Z0-9]{20}T3BlbkFJ[a-zA-Z0-9]{20})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher PLANETSCALE_API_TOKEN = new HardcodedSecretMatcher( + "planetscale-api-token", + Pattern.compile( + "(?i)\\b(pscale_tkn_(?i)[a-z0-9=\\-_\\.]{32,64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher PLANETSCALE_OAUTH_TOKEN = new HardcodedSecretMatcher( + "planetscale-oauth-token", + Pattern.compile( + "(?i)\\b(pscale_oauth_(?i)[a-z0-9=\\-_\\.]{32,64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher PLANETSCALE_PASSWORD = new HardcodedSecretMatcher( + "planetscale-password", + Pattern.compile( + "(?i)\\b(pscale_pw_(?i)[a-z0-9=\\-_\\.]{32,64})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher POSTMAN_API_TOKEN = new HardcodedSecretMatcher( + "postman-api-token", + Pattern.compile( + "(?i)\\b(PMAK-(?i)[a-f0-9]{24}\\-[a-f0-9]{34})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher PREFECT_API_TOKEN = new HardcodedSecretMatcher( + "prefect-api-token", + Pattern.compile("(?i)\\b(pnu_[a-z0-9]{36})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher PRIVATE_KEY = new HardcodedSecretMatcher( + "private-key", + Pattern.compile( + "(?i)-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY( BLOCK)?-----[\\s\\S-]*KEY( BLOCK)?----")); + public static final HardcodedSecretMatcher PULUMI_API_TOKEN = new HardcodedSecretMatcher( + "pulumi-api-token", + Pattern.compile("(?i)\\b(pul-[a-f0-9]{40})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher PYPI_UPLOAD_TOKEN = new HardcodedSecretMatcher( + "pypi-upload-token", Pattern.compile("pypi-AgEIcHlwaS5vcmc[A-Za-z0-9\\-_]{50,1000}")); + public static final HardcodedSecretMatcher README_API_TOKEN = new HardcodedSecretMatcher( + "readme-api-token", + Pattern.compile("(?i)\\b(rdme_[a-z0-9]{70})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher RUBYGEMS_API_TOKEN = new HardcodedSecretMatcher( + "rubygems-api-token", + Pattern.compile("(?i)\\b(rubygems_[a-f0-9]{48})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher SCALINGO_API_TOKEN = new HardcodedSecretMatcher("scalingo-api-token", Pattern.compile("tk-us-[a-zA-Z0-9-_]{48}")); - public static final HardcodedSecretMatcher SENDGRID_API_TOKEN = - new HardcodedSecretMatcher( - "sendgrid-api-token", - Pattern.compile( - "(?i)\\b(SG\\.(?i)[a-z0-9=_\\-\\.]{66})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher SENDINBLUE_API_TOKEN = - new HardcodedSecretMatcher( - "sendinblue-api-token", - Pattern.compile( - "(?i)\\b(xkeysib-[a-f0-9]{64}\\-(?i)[a-z0-9]{16})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher SHIPPO_API_TOKEN = - new HardcodedSecretMatcher( - "shippo-api-token", - Pattern.compile( - "(?i)\\b(shippo_(live|test)_[a-f0-9]{40})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher SENDGRID_API_TOKEN = new HardcodedSecretMatcher( + "sendgrid-api-token", + Pattern.compile("(?i)\\b(SG\\.(?i)[a-z0-9=_\\-\\.]{66})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher SENDINBLUE_API_TOKEN = new HardcodedSecretMatcher( + "sendinblue-api-token", + Pattern.compile( + "(?i)\\b(xkeysib-[a-f0-9]{64}\\-(?i)[a-z0-9]{16})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher SHIPPO_API_TOKEN = new HardcodedSecretMatcher( + "shippo-api-token", + Pattern.compile( + "(?i)\\b(shippo_(live|test)_[a-f0-9]{40})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher SHOPIFY_ACCESS_TOKEN = new HardcodedSecretMatcher("shopify-access-token", Pattern.compile("shpat_[a-fA-F0-9]{32}")); public static final HardcodedSecretMatcher SHOPIFY_CUSTOM_ACCESS_TOKEN = @@ -189,56 +153,44 @@ public class HardcodedSecretMatcher { "shopify-private-app-access-token", Pattern.compile("shppa_[a-fA-F0-9]{32}")); public static final HardcodedSecretMatcher SHOPIFY_SHARED_SECRET = new HardcodedSecretMatcher("shopify-shared-secret", Pattern.compile("shpss_[a-fA-F0-9]{32}")); - public static final HardcodedSecretMatcher SLACK_APP_TOKEN = - new HardcodedSecretMatcher( - "slack-app-token", Pattern.compile("(?i)(xapp-\\d-[A-Z0-9]+-\\d+-[a-z0-9]+)")); - public static final HardcodedSecretMatcher SLACK_BOT_TOKEN = - new HardcodedSecretMatcher( - "slack-bot-token", Pattern.compile("(xoxb-[0-9]{10,13}\\-[0-9]{10,13}[a-zA-Z0-9-]*)")); - public static final HardcodedSecretMatcher SLACK_CONFIG_ACCESS_TOKEN = - new HardcodedSecretMatcher( - "slack-config-access-token", Pattern.compile("(?i)(xoxe.xox[bp]-\\d-[A-Z0-9]{163,166})")); + public static final HardcodedSecretMatcher SLACK_APP_TOKEN = new HardcodedSecretMatcher( + "slack-app-token", Pattern.compile("(?i)(xapp-\\d-[A-Z0-9]+-\\d+-[a-z0-9]+)")); + public static final HardcodedSecretMatcher SLACK_BOT_TOKEN = new HardcodedSecretMatcher( + "slack-bot-token", Pattern.compile("(xoxb-[0-9]{10,13}\\-[0-9]{10,13}[a-zA-Z0-9-]*)")); + public static final HardcodedSecretMatcher SLACK_CONFIG_ACCESS_TOKEN = new HardcodedSecretMatcher( + "slack-config-access-token", Pattern.compile("(?i)(xoxe.xox[bp]-\\d-[A-Z0-9]{163,166})")); public static final HardcodedSecretMatcher SLACK_CONFIG_REFRESH_TOKEN = new HardcodedSecretMatcher( "slack-config-refresh-token", Pattern.compile("(?i)(xoxe-\\d-[A-Z0-9]{146})")); - public static final HardcodedSecretMatcher SLACK_LEGACY_BOT_TOKEN = - new HardcodedSecretMatcher( - "slack-legacy-bot-token", Pattern.compile("(xoxb-[0-9]{8,14}\\-[a-zA-Z0-9]{18,26})")); - public static final HardcodedSecretMatcher SLACK_LEGACY_TOKEN = - new HardcodedSecretMatcher( - "slack-legacy-token", Pattern.compile("(xox[os]-\\d+-\\d+-\\d+-[a-fA-F\\d]+)")); + public static final HardcodedSecretMatcher SLACK_LEGACY_BOT_TOKEN = new HardcodedSecretMatcher( + "slack-legacy-bot-token", Pattern.compile("(xoxb-[0-9]{8,14}\\-[a-zA-Z0-9]{18,26})")); + public static final HardcodedSecretMatcher SLACK_LEGACY_TOKEN = new HardcodedSecretMatcher( + "slack-legacy-token", Pattern.compile("(xox[os]-\\d+-\\d+-\\d+-[a-fA-F\\d]+)")); public static final HardcodedSecretMatcher SLACK_LEGACY_WORKSPACE_TOKEN = new HardcodedSecretMatcher( "slack-legacy-workspace-token", Pattern.compile("(xox[ar]-(?:\\d-)?[0-9a-zA-Z]{8,48})")); - public static final HardcodedSecretMatcher SLACK_USER_TOKEN = - new HardcodedSecretMatcher( - "slack-user-token", Pattern.compile("(xox[pe](?:-[0-9]{10,13}){3}-[a-zA-Z0-9-]{28,34})")); - public static final HardcodedSecretMatcher SLACK_WEBHOOK_URL = - new HardcodedSecretMatcher( - "slack-webhook-url", - Pattern.compile( - "(https?:\\/\\/)?hooks.slack.com\\/(services|workflows)\\/[A-Za-z0-9+\\/]{43,46}")); - public static final HardcodedSecretMatcher SQUARE_ACCESS_TOKEN = - new HardcodedSecretMatcher( - "square-access-token", - Pattern.compile("(?i)\\b(sq0atp-[0-9A-Za-z\\-_]{22})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher SQUARE_SECRET = - new HardcodedSecretMatcher( - "square-secret", - Pattern.compile("(?i)\\b(sq0csp-[0-9A-Za-z\\-_]{43})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher STRIPE_ACCESS_TOKEN = - new HardcodedSecretMatcher( - "stripe-access-token", Pattern.compile("(?i)(sk|pk)_(test|live)_[0-9a-z]{10,32}")); + public static final HardcodedSecretMatcher SLACK_USER_TOKEN = new HardcodedSecretMatcher( + "slack-user-token", Pattern.compile("(xox[pe](?:-[0-9]{10,13}){3}-[a-zA-Z0-9-]{28,34})")); + public static final HardcodedSecretMatcher SLACK_WEBHOOK_URL = new HardcodedSecretMatcher( + "slack-webhook-url", + Pattern.compile( + "(https?:\\/\\/)?hooks.slack.com\\/(services|workflows)\\/[A-Za-z0-9+\\/]{43,46}")); + public static final HardcodedSecretMatcher SQUARE_ACCESS_TOKEN = new HardcodedSecretMatcher( + "square-access-token", + Pattern.compile("(?i)\\b(sq0atp-[0-9A-Za-z\\-_]{22})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher SQUARE_SECRET = new HardcodedSecretMatcher( + "square-secret", + Pattern.compile("(?i)\\b(sq0csp-[0-9A-Za-z\\-_]{43})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher STRIPE_ACCESS_TOKEN = new HardcodedSecretMatcher( + "stripe-access-token", Pattern.compile("(?i)(sk|pk)_(test|live)_[0-9a-z]{10,32}")); public static final HardcodedSecretMatcher TWILIO_API_KEY = new HardcodedSecretMatcher("twilio-api-key", Pattern.compile("SK[0-9a-fA-F]{32}")); - public static final HardcodedSecretMatcher VAULT_BATCH_TOKEN = - new HardcodedSecretMatcher( - "vault-batch-token", - Pattern.compile("(?i)\\b(hvb\\.[a-z0-9_-]{138,212})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); - public static final HardcodedSecretMatcher VAULT_SERVICE_TOKEN = - new HardcodedSecretMatcher( - "vault-service-token", - Pattern.compile("(?i)\\b(hvs\\.[a-z0-9_-]{90,100})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher VAULT_BATCH_TOKEN = new HardcodedSecretMatcher( + "vault-batch-token", + Pattern.compile("(?i)\\b(hvb\\.[a-z0-9_-]{138,212})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); + public static final HardcodedSecretMatcher VAULT_SERVICE_TOKEN = new HardcodedSecretMatcher( + "vault-service-token", + Pattern.compile("(?i)\\b(hvs\\.[a-z0-9_-]{90,100})(?:['|\"\"|\\n|\\r|\\s|\\x60|;]|$)")); public static final HardcodedSecretMatcher[] HARDCODED_SECRET_MATCHERS = { ADOBE_CLIENT_SECRET, diff --git a/internal-api/src/main/java/datadog/trace/api/iast/securitycontrol/SecurityControl.java b/internal-api/src/main/java/datadog/trace/api/iast/securitycontrol/SecurityControl.java index 5126d323811..d8d8a8b5013 100644 --- a/internal-api/src/main/java/datadog/trace/api/iast/securitycontrol/SecurityControl.java +++ b/internal-api/src/main/java/datadog/trace/api/iast/securitycontrol/SecurityControl.java @@ -7,17 +7,22 @@ public class SecurityControl { - @Nonnull private SecurityControlType type; + @Nonnull + private SecurityControlType type; private int marks; - @Nonnull private String className; + @Nonnull + private String className; - @Nonnull private String method; + @Nonnull + private String method; - @Nullable private List parameterTypes; + @Nullable + private List parameterTypes; - @Nullable private BitSet parametersToMark; + @Nullable + private BitSet parametersToMark; public SecurityControl( @Nonnull SecurityControlType type, diff --git a/internal-api/src/main/java/datadog/trace/api/iast/telemetry/IastMetric.java b/internal-api/src/main/java/datadog/trace/api/iast/telemetry/IastMetric.java index 736ed126146..f63a1120f35 100644 --- a/internal-api/src/main/java/datadog/trace/api/iast/telemetry/IastMetric.java +++ b/internal-api/src/main/java/datadog/trace/api/iast/telemetry/IastMetric.java @@ -152,15 +152,14 @@ public byte[] unwrap(byte tagValue) { } }; - public static final Tag SOURCE_TYPE = - new Tag("source_type", SourceTypes.STRINGS) { + public static final Tag SOURCE_TYPE = new Tag("source_type", SourceTypes.STRINGS) { - @Nullable - @Override - public byte[] unwrap(byte tagValue) { - return SourceTypes.unwrap(tagValue); - } - }; + @Nullable + @Override + public byte[] unwrap(byte tagValue) { + return SourceTypes.unwrap(tagValue); + } + }; protected final String name; diff --git a/internal-api/src/main/java/datadog/trace/api/intake/TrackType.java b/internal-api/src/main/java/datadog/trace/api/intake/TrackType.java index e50f46b6f13..a71c8a11685 100644 --- a/internal-api/src/main/java/datadog/trace/api/intake/TrackType.java +++ b/internal-api/src/main/java/datadog/trace/api/intake/TrackType.java @@ -9,7 +9,8 @@ public enum TrackType { LLMOBS(Endpoint.LLMOBS), NOOP(null); - @Nullable public final Endpoint endpoint; + @Nullable + public final Endpoint endpoint; TrackType(Endpoint endpoint) { this.endpoint = endpoint; diff --git a/internal-api/src/main/java/datadog/trace/api/metrics/BaggageMetrics.java b/internal-api/src/main/java/datadog/trace/api/metrics/BaggageMetrics.java index 5ca98ce43db..312bb73e1e6 100644 --- a/internal-api/src/main/java/datadog/trace/api/metrics/BaggageMetrics.java +++ b/internal-api/src/main/java/datadog/trace/api/metrics/BaggageMetrics.java @@ -24,35 +24,28 @@ public static BaggageMetrics getInstance() { private BaggageMetrics() { List counters = new ArrayList<>(5); - counters.add( - new TaggedCounter( - "context_header_style.extracted", this.extractedCounter, "header_style:baggage")); - counters.add( - new TaggedCounter( - "context_header_style.injected", this.injectedCounter, "header_style:baggage")); - counters.add( - new TaggedCounter( - "context_header_style.malformed", this.malformedCounter, "header_style:baggage")); - counters.add( - new TaggedCounter( - "context_header.truncated", - this.truncatedInjectByteCounter, - "truncation_reason:baggage_byte_count_exceeded")); - counters.add( - new TaggedCounter( - "context_header.truncated", - this.truncatedInjectItemCounter, - "truncation_reason:baggage_item_count_exceeded")); - counters.add( - new TaggedCounter( - "context_header.truncated", - this.truncatedExtractByteCounter, - "truncation_reason:baggage_extract_byte_exceeded")); - counters.add( - new TaggedCounter( - "context_header.truncated", - this.truncatedExtractItemCounter, - "truncation_reason:baggage_extract_item_exceeded")); + counters.add(new TaggedCounter( + "context_header_style.extracted", this.extractedCounter, "header_style:baggage")); + counters.add(new TaggedCounter( + "context_header_style.injected", this.injectedCounter, "header_style:baggage")); + counters.add(new TaggedCounter( + "context_header_style.malformed", this.malformedCounter, "header_style:baggage")); + counters.add(new TaggedCounter( + "context_header.truncated", + this.truncatedInjectByteCounter, + "truncation_reason:baggage_byte_count_exceeded")); + counters.add(new TaggedCounter( + "context_header.truncated", + this.truncatedInjectItemCounter, + "truncation_reason:baggage_item_count_exceeded")); + counters.add(new TaggedCounter( + "context_header.truncated", + this.truncatedExtractByteCounter, + "truncation_reason:baggage_extract_byte_exceeded")); + counters.add(new TaggedCounter( + "context_header.truncated", + this.truncatedExtractItemCounter, + "truncation_reason:baggage_extract_item_exceeded")); this.taggedCounters = Collections.unmodifiableList(counters); } diff --git a/internal-api/src/main/java/datadog/trace/api/metrics/SpanMetrics.java b/internal-api/src/main/java/datadog/trace/api/metrics/SpanMetrics.java index fa4462316ca..418b8e04e15 100644 --- a/internal-api/src/main/java/datadog/trace/api/metrics/SpanMetrics.java +++ b/internal-api/src/main/java/datadog/trace/api/metrics/SpanMetrics.java @@ -2,14 +2,13 @@ /** The core metrics related to a span./ */ public interface SpanMetrics { - SpanMetrics NOOP = - new SpanMetrics() { - @Override - public void onSpanCreated() {} + SpanMetrics NOOP = new SpanMetrics() { + @Override + public void onSpanCreated() {} - @Override - public void onSpanFinished() {} - }; + @Override + public void onSpanFinished() {} + }; /** Increment span created counter. */ void onSpanCreated(); diff --git a/internal-api/src/main/java/datadog/trace/api/metrics/StatsMetrics.java b/internal-api/src/main/java/datadog/trace/api/metrics/StatsMetrics.java index 8e49eb09b19..28d74aa010c 100644 --- a/internal-api/src/main/java/datadog/trace/api/metrics/StatsMetrics.java +++ b/internal-api/src/main/java/datadog/trace/api/metrics/StatsMetrics.java @@ -37,9 +37,8 @@ public final class StatsMetrics { // increment is a direct counter hit rather than a map lookup -- this matters precisely when a // cardinality explosion pins the table at cap and every arriving span is dropped, turning a cold // path hot. Still registered in the map above, so the telemetry drain sees it with the rest. - private final TaggedCounter wholeKeyCollapses = - this.collapsedByReason.computeIfAbsent( - COLLAPSED_WHOLE_KEY, tag -> new TaggedCounter(COLLAPSED_SPANS, tag)); + private final TaggedCounter wholeKeyCollapses = this.collapsedByReason.computeIfAbsent( + COLLAPSED_WHOLE_KEY, tag -> new TaggedCounter(COLLAPSED_SPANS, tag)); public static StatsMetrics getInstance() { return INSTANCE; diff --git a/internal-api/src/main/java/datadog/trace/api/naming/v1/PeerServiceNamingV1.java b/internal-api/src/main/java/datadog/trace/api/naming/v1/PeerServiceNamingV1.java index 827a7489e09..bbc66e4b75f 100644 --- a/internal-api/src/main/java/datadog/trace/api/naming/v1/PeerServiceNamingV1.java +++ b/internal-api/src/main/java/datadog/trace/api/naming/v1/PeerServiceNamingV1.java @@ -23,11 +23,9 @@ private static Map initPrecursorsByComponent() { ret.put("java-kafka", new String[] {InstrumentationTags.KAFKA_BOOTSTRAP_SERVERS}); // database ret.put("hazelcast-sdk", new String[] {"hazelcast.instance", Tags.PEER_HOSTNAME}); - ret.put( - "couchbase-client", - new String[] { - InstrumentationTags.COUCHBASE_SEED_NODES, "net.peer.name", Tags.PEER_HOSTNAME - }); + ret.put("couchbase-client", new String[] { + InstrumentationTags.COUCHBASE_SEED_NODES, "net.peer.name", Tags.PEER_HOSTNAME + }); ret.put( "java-cassandra", diff --git a/internal-api/src/main/java/datadog/trace/api/normalize/AntPatternHttpPathNormalizer.java b/internal-api/src/main/java/datadog/trace/api/normalize/AntPatternHttpPathNormalizer.java index 7be1924bc23..77d89908f9f 100644 --- a/internal-api/src/main/java/datadog/trace/api/normalize/AntPatternHttpPathNormalizer.java +++ b/internal-api/src/main/java/datadog/trace/api/normalize/AntPatternHttpPathNormalizer.java @@ -20,27 +20,27 @@ final class AntPatternHttpPathNormalizer extends HttpPathNormalizer { private final AntPathMatcher matcher = new AntPathMatcher(); private final DDCache cache = DDCaches.newFixedSizeCache(512); - private final Function cacheLoader = - new Function() { - @Override - public String apply(String path) { - for (Map.Entry resourceNameMatcher : resourceNameMatchers.entrySet()) { - if (matcher.match(resourceNameMatcher.getKey(), path)) { - if (KEEP_AS_IS.equals(resourceNameMatcher.getValue())) { - return path; - } - return resourceNameMatcher.getValue(); - } + private final Function cacheLoader = new Function() { + @Override + public String apply(String path) { + for (Map.Entry resourceNameMatcher : resourceNameMatchers.entrySet()) { + if (matcher.match(resourceNameMatcher.getKey(), path)) { + if (KEEP_AS_IS.equals(resourceNameMatcher.getValue())) { + return path; } - return null; + return resourceNameMatcher.getValue(); } - }; + } + return null; + } + }; AntPatternHttpPathNormalizer(Map httpResourceNameMatchers) { resourceNameMatchers = httpResourceNameMatchers; // Clean up invalid patterns - List invalidPatterns = new ArrayList<>(httpResourceNameMatchers.keySet().size()); + List invalidPatterns = + new ArrayList<>(httpResourceNameMatchers.keySet().size()); for (String pattern : resourceNameMatchers.keySet()) { if (!matcher.isPattern(pattern)) { invalidPatterns.add(pattern); diff --git a/internal-api/src/main/java/datadog/trace/api/profiling/ProfilerFlareLogger.java b/internal-api/src/main/java/datadog/trace/api/profiling/ProfilerFlareLogger.java index 6fc57ae641d..f6903ac5229 100644 --- a/internal-api/src/main/java/datadog/trace/api/profiling/ProfilerFlareLogger.java +++ b/internal-api/src/main/java/datadog/trace/api/profiling/ProfilerFlareLogger.java @@ -45,11 +45,10 @@ public boolean log(String msgFormat, Object... args) { log.warn(msgFormat, args); FormattingTuple ft = MessageFormatter.arrayFormat(msgFormat, args); - StringBuilder sb = - new StringBuilder(Instant.now().atZone(ZoneOffset.UTC).toString()) - .append('\t') - .append(ft.getMessage()) - .append('\n'); + StringBuilder sb = new StringBuilder(Instant.now().atZone(ZoneOffset.UTC).toString()) + .append('\t') + .append(ft.getMessage()) + .append('\n'); if (ft.getThrowable() != null) { sb.append(ft.getThrowable()); } diff --git a/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java b/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java index 5683f29372c..af235809614 100644 --- a/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java +++ b/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java @@ -16,14 +16,13 @@ public final class RumInjector { new RumInjector(Config.get(), InstrumenterConfig.get()); private static final String MARKER = ""; private static final char[] MARKER_CHARS = MARKER.toCharArray(); - private static final Function MARKER_BYTES = - charset -> { - try { - return MARKER.getBytes(charset); - } catch (Throwable t) { - return null; - } - }; + private static final Function MARKER_BYTES = charset -> { + try { + return MARKER.getBytes(charset); + } catch (Throwable t) { + return null; + } + }; private final boolean enabled; private final String snippet; @@ -45,14 +44,13 @@ public final class RumInjector { this.snippetCache = DDCaches.newFixedSizeCache(16); this.markerCache = DDCaches.newFixedSizeCache(16); this.snippetChars = this.snippet.toCharArray(); - this.snippetBytes = - charset -> { - try { - return snippet.getBytes(charset); - } catch (Throwable t) { - return null; - } - }; + this.snippetBytes = charset -> { + try { + return snippet.getBytes(charset); + } catch (Throwable t) { + return null; + } + }; } else { this.enabled = false; this.snippet = null; diff --git a/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorConfig.java b/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorConfig.java index 11832a0a515..b0ef471de76 100644 --- a/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorConfig.java @@ -30,40 +30,50 @@ public class RumInjectorConfig { public final String site; /** The name of the service being monitored. */ - @Nullable public final String service; + @Nullable + public final String service; /** The environment of the service (e.g., `prod`, `staging` or `dev). */ - @Nullable public final String env; + @Nullable + public final String env; /** SDK major version. */ public final int majorVersion; /** The version of the service (e.g., `0.1.0`, `a8dj92`, `2024-30`). */ - @Nullable public final String version; + @Nullable + public final String version; /** Enables or disables the automatic collection of users actions (e.g., clicks). */ - @Nullable public final Boolean trackUserInteractions; + @Nullable + public final Boolean trackUserInteractions; /** Enables or disables the collection of resource events (e.g., loading of images or scripts). */ - @Nullable public final Boolean trackResources; + @Nullable + public final Boolean trackResources; /** Enables or disables the collection of long task events. */ - @Nullable public final Boolean trackLongTask; + @Nullable + public final Boolean trackLongTask; /** The privacy level for data collection. */ - @Nullable public final PrivacyLevel defaultPrivacyLevel; + @Nullable + public final PrivacyLevel defaultPrivacyLevel; /** The percentage of user sessions to be tracked (between 0.0 and 100.0). */ - @Nullable public final Float sessionSampleRate; + @Nullable + public final Float sessionSampleRate; /** * The percentage of tracked sessions that will include Session Replay data (between 0.0 and * 100.0). */ - @Nullable public final Float sessionReplaySampleRate; + @Nullable + public final Float sessionReplaySampleRate; /** The remote configuration identifier. */ - @Nullable public final String remoteConfigurationId; + @Nullable + public final String remoteConfigurationId; /** The JSON representation of injector config to use in the injected SDK snippet. */ public final String jsonPayload; diff --git a/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorMetrics.java b/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorMetrics.java index 54ddd499e82..b76787cbfe4 100644 --- a/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorMetrics.java +++ b/internal-api/src/main/java/datadog/trace/api/rum/RumInjectorMetrics.java @@ -53,15 +53,13 @@ public RumInjectorMetrics() { @Override public void onInjectionSucceed(String servletVersion) { - List tags = - succeedTagsCache.computeIfAbsent( - servletVersion, - version -> - Arrays.asList( - "application_id:" + applicationId, - "integration_name:servlet", - "integration_version:" + version, - "remote_config_used:" + remoteConfigUsed)); + List tags = succeedTagsCache.computeIfAbsent( + servletVersion, + version -> Arrays.asList( + "application_id:" + applicationId, + "integration_name:servlet", + "integration_version:" + version, + "remote_config_used:" + remoteConfigUsed)); MetricCollector.Metric metric = new MetricCollector.Metric("rum", true, "injection.succeed", "count", 1, tags); @@ -71,27 +69,24 @@ public void onInjectionSucceed(String servletVersion) { @Override public void onInjectionFailed(String servletVersion, String contentEncoding) { String cacheKey = servletVersion + ":" + contentEncoding; - List tags = - failedTagsCache.computeIfAbsent( - cacheKey, - key -> { - if (contentEncoding != null) { - return Arrays.asList( - "application_id:" + applicationId, - "content_encoding:" + contentEncoding, - "integration_name:servlet", - "integration_version:" + servletVersion, - "reason:failed_to_return_response_wrapper", - "remote_config_used:" + remoteConfigUsed); - } else { - return Arrays.asList( - "application_id:" + applicationId, - "integration_name:servlet", - "integration_version:" + servletVersion, - "reason:failed_to_return_response_wrapper", - "remote_config_used:" + remoteConfigUsed); - } - }); + List tags = failedTagsCache.computeIfAbsent(cacheKey, key -> { + if (contentEncoding != null) { + return Arrays.asList( + "application_id:" + applicationId, + "content_encoding:" + contentEncoding, + "integration_name:servlet", + "integration_version:" + servletVersion, + "reason:failed_to_return_response_wrapper", + "remote_config_used:" + remoteConfigUsed); + } else { + return Arrays.asList( + "application_id:" + applicationId, + "integration_name:servlet", + "integration_version:" + servletVersion, + "reason:failed_to_return_response_wrapper", + "remote_config_used:" + remoteConfigUsed); + } + }); MetricCollector.Metric metric = new MetricCollector.Metric("rum", true, "injection.failed", "count", 1, tags); @@ -100,16 +95,14 @@ public void onInjectionFailed(String servletVersion, String contentEncoding) { @Override public void onInjectionSkipped(String servletVersion) { - List tags = - skippedTagsCache.computeIfAbsent( - servletVersion, - version -> - Arrays.asList( - "application_id:" + applicationId, - "integration_name:servlet", - "integration_version:" + version, - "reason:should_not_inject", - "remote_config_used:" + remoteConfigUsed)); + List tags = skippedTagsCache.computeIfAbsent( + servletVersion, + version -> Arrays.asList( + "application_id:" + applicationId, + "integration_name:servlet", + "integration_version:" + version, + "reason:should_not_inject", + "remote_config_used:" + remoteConfigUsed)); MetricCollector.Metric metric = new MetricCollector.Metric("rum", true, "injection.skipped", "count", 1, tags); @@ -118,45 +111,36 @@ public void onInjectionSkipped(String servletVersion) { @Override public void onInitializationSucceed() { - List tags = - initTagsCache.computeIfAbsent( - "init", key -> Arrays.asList("integration_name:servlet", "integration_version:N/A")); + List tags = initTagsCache.computeIfAbsent( + "init", key -> Arrays.asList("integration_name:servlet", "integration_version:N/A")); - MetricCollector.Metric metric = - new MetricCollector.Metric( - "rum", true, "injection.initialization.succeed", "count", 1, tags); + MetricCollector.Metric metric = new MetricCollector.Metric( + "rum", true, "injection.initialization.succeed", "count", 1, tags); metrics.offer(metric); } @Override public void onContentSecurityPolicyDetected(String servletVersion) { - List tags = - cspTagsCache.computeIfAbsent( - servletVersion, - version -> - Arrays.asList( - "integration_name:servlet", - "integration_version:" + version, - "kind:header", - "reason:csp_header_found", - "status:seen")); - - MetricCollector.Metric metric = - new MetricCollector.Metric( - "rum", true, "injection.content_security_policy", "count", 1, tags); + List tags = cspTagsCache.computeIfAbsent( + servletVersion, + version -> Arrays.asList( + "integration_name:servlet", + "integration_version:" + version, + "kind:header", + "reason:csp_header_found", + "status:seen")); + + MetricCollector.Metric metric = new MetricCollector.Metric( + "rum", true, "injection.content_security_policy", "count", 1, tags); metrics.offer(metric); } @Override public void onInjectionResponseSize(String servletVersion, long bytes) { - List tags = - responseTagsCache.computeIfAbsent( - servletVersion, - version -> - Arrays.asList( - "integration_name:servlet", - "integration_version:" + version, - "response_kind:header")); + List tags = responseTagsCache.computeIfAbsent( + servletVersion, + version -> Arrays.asList( + "integration_name:servlet", "integration_version:" + version, "response_kind:header")); MetricCollector.DistributionSeriesPoint distribution = new MetricCollector.DistributionSeriesPoint( @@ -166,10 +150,9 @@ public void onInjectionResponseSize(String servletVersion, long bytes) { @Override public void onInjectionTime(String servletVersion, long milliseconds) { - List tags = - timeTagsCache.computeIfAbsent( - servletVersion, - version -> Arrays.asList("integration_name:servlet", "integration_version:" + version)); + List tags = timeTagsCache.computeIfAbsent( + servletVersion, + version -> Arrays.asList("integration_name:servlet", "integration_version:" + version)); MetricCollector.DistributionSeriesPoint distribution = new MetricCollector.DistributionSeriesPoint( diff --git a/internal-api/src/main/java/datadog/trace/api/rum/RumTelemetryCollector.java b/internal-api/src/main/java/datadog/trace/api/rum/RumTelemetryCollector.java index 21e19a4cd82..441ec26efb1 100644 --- a/internal-api/src/main/java/datadog/trace/api/rum/RumTelemetryCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/rum/RumTelemetryCollector.java @@ -10,42 +10,41 @@ */ public interface RumTelemetryCollector { - RumTelemetryCollector NO_OP = - new RumTelemetryCollector() { - @Override - public void onInjectionSucceed(String integrationVersion) {} + RumTelemetryCollector NO_OP = new RumTelemetryCollector() { + @Override + public void onInjectionSucceed(String integrationVersion) {} - @Override - public void onInjectionFailed(String integrationVersion, String contentEncoding) {} + @Override + public void onInjectionFailed(String integrationVersion, String contentEncoding) {} - @Override - public void onInjectionSkipped(String integrationVersion) {} + @Override + public void onInjectionSkipped(String integrationVersion) {} - @Override - public void onInitializationSucceed() {} + @Override + public void onInitializationSucceed() {} - @Override - public void onContentSecurityPolicyDetected(String integrationVersion) {} + @Override + public void onContentSecurityPolicyDetected(String integrationVersion) {} - @Override - public void onInjectionResponseSize(String integrationVersion, long bytes) {} + @Override + public void onInjectionResponseSize(String integrationVersion, long bytes) {} - @Override - public void onInjectionTime(String integrationVersion, long milliseconds) {} + @Override + public void onInjectionTime(String integrationVersion, long milliseconds) {} - @Override - public void close() {} + @Override + public void close() {} - @Override - public Collection drain() { - return Collections.emptyList(); - } + @Override + public Collection drain() { + return Collections.emptyList(); + } - @Override - public Collection drainDistributionSeries() { - return Collections.emptyList(); - } - }; + @Override + public Collection drainDistributionSeries() { + return Collections.emptyList(); + } + }; /** * Reports successful RUM injection. diff --git a/internal-api/src/main/java/datadog/trace/api/sampling/AdaptiveSampler.java b/internal-api/src/main/java/datadog/trace/api/sampling/AdaptiveSampler.java index 56ad00be9c6..e3b96866d77 100644 --- a/internal-api/src/main/java/datadog/trace/api/sampling/AdaptiveSampler.java +++ b/internal-api/src/main/java/datadog/trace/api/sampling/AdaptiveSampler.java @@ -283,10 +283,9 @@ private void rollWindow() { } private long calculateBudgetEma(final long sampledCount) { - avgSamples = - Double.isNaN(avgSamples) || budgetAlpha <= 0.0d - ? sampledCount - : avgSamples + budgetAlpha * (sampledCount - avgSamples); + avgSamples = Double.isNaN(avgSamples) || budgetAlpha <= 0.0d + ? sampledCount + : avgSamples + budgetAlpha * (sampledCount - avgSamples); return Math.round(Math.max(samplesPerWindow - avgSamples, 0) * budgetLookback); } diff --git a/internal-api/src/main/java/datadog/trace/api/sampling/PerRecordingRateLimiter.java b/internal-api/src/main/java/datadog/trace/api/sampling/PerRecordingRateLimiter.java index fdee9232459..7c7182ee860 100644 --- a/internal-api/src/main/java/datadog/trace/api/sampling/PerRecordingRateLimiter.java +++ b/internal-api/src/main/java/datadog/trace/api/sampling/PerRecordingRateLimiter.java @@ -29,10 +29,8 @@ public static int samplingWindowsPerRecording(long uploadPeriodSeconds, Duration * None of these durations should be big enough to warrant dealing with bigints. * We also do not care about nanoseconds here. */ - return (int) - Math.min( - Duration.of(uploadPeriodSeconds, ChronoUnit.SECONDS).toMillis() - / samplingWindow.toMillis(), - Integer.MAX_VALUE); + return (int) Math.min( + Duration.of(uploadPeriodSeconds, ChronoUnit.SECONDS).toMillis() / samplingWindow.toMillis(), + Integer.MAX_VALUE); } } diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorImpl.java b/internal-api/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorImpl.java index 6a956388256..d9bfaca42d9 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorImpl.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/ConfigInversionMetricCollectorImpl.java @@ -36,9 +36,8 @@ public void setUndocumentedEnvVarMetric(String configName) { } private void setMetricConfigInversionMetric(final String... tags) { - if (!metricsQueue.offer( - new ConfigInversionMetricCollectorImpl.ConfigInversionMetric( - NAMESPACE, true, CONFIG_INVERSION_METRIC_NAME, "count", 1, tags))) { + if (!metricsQueue.offer(new ConfigInversionMetricCollectorImpl.ConfigInversionMetric( + NAMESPACE, true, CONFIG_INVERSION_METRIC_NAME, "count", 1, tags))) { log.debug("Unable to add telemetry metric {} for {}", CONFIG_INVERSION_METRIC_NAME, tags[0]); } } diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/CoreMetricCollector.java b/internal-api/src/main/java/datadog/trace/api/telemetry/CoreMetricCollector.java index 9c8074dee70..85a89b2ed7a 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/CoreMetricCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/CoreMetricCollector.java @@ -58,9 +58,8 @@ public void prepareMetrics() { // Skip not updated counters continue; } - CoreMetric metric = - new CoreMetric( - METRIC_NAMESPACE, true, counter.getName(), "count", value, counter.getTag()); + CoreMetric metric = new CoreMetric( + METRIC_NAMESPACE, true, counter.getName(), "count", value, counter.getTag()); if (!this.metricsQueue.offer(metric)) { // Stop adding metrics if the queue is full break; diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/LLMObsMetricCollector.java b/internal-api/src/main/java/datadog/trace/api/telemetry/LLMObsMetricCollector.java index 9ca9e556b5c..8450be4f1d6 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/LLMObsMetricCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/LLMObsMetricCollector.java @@ -101,14 +101,13 @@ public void recordSpanFinished( integrationTagCache.computeIfAbsent(integration, key -> "integration:" + key); String spanKindTag = spanKindTagCache.computeIfAbsent(spanKind, key -> "span_kind:" + key); - List tags = - Arrays.asList( - integrationTag, - spanKindTag, - isRootSpan ? IS_ROOT_SPAN_TRUE : IS_ROOT_SPAN_FALSE, - isAutoInstrumented ? AUTOINSTRUMENTED_TRUE : AUTOINSTRUMENTED_FALSE, - hasError ? ERROR_TRUE : ERROR_FALSE, - hasSessionId ? HAS_SESSION_ID_TRUE : HAS_SESSION_ID_FALSE); + List tags = Arrays.asList( + integrationTag, + spanKindTag, + isRootSpan ? IS_ROOT_SPAN_TRUE : IS_ROOT_SPAN_FALSE, + isAutoInstrumented ? AUTOINSTRUMENTED_TRUE : AUTOINSTRUMENTED_FALSE, + hasError ? ERROR_TRUE : ERROR_FALSE, + hasSessionId ? HAS_SESSION_ID_TRUE : HAS_SESSION_ID_FALSE); LongAdder counter = spanFinishedCounters.get(tags); if (counter == null) { @@ -134,14 +133,13 @@ public void recordSpanFinished( * @param error whether the processor failed */ public void recordUserProcessorCalled(boolean error) { - LLMObsMetric metric = - new LLMObsMetric( - METRIC_NAMESPACE, - true, - USER_PROCESSOR_CALLED_METRIC, - COUNT_METRIC_TYPE, - 1L, - Collections.singletonList(error ? ERROR_TRUE : ERROR_FALSE)); + LLMObsMetric metric = new LLMObsMetric( + METRIC_NAMESPACE, + true, + USER_PROCESSOR_CALLED_METRIC, + COUNT_METRIC_TYPE, + 1L, + Collections.singletonList(error ? ERROR_TRUE : ERROR_FALSE)); if (!metricsQueue.offer(metric)) { log.debug("Unable to add telemetry metric {}", USER_PROCESSOR_CALLED_METRIC); } @@ -171,9 +169,8 @@ public void recordFeedbackSubmitted( tags.add("metric_type:" + (metricType == null ? OTHER : metricType)); tags.add("target_type:" + (targetType == null ? OTHER : targetType)); - LLMObsMetric metric = - new LLMObsMetric( - METRIC_NAMESPACE, true, FEEDBACK_SUBMITTED_METRIC, COUNT_METRIC_TYPE, 1L, tags); + LLMObsMetric metric = new LLMObsMetric( + METRIC_NAMESPACE, true, FEEDBACK_SUBMITTED_METRIC, COUNT_METRIC_TYPE, 1L, tags); if (!metricsQueue.offer(metric)) { log.debug("Unable to add telemetry metric {}", FEEDBACK_SUBMITTED_METRIC); } @@ -189,14 +186,8 @@ public void prepareMetrics() { if (value == 0) { continue; } - LLMObsMetric metric = - new LLMObsMetric( - METRIC_NAMESPACE, - true, - SPAN_FINISHED_METRIC, - COUNT_METRIC_TYPE, - value, - entry.getKey()); + LLMObsMetric metric = new LLMObsMetric( + METRIC_NAMESPACE, true, SPAN_FINISHED_METRIC, COUNT_METRIC_TYPE, value, entry.getKey()); if (!metricsQueue.offer(metric)) { // Queue is full; give the count back to the counter so it is reported in a later interval // instead of being lost, and stop staging for now. diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImpl.java b/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImpl.java index 5f01d884a65..ee5b1f7fc53 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImpl.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImpl.java @@ -52,9 +52,8 @@ public void setUnsupportedOtelEnvVarMetric(String otelName) { } private void setMetricOtelEnvVarMetric(String metricName, final String... tags) { - if (!metricsQueue.offer( - new OtelEnvMetricCollectorImpl.OtelEnvMetric( - NAMESPACE, true, metricName, "count", 1, tags))) { + if (!metricsQueue.offer(new OtelEnvMetricCollectorImpl.OtelEnvMetric( + NAMESPACE, true, metricName, "count", 1, tags))) { log.debug("Unable to add telemetry metric {} for {}", metricName, tags[0]); } } diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/OtelSpiCollector.java b/internal-api/src/main/java/datadog/trace/api/telemetry/OtelSpiCollector.java index 375b17b6893..519b9bcbd77 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/OtelSpiCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/OtelSpiCollector.java @@ -29,15 +29,14 @@ public static OtelSpiCollector getInstance() { } public void recordSpiDetected(String spiFqn, String source) { - if (!metricsQueue.offer( - new OtelSpiMetric( - NAMESPACE, - true, - OTEL_SPI_DETECTED_METRIC_NAME, - "count", - 1, - SPI_CLASS_TAG + spiFqn, - SOURCE_TAG + source))) { + if (!metricsQueue.offer(new OtelSpiMetric( + NAMESPACE, + true, + OTEL_SPI_DETECTED_METRIC_NAME, + "count", + 1, + SPI_CLASS_TAG + spiFqn, + SOURCE_TAG + source))) { log.debug( "Unable to add telemetry metric {} for spi_class={} source={}", OTEL_SPI_DETECTED_METRIC_NAME, diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/RuleType.java b/internal-api/src/main/java/datadog/trace/api/telemetry/RuleType.java index 4ae4e7d4a9d..ec785361a23 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/RuleType.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/RuleType.java @@ -11,7 +11,10 @@ public enum RuleType { COMMAND_INJECTION(Type.COMMAND_INJECTION, Variant.EXEC); public final Type type; - @Nullable public final Variant variant; + + @Nullable + public final Variant variant; + private static final int numValues = RuleType.values().length; RuleType(Type type) { diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistry.java b/internal-api/src/main/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistry.java index 316e1bce922..e4d25cf1e9a 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistry.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistry.java @@ -186,9 +186,8 @@ void recordHit(String vulnId, String callsiteClass, String callsiteSymbol, int c // compareAndSet guarantees exactly one callsite is stored (first hit wins). // A plain volatile check-then-assign would allow two threads racing on different // methods of the same CVE to both see null and both write, violating the invariant. - ScaReachabilityHit newHit = - new ScaReachabilityHit( - vulnId, artifact, version, callsiteClass, callsiteSymbol, callsiteLine); + ScaReachabilityHit newHit = new ScaReachabilityHit( + vulnId, artifact, version, callsiteClass, callsiteSymbol, callsiteLine); if (state.hitRef.compareAndSet(null, newHit)) { pendingReport = true; } diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/WafMetricCollector.java b/internal-api/src/main/java/datadog/trace/api/telemetry/WafMetricCollector.java index 5d510f23a1a..1a1d1534f0f 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/WafMetricCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/WafMetricCollector.java @@ -148,16 +148,15 @@ public void wafRequest( final boolean rateLimited, final boolean inputTruncated, final boolean requestExcluded) { - int index = - computeWafRequestIndex( - ruleTriggered, - requestBlocked, - wafError, - wafTimeout, - blockFailure, - rateLimited, - inputTruncated, - requestExcluded); + int index = computeWafRequestIndex( + ruleTriggered, + requestBlocked, + wafError, + wafTimeout, + blockFailure, + rateLimited, + inputTruncated, + requestExcluded); wafRequestCounter.incrementAndGet(index); } @@ -360,19 +359,18 @@ public void prepareMetrics() { boolean inputTruncated = (i & (1 << 6)) != 0; boolean requestExcluded = (i & (1 << 7)) != 0; - if (!rawMetricsQueue.offer( - new WafRequestsRawMetric( - counter, - WafMetricCollector.wafVersion, - WafMetricCollector.rulesVersion, - ruleTriggered, - requestBlocked, - wafError, - wafTimeout, - blockFailure, - rateLimited, - inputTruncated, - requestExcluded))) { + if (!rawMetricsQueue.offer(new WafRequestsRawMetric( + counter, + WafMetricCollector.wafVersion, + WafMetricCollector.rulesVersion, + ruleTriggered, + requestBlocked, + wafError, + wafTimeout, + blockFailure, + rateLimited, + inputTruncated, + requestExcluded))) { return; } } @@ -505,9 +503,8 @@ public void prepareMetrics() { // WAF config errors int configErrors = wafConfigErrorCounter.getAndSet(0); if (configErrors > 0) { - if (!rawMetricsQueue.offer( - new WafConfigError( - configErrors, WafMetricCollector.wafVersion, WafMetricCollector.rulesVersion))) { + if (!rawMetricsQueue.offer(new WafConfigError( + configErrors, WafMetricCollector.wafVersion, WafMetricCollector.rulesVersion))) { return; } } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java index 46a01b3f70f..5fa29598cf4 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java @@ -65,12 +65,10 @@ public interface ContextVisitor extends CarrierVisitor { @ParametersAreNonnullByDefault @Override default void forEachKeyValue(C carrier, BiConsumer visitor) { - forEachKey( - carrier, - (key, value) -> { - visitor.accept(key, value); - return true; - }); + forEachKey(carrier, (key, value) -> { + visitor.accept(key, value); + return true; + }); } } } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/java/lang/ProcessImplInstrumentationHelpers.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/java/lang/ProcessImplInstrumentationHelpers.java index 1e63487012a..ce78334b3be 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/java/lang/ProcessImplInstrumentationHelpers.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/java/lang/ProcessImplInstrumentationHelpers.java @@ -42,9 +42,8 @@ public class ProcessImplInstrumentationHelpers { private static final Executor EXECUTOR; private static final Pattern REDACTED_PARAM_PAT = - Pattern.compile( - "^(?i)-{0,2}(?:p(?:ass(?:w(?:or)?d)?)?|api_?key|secret|" - + "a(?:ccess|uth)_token|mysql_pwd|credentials|(?:stripe)?token)$"); + Pattern.compile("^(?i)-{0,2}(?:p(?:ass(?:w(?:or)?d)?)?|api_?key|secret|" + + "a(?:ccess|uth)_token|mysql_pwd|credentials|(?:stripe)?token)$"); private static final Set REDACTED_BINARIES = Collections.singleton("md5"); // This check is used to avoid command injection exploit prevention if shell injection exploit @@ -56,9 +55,8 @@ public class ProcessImplInstrumentationHelpers { Executor executor = null; try { // java 9 - processOnExit = - MethodHandles.publicLookup() - .findVirtual(Process.class, "onExit", methodType(CompletableFuture.class)); + processOnExit = MethodHandles.publicLookup() + .findVirtual(Process.class, "onExit", methodType(CompletableFuture.class)); } catch (Throwable e) { try { // java 8 @@ -173,28 +171,26 @@ public static void addProcessCompletionHook(Process p, AgentSpan span) { } final ContextContinuation continuation = captureActiveSpan(); - future.whenComplete( - (process, thr) -> { - if (thr != null) { - span.addThrowable(thr); - } else { - span.setTag("cmd.exit_code", Integer.toString(process.exitValue())); - } - finishSpan(continuation, span); - }); + future.whenComplete((process, thr) -> { + if (thr != null) { + span.addThrowable(thr); + } else { + span.setTag("cmd.exit_code", Integer.toString(process.exitValue())); + } + finishSpan(continuation, span); + }); } else if (EXECUTOR != null) { final ContextContinuation continuation = captureActiveSpan(); - EXECUTOR.execute( - () -> { - try { - int exitCode = p.waitFor(); - span.setTag("cmd.exit_code", Integer.toString(exitCode)); - } catch (InterruptedException e) { - span.addThrowable(e); - } finally { - finishSpan(continuation, span); - } - }); + EXECUTOR.execute(() -> { + try { + int exitCode = p.waitFor(); + span.setTag("cmd.exit_code", Integer.toString(exitCode)); + } catch (InterruptedException e) { + span.addThrowable(e); + } finally { + finishSpan(continuation, span); + } + }); } } @@ -219,10 +215,9 @@ public static void cmdiRaspCheck(@Nonnull final String[] cmdArray) { return; } try { - final BiFunction> execCmdCallback = - AgentTracer.get() - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.execCmd()); + final BiFunction> execCmdCallback = AgentTracer.get() + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.execCmd()); if (execCmdCallback == null) { return; @@ -270,10 +265,9 @@ public static void shiRaspCheck(@Nonnull final String cmd) { } checkShi.set(true); try { - final BiFunction> shellCmdCallback = - AgentTracer.get() - .getCallbackProvider(RequestContextSlot.APPSEC) - .getCallback(EVENTS.shellCmd()); + final BiFunction> shellCmdCallback = AgentTracer.get() + .getCallbackProvider(RequestContextSlot.APPSEC) + .getCallback(EVENTS.shellCmd()); if (shellCmdCallback == null) { return; diff --git a/internal-api/src/main/java/datadog/trace/logging/GlobalLogLevelSwitcher.java b/internal-api/src/main/java/datadog/trace/logging/GlobalLogLevelSwitcher.java index 400772b7f2d..ca699d6377b 100644 --- a/internal-api/src/main/java/datadog/trace/logging/GlobalLogLevelSwitcher.java +++ b/internal-api/src/main/java/datadog/trace/logging/GlobalLogLevelSwitcher.java @@ -25,7 +25,8 @@ public static LogLevelSwitcher get() { delegate = (LogLevelSwitcher) factory; } else { log.error( - "Unable to find global log level switcher, found {}", factory.getClass().getSimpleName()); + "Unable to find global log level switcher, found {}", + factory.getClass().getSimpleName()); delegate = null; } } diff --git a/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java b/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java index 81ecb2a76d3..e53b1f4e6d6 100644 --- a/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java +++ b/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java @@ -124,14 +124,11 @@ public Scheduled scheduleWithJitter( // milliseconds, with p = 0.25, meaning the probability that the aggregator will not // have started by the nth second is 0.25(0.75)^n-1 (or a 1% chance of not having // started within 10 seconds, where a cap is applied) - long randomMillis = - unit.toMillis(initialDelay) - + Math.min( - (long) - (1000D - * Math.log(ThreadLocalRandom.current().nextDouble()) - / Math.log(1 - 0.25)), - 10_000); + long randomMillis = unit.toMillis(initialDelay) + + Math.min( + (long) + (1000D * Math.log(ThreadLocalRandom.current().nextDouble()) / Math.log(1 - 0.25)), + 10_000); return schedule(task, target, randomMillis, MILLISECONDS); } diff --git a/internal-api/src/main/java/datadog/trace/util/AgentThreadFactory.java b/internal-api/src/main/java/datadog/trace/util/AgentThreadFactory.java index 81cd9a0b294..e84b4818d45 100644 --- a/internal-api/src/main/java/datadog/trace/util/AgentThreadFactory.java +++ b/internal-api/src/main/java/datadog/trace/util/AgentThreadFactory.java @@ -120,14 +120,13 @@ public static Thread newAgentThread( final Thread thread = new Thread(AGENT_THREAD_GROUP, runnable, threadName); thread.setDaemon(daemon); thread.setContextClassLoader(null); - thread.setUncaughtExceptionHandler( - new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(final Thread thread, final Throwable e) { - LoggerFactory.getLogger(runnable.getClass()) - .error("Uncaught exception {} in {}", e, agentThread.threadName, e); - } - }); + thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(final Thread thread, final Throwable e) { + LoggerFactory.getLogger(runnable.getClass()) + .error("Uncaught exception {} in {}", e, agentThread.threadName, e); + } + }); return thread; } } diff --git a/internal-api/src/main/java/datadog/trace/util/FlatHashtable.java b/internal-api/src/main/java/datadog/trace/util/FlatHashtable.java index 4dc6bf5a2ec..41baa04ecef 100644 --- a/internal-api/src/main/java/datadog/trace/util/FlatHashtable.java +++ b/internal-api/src/main/java/datadog/trace/util/FlatHashtable.java @@ -636,12 +636,11 @@ public static int capacityFor(int cardinalityLimit, float loadFactor) { int min = (int) Math.ceil(cardinalityLimit / (double) loadFactor); int capacity = Integer.highestOneBit(min - 1) << 1; if (capacity <= 0) { - throw new IllegalArgumentException( - "cardinalityLimit " - + cardinalityLimit - + " at loadFactor " - + loadFactor - + " requires a capacity larger than Integer.MAX_VALUE"); + throw new IllegalArgumentException("cardinalityLimit " + + cardinalityLimit + + " at loadFactor " + + loadFactor + + " requires a capacity larger than Integer.MAX_VALUE"); } return capacity; } diff --git a/internal-api/src/main/java/datadog/trace/util/Hashtable.java b/internal-api/src/main/java/datadog/trace/util/Hashtable.java index a2fbfc62ad1..894c979f01b 100644 --- a/internal-api/src/main/java/datadog/trace/util/Hashtable.java +++ b/internal-api/src/main/java/datadog/trace/util/Hashtable.java @@ -823,14 +823,8 @@ public static final class MutatingTableIterator "startBucket " + startBucket + " out of range [0, " + buckets.length + "]"); } if (endBucket < startBucket || endBucket > buckets.length) { - throw new IndexOutOfBoundsException( - "endBucket " - + endBucket - + " out of range [" - + startBucket - + ", " - + buckets.length - + "]"); + throw new IndexOutOfBoundsException("endBucket " + endBucket + " out of range [" + + startBucket + ", " + buckets.length + "]"); } this.endBucket = endBucket; seekFromBucket(startBucket); diff --git a/internal-api/src/main/java/datadog/trace/util/Maybe.java b/internal-api/src/main/java/datadog/trace/util/Maybe.java index 5c0a1fb0499..c2da9e36e4f 100644 --- a/internal-api/src/main/java/datadog/trace/util/Maybe.java +++ b/internal-api/src/main/java/datadog/trace/util/Maybe.java @@ -35,7 +35,8 @@ * stronger failure mode than the one demonstrated here. */ public final class Maybe { - @Nullable private final T value; + @Nullable + private final T value; private Maybe(@Nullable T value) { this.value = value; diff --git a/internal-api/src/main/java/datadog/trace/util/MethodHandles.java b/internal-api/src/main/java/datadog/trace/util/MethodHandles.java index bb0f756bf6f..9ee4e0dcd93 100644 --- a/internal-api/src/main/java/datadog/trace/util/MethodHandles.java +++ b/internal-api/src/main/java/datadog/trace/util/MethodHandles.java @@ -30,34 +30,32 @@ public MethodHandle privateFieldGetter(String className, String fieldName) { } public MethodHandle privateFieldGetter(Class clazz, String fieldName) { - return AccessController.doPrivileged( - (PrivilegedAction) - () -> { - try { - try { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - String packageName = clazz.getPackage().getName(); - sm.checkPackageAccess(packageName); - } - } catch (UnsupportedOperationException e) { - // ignore - } - - Field field = clazz.getDeclaredField(fieldName); - field.setAccessible(true); - return lookup.unreflectGetter(field); - - } catch (Throwable t) { - log.debug( - LogCollector.EXCLUDE_TELEMETRY, - "Could not get private field {} getter from class {}", - fieldName, - clazz.getName(), - t); - return null; - } - }); + return AccessController.doPrivileged((PrivilegedAction) () -> { + try { + try { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + String packageName = clazz.getPackage().getName(); + sm.checkPackageAccess(packageName); + } + } catch (UnsupportedOperationException e) { + // ignore + } + + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return lookup.unreflectGetter(field); + + } catch (Throwable t) { + log.debug( + LogCollector.EXCLUDE_TELEMETRY, + "Could not get private field {} getter from class {}", + fieldName, + clazz.getName(), + t); + return null; + } + }); } public MethodHandle privateFieldSetter(String className, String fieldName) { @@ -66,34 +64,32 @@ public MethodHandle privateFieldSetter(String className, String fieldName) { } public MethodHandle privateFieldSetter(Class clazz, String fieldName) { - return AccessController.doPrivileged( - (PrivilegedAction) - () -> { - try { - try { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - String packageName = clazz.getPackage().getName(); - sm.checkPackageAccess(packageName); - } - } catch (UnsupportedOperationException e) { - // ignore - } - - Field field = clazz.getDeclaredField(fieldName); - field.setAccessible(true); - return lookup.unreflectSetter(field); - - } catch (Throwable t) { - log.debug( - LogCollector.EXCLUDE_TELEMETRY, - "Could not get private field {} setter from class {}", - fieldName, - clazz.getName(), - t); - return null; - } - }); + return AccessController.doPrivileged((PrivilegedAction) () -> { + try { + try { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + String packageName = clazz.getPackage().getName(); + sm.checkPackageAccess(packageName); + } + } catch (UnsupportedOperationException e) { + // ignore + } + + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return lookup.unreflectSetter(field); + + } catch (Throwable t) { + log.debug( + LogCollector.EXCLUDE_TELEMETRY, + "Could not get private field {} setter from class {}", + fieldName, + clazz.getName(), + t); + return null; + } + }); } public MethodHandle constructor(String className, Class... parameterTypes) { @@ -102,34 +98,32 @@ public MethodHandle constructor(String className, Class... parameterTypes) { } public MethodHandle constructor(Class clazz, Class... parameterTypes) { - return AccessController.doPrivileged( - (PrivilegedAction) - () -> { - try { - try { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - String packageName = clazz.getPackage().getName(); - sm.checkPackageAccess(packageName); - } - } catch (UnsupportedOperationException e) { - // ignore - } - - Constructor constructor = clazz.getDeclaredConstructor(parameterTypes); - constructor.setAccessible(true); - return lookup.unreflectConstructor(constructor); - - } catch (Throwable t) { - log.debug( - LogCollector.EXCLUDE_TELEMETRY, - "Could not get constructor accepting {} from class {}", - Arrays.toString(parameterTypes), - clazz.getName(), - t); - return null; - } - }); + return AccessController.doPrivileged((PrivilegedAction) () -> { + try { + try { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + String packageName = clazz.getPackage().getName(); + sm.checkPackageAccess(packageName); + } + } catch (UnsupportedOperationException e) { + // ignore + } + + Constructor constructor = clazz.getDeclaredConstructor(parameterTypes); + constructor.setAccessible(true); + return lookup.unreflectConstructor(constructor); + + } catch (Throwable t) { + log.debug( + LogCollector.EXCLUDE_TELEMETRY, + "Could not get constructor accepting {} from class {}", + Arrays.toString(parameterTypes), + clazz.getName(), + t); + return null; + } + }); } public MethodHandle method(String className, String methodName, Class... parameterTypes) { @@ -138,72 +132,65 @@ public MethodHandle method(String className, String methodName, Class... para } public MethodHandle method(Class clazz, String methodName, Class... parameterTypes) { - return AccessController.doPrivileged( - (PrivilegedAction) - () -> { - try { - try { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - String packageName = clazz.getPackage().getName(); - sm.checkPackageAccess(packageName); - } - } catch (UnsupportedOperationException e) { - // ignore - } - - Method method = clazz.getDeclaredMethod(methodName, parameterTypes); - method.setAccessible(true); - return lookup.unreflect(method); - - } catch (Throwable t) { - log.debug( - LogCollector.EXCLUDE_TELEMETRY, - "Could not get method {} accepting {} from class {}", - methodName, - Arrays.toString(parameterTypes), - clazz, - t); - return null; - } - }); + return AccessController.doPrivileged((PrivilegedAction) () -> { + try { + try { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + String packageName = clazz.getPackage().getName(); + sm.checkPackageAccess(packageName); + } + } catch (UnsupportedOperationException e) { + // ignore + } + + Method method = clazz.getDeclaredMethod(methodName, parameterTypes); + method.setAccessible(true); + return lookup.unreflect(method); + + } catch (Throwable t) { + log.debug( + LogCollector.EXCLUDE_TELEMETRY, + "Could not get method {} accepting {} from class {}", + methodName, + Arrays.toString(parameterTypes), + clazz, + t); + return null; + } + }); } public MethodHandle method(Class clazz, Predicate filter) { - return AccessController.doPrivileged( - (PrivilegedAction) - () -> { - try { - try { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - String packageName = clazz.getPackage().getName(); - sm.checkPackageAccess(packageName); - } - } catch (UnsupportedOperationException e) { - // ignore - } - - Method[] methods = clazz.getDeclaredMethods(); - for (Method method : methods) { - if (filter.test(method)) { - method.setAccessible(true); - return lookup.unreflect(method); - } - } - - log.debug("Could not find desired method in class {}", clazz); - return null; - - } catch (Throwable t) { - log.debug( - LogCollector.EXCLUDE_TELEMETRY, - "Could not find desired method in class {}", - clazz, - t); - return null; - } - }); + return AccessController.doPrivileged((PrivilegedAction) () -> { + try { + try { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + String packageName = clazz.getPackage().getName(); + sm.checkPackageAccess(packageName); + } + } catch (UnsupportedOperationException e) { + // ignore + } + + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (filter.test(method)) { + method.setAccessible(true); + return lookup.unreflect(method); + } + } + + log.debug("Could not find desired method in class {}", clazz); + return null; + + } catch (Throwable t) { + log.debug( + LogCollector.EXCLUDE_TELEMETRY, "Could not find desired method in class {}", clazz, t); + return null; + } + }); } private Class loadClass(String className) { diff --git a/internal-api/src/main/java/datadog/trace/util/PidHelper.java b/internal-api/src/main/java/datadog/trace/util/PidHelper.java index 887dd3900e8..d1b8fc8729d 100644 --- a/internal-api/src/main/java/datadog/trace/util/PidHelper.java +++ b/internal-api/src/main/java/datadog/trace/util/PidHelper.java @@ -43,13 +43,11 @@ private static String findPid() { String pid = ""; if (JavaVirtualMachine.isJavaVersionAtLeast(9)) { try { - pid = - ((Supplier) - Class.forName("datadog.trace.util.JDK9PidSupplier") - .getDeclaredConstructor() - .newInstance()) - .get() - .trim(); + pid = ((Supplier) Class.forName("datadog.trace.util.JDK9PidSupplier") + .getDeclaredConstructor() + .newInstance()) + .get() + .trim(); } catch (Throwable e) { log.debug("JDK9PidSupplier not available", e); } @@ -93,10 +91,9 @@ private static String getTempDir() { } else { try { https: // github.com/eclipse-openj9/openj9/blob/196082df056a990756a5571bfac29585fbbfbb42/jcl/src/java.base/share/classes/openj9/internal/tools/attach/target/IPC.java#L351 - return (String) - Class.forName("openj9.internal.tools.attach.target.IPC") - .getDeclaredMethod("getTmpDir") - .invoke(null); + return (String) Class.forName("openj9.internal.tools.attach.target.IPC") + .getDeclaredMethod("getTmpDir") + .invoke(null); } catch (Throwable t) { // Fall back to constants based on J9 source code, may not have perfect coverage String tmpDir = SystemProperties.get("java.io.tmpdir"); @@ -129,29 +126,28 @@ public static Set getJavaPids() { return stream .map(Path::getFileName) .map(Path::toString) - .filter( - (name) -> { - // On J9, additional metadata files are present alongside files named $PID. - // Additionally, the contents of the ps dir are files with process ID files for - // Hotspot, - // but they are directories for J9. - // This also makes sense as defensive programming. - if (name.isEmpty()) { - return false; - } - char c = name.charAt(0); - if (c < '0' || c > '9') { - // Short-circuit - let's not parse as long something that is definitely not a long - // number - return false; - } - long pid = -1; - try { - pid = Long.parseLong(name); - } catch (NumberFormatException ignored) { - } - return pid != -1; - }) + .filter((name) -> { + // On J9, additional metadata files are present alongside files named $PID. + // Additionally, the contents of the ps dir are files with process ID files for + // Hotspot, + // but they are directories for J9. + // This also makes sense as defensive programming. + if (name.isEmpty()) { + return false; + } + char c = name.charAt(0); + if (c < '0' || c > '9') { + // Short-circuit - let's not parse as long something that is definitely not a long + // number + return false; + } + long pid = -1; + try { + pid = Long.parseLong(name); + } catch (NumberFormatException ignored) { + } + return pid != -1; + }) .collect(Collectors.toSet()); } catch (IOException e) { log.debug("Unable to obtain Java PIDs", e); diff --git a/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java b/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java index 1a1e41c1f91..d0bdab8af3a 100644 --- a/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java +++ b/internal-api/src/main/java/datadog/trace/util/ProcessUtils.java @@ -33,10 +33,9 @@ public static String getCurrentJvmPath() { if (JavaVirtualMachine.isJavaVersionAtLeast(9)) { try { Supplier jdk9Supplier = - (Supplier) - Class.forName("datadog.trace.util.JDK9ExecutableSupplier") - .getDeclaredConstructor() - .newInstance(); + (Supplier) Class.forName("datadog.trace.util.JDK9ExecutableSupplier") + .getDeclaredConstructor() + .newInstance(); return jdk9Supplier.get(); } catch (Throwable e) { log.debug("Could not get process executable path using JDK9ExecutableSupplier", e); diff --git a/internal-api/src/main/java/datadog/trace/util/PropagationUtils.java b/internal-api/src/main/java/datadog/trace/util/PropagationUtils.java index 19f08ac7778..34a7020441f 100644 --- a/internal-api/src/main/java/datadog/trace/util/PropagationUtils.java +++ b/internal-api/src/main/java/datadog/trace/util/PropagationUtils.java @@ -12,22 +12,20 @@ private PropagationUtils() { /** The list of the known propagation headers. They must be lowercased. */ public static final Collection KNOWN_PROPAGATION_HEADERS = - Collections.unmodifiableCollection( - new LinkedHashSet<>( - Arrays.asList( - // W3C headers - "traceparent", - "tracestate", - // DD headers - "x-datadog-trace-id", - "x-datadog-parent-id", - "x-datadog-sampling-priority", - "x-datadog-origin", - "x-datadog-tags", - // B3 single headers - "x-b3-traceid", - "x-b3-spanid", - "x-b3-sampled", - // B3 multi header - "b3"))); + Collections.unmodifiableCollection(new LinkedHashSet<>(Arrays.asList( + // W3C headers + "traceparent", + "tracestate", + // DD headers + "x-datadog-trace-id", + "x-datadog-parent-id", + "x-datadog-sampling-priority", + "x-datadog-origin", + "x-datadog-tags", + // B3 single headers + "x-b3-traceid", + "x-b3-spanid", + "x-b3-sampled", + // B3 multi header + "b3"))); } diff --git a/internal-api/src/main/java/datadog/trace/util/StringIndex.java b/internal-api/src/main/java/datadog/trace/util/StringIndex.java index 868558e0c38..34ec7b2d7c3 100644 --- a/internal-api/src/main/java/datadog/trace/util/StringIndex.java +++ b/internal-api/src/main/java/datadog/trace/util/StringIndex.java @@ -216,14 +216,13 @@ public static int capacityFor(int n, float loadFactor) { } double min = Math.ceil(n / (double) loadFactor); if (min > MAX_CAPACITY) { - throw new IllegalArgumentException( - "capacity for n=" - + n - + " at loadFactor=" - + loadFactor - + " exceeds maximum capacity (" - + MAX_CAPACITY - + ")"); + throw new IllegalArgumentException("capacity for n=" + + n + + " at loadFactor=" + + loadFactor + + " exceeds maximum capacity (" + + MAX_CAPACITY + + ")"); } return Integer.highestOneBit((int) min - 1) << 1; } diff --git a/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java b/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java index bbdcedadfa6..582aa207b32 100644 --- a/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java +++ b/internal-api/src/main/java/datadog/trace/util/TempLocationManager.java @@ -212,14 +212,13 @@ boolean await(long timeout, TimeUnit unit) throws Throwable { } } - private static final Set GROUP_WORLD_BITS = - EnumSet.of( - PosixFilePermission.GROUP_READ, - PosixFilePermission.GROUP_WRITE, - PosixFilePermission.GROUP_EXECUTE, - PosixFilePermission.OTHERS_READ, - PosixFilePermission.OTHERS_WRITE, - PosixFilePermission.OTHERS_EXECUTE); + private static final Set GROUP_WORLD_BITS = EnumSet.of( + PosixFilePermission.GROUP_READ, + PosixFilePermission.GROUP_WRITE, + PosixFilePermission.GROUP_EXECUTE, + PosixFilePermission.OTHERS_READ, + PosixFilePermission.OTHERS_WRITE, + PosixFilePermission.OTHERS_EXECUTE); private final boolean isPosixFs; private final Path baseTempDir; @@ -288,22 +287,17 @@ private TempLocationManager() { // this processing will not take longer than another `PROFILING_UPLOAD_PERIOD' seconds. // This is just an assumption but as long as the profiled application is working normally (eg. // OS is not stalling) this assumption will hold. - cutoffSeconds = - configProvider.getLong( - ProfilingConfig.PROFILING_UPLOAD_PERIOD, - ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT); - Path configuredTempDir = - Paths.get( - configProvider.getString( - ProfilingConfig.PROFILING_TEMP_DIR, ProfilingConfig.PROFILING_TEMP_DIR_DEFAULT)); + cutoffSeconds = configProvider.getLong( + ProfilingConfig.PROFILING_UPLOAD_PERIOD, ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT); + Path configuredTempDir = Paths.get(configProvider.getString( + ProfilingConfig.PROFILING_TEMP_DIR, ProfilingConfig.PROFILING_TEMP_DIR_DEFAULT)); if (!Files.exists(configuredTempDir)) { ProfilerFlareLogger.getInstance() .log("Base temp directory, as defined in '{}' does not exist.", configuredTempDir); - throw new IllegalStateException( - "Base temp directory, as defined in '" - + ProfilingConfig.PROFILING_TEMP_DIR - + "' does not exist: " - + configuredTempDir); + throw new IllegalStateException("Base temp directory, as defined in '" + + ProfilingConfig.PROFILING_TEMP_DIR + + "' does not exist: " + + configuredTempDir); } String pid = PidHelper.getPid(); @@ -396,10 +390,8 @@ boolean cleanup(long timeout, TimeUnit unit) { return true; } try (Stream paths = Files.walk(baseTempDir)) { - if (paths.noneMatch( - path -> - Files.isDirectory(path) - && path.getFileName().toString().startsWith(TEMPDIR_PREFIX))) { + if (paths.noneMatch(path -> + Files.isDirectory(path) && path.getFileName().toString().startsWith(TEMPDIR_PREFIX))) { // nothing to clean up; bail out early return true; } @@ -519,40 +511,37 @@ private void createTempDir(Path tempDir) { Path root = baseTempDir.resolve(baseTempDir.relativize(tempDir).getName(0)); try { AtomicReference failed = new AtomicReference<>(); - Files.walkFileTree( - root, - new FileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - Set perms = Files.getPosixFilePermissions(dir); - if (!perms.contains(PosixFilePermission.OWNER_READ) - || !perms.contains(PosixFilePermission.OWNER_WRITE) - || !perms.contains(PosixFilePermission.OWNER_EXECUTE)) { - failed.set(dir); - return FileVisitResult.TERMINATE; - } - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - return FileVisitResult.SKIP_SIBLINGS; - } - - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) - throws IOException { - return FileVisitResult.TERMINATE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) - throws IOException { - return FileVisitResult.CONTINUE; - } - }); + Files.walkFileTree(root, new FileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + Set perms = Files.getPosixFilePermissions(dir); + if (!perms.contains(PosixFilePermission.OWNER_READ) + || !perms.contains(PosixFilePermission.OWNER_WRITE) + || !perms.contains(PosixFilePermission.OWNER_EXECUTE)) { + failed.set(dir); + return FileVisitResult.TERMINATE; + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) + throws IOException { + return FileVisitResult.SKIP_SIBLINGS; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.TERMINATE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) + throws IOException { + return FileVisitResult.CONTINUE; + } + }); Path failedDir = failed.get(); if (failedDir != null) { diff --git a/internal-api/src/main/java/datadog/trace/util/json/JsonPathParser.java b/internal-api/src/main/java/datadog/trace/util/json/JsonPathParser.java index 4bb2218da49..e0f4f9bf632 100644 --- a/internal-api/src/main/java/datadog/trace/util/json/JsonPathParser.java +++ b/internal-api/src/main/java/datadog/trace/util/json/JsonPathParser.java @@ -62,10 +62,9 @@ public static JsonPath parse(String path) throws ParseError { while (cur.isWithinLimits()) { if (cur.is(OPEN_BRACKET)) { - boolean ok = - tryToParsePropertyInBrackets(cur, builder) - || tryToParseIndex(cur, builder) - || tryToParseWildcard(cur, builder); + boolean ok = tryToParsePropertyInBrackets(cur, builder) + || tryToParseIndex(cur, builder) + || tryToParseWildcard(cur, builder); if (!ok) { cur.fail("Expecting in brackets a property, an array index, or a wildcard."); } @@ -189,10 +188,9 @@ private static boolean tryToParsePropertyInBrackets(Cursor cur, JsonPath.Builder if (ESC == c) { cur.failAt(readPosition, "Escape character is not supported in property name."); } else if (c == COMMA) { - String message = - inProperty - ? "Comma is not allowed in property name." - : "Multiple properties are not supported."; + String message = inProperty + ? "Comma is not allowed in property name." + : "Multiple properties are not supported."; cur.failAt(readPosition, message); } else if (c == CLOSE_BRACKET && !inProperty) { break; diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java index 6621478b502..38aa97f52a1 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java @@ -7,7 +7,8 @@ import java.util.stream.StreamSupport; public class HotSpotStackWalker extends AbstractStackWalker { - @SuppressForbidden sun.misc.JavaLangAccess access; + @SuppressForbidden + sun.misc.JavaLangAccess access; @SuppressForbidden HotSpotStackWalker() { diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceEvent.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceEvent.java index 363a9dca1c8..03fab9c4177 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceEvent.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceEvent.java @@ -8,10 +8,17 @@ public class StackTraceEvent { public static final String DEFAULT_LANGUAGE = "java"; - @Nullable private final String language; - @Nullable private final String id; - @Nullable private final String message; - @Nonnull private final List frames; + @Nullable + private final String language; + + @Nullable + private final String id; + + @Nullable + private final String message; + + @Nonnull + private final List frames; public StackTraceEvent( @Nonnull final List frames, diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceFrame.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceFrame.java index 0e1f385596c..d20bbdf8ab2 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceFrame.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackTraceFrame.java @@ -7,11 +7,20 @@ public class StackTraceFrame { // Unsigned integer: index of the stack frame (0 = top of stack) private final int id; // Raw stack frame - @Nullable private final String text; - @Nullable private final String file; - @Nullable private final Integer line; - @Nullable private final String class_name; - @Nullable private final String function; + @Nullable + private final String text; + + @Nullable + private final String file; + + @Nullable + private final Integer line; + + @Nullable + private final String class_name; + + @Nullable + private final String function; public StackTraceFrame(final int id, final StackTraceElement element) { this.id = id; diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackUtils.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackUtils.java index 35ad5151054..992dc5c44f1 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackUtils.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackUtils.java @@ -45,19 +45,17 @@ public static E filterFirstDatadog(final E exception) { public static E filterUntil( final E exception, final Predicate trace) { - return update( - exception, - stack -> { - final StackTraceElement[] source = exception.getStackTrace(); - for (int i = 0; i < source.length; i++) { - if (trace.test(source[i])) { - final StackTraceElement[] result = new StackTraceElement[source.length - i - 1]; - System.arraycopy(source, i + 1, result, 0, result.length); - return result; - } - } - return source; - }); + return update(exception, stack -> { + final StackTraceElement[] source = exception.getStackTrace(); + for (int i = 0; i < source.length; i++) { + if (trace.test(source[i])) { + final StackTraceElement[] result = new StackTraceElement[source.length - i - 1]; + System.arraycopy(source, i + 1, result, 0, result.length); + return result; + } + } + return source; + }); } public static List generateUserCodeStackTrace() { @@ -68,10 +66,8 @@ public static List generateUserCodeStackTrace() { public static List generateUserCodeStackTrace( final Predicate filterPredicate) { int stackCapacity = Config.get().getAppSecMaxStackTraceDepth(); - List elements = - StackWalkerFactory.INSTANCE.walk( - stream -> - stream.filter(filterPredicate).limit(stackCapacity).collect(Collectors.toList())); + List elements = StackWalkerFactory.INSTANCE.walk( + stream -> stream.filter(filterPredicate).limit(stackCapacity).collect(Collectors.toList())); return IntStream.range(0, elements.size()) .mapToObj(idx -> new StackTraceFrame(idx, elements.get(idx))) .collect(Collectors.toList()); @@ -81,9 +77,8 @@ public static void addStacktraceEventsToMetaStruct( final RequestContext reqCtx, final String productKey, final List events) { final Map> stackTraceBatch = reqCtx.getOrCreateMetaStructTop(META_STRUCT_KEY, k -> new ConcurrentHashMap<>()); - final List list = - stackTraceBatch.computeIfAbsent( - productKey, k -> Collections.synchronizedList(new ArrayList<>())); + final List list = stackTraceBatch.computeIfAbsent( + productKey, k -> Collections.synchronizedList(new ArrayList<>())); list.addAll(events); } diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java index bd9357260d9..0b1c5cdc5ba 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/StackWalkerFactory.java @@ -17,12 +17,11 @@ public class StackWalkerFactory { static { Stream stream = Stream.of(hotspot(), jdk9()).map(Supplier::get); - INSTANCE = - stream - .filter(Objects::nonNull) - .filter(StackWalker::isEnabled) - .findFirst() - .orElseGet(defaultStackWalker()); + INSTANCE = stream + .filter(Objects::nonNull) + .filter(StackWalker::isEnabled) + .findFirst() + .orElseGet(defaultStackWalker()); } private static Supplier defaultStackWalker() { @@ -44,10 +43,9 @@ private static Supplier jdk9() { return null; } try { - return (StackWalker) - Class.forName("datadog.trace.util.stacktrace.JDK9StackWalker") - .getDeclaredConstructor() - .newInstance(); + return (StackWalker) Class.forName("datadog.trace.util.stacktrace.JDK9StackWalker") + .getDeclaredConstructor() + .newInstance(); } catch (Throwable e) { LOGGER.warn("JDK9StackWalker not available", e); return null; diff --git a/internal-api/src/test/java/datadog/trace/api/TagMapBucketGroupTest.java b/internal-api/src/test/java/datadog/trace/api/TagMapBucketGroupTest.java index 477a5ae58d8..89c1b530cc8 100644 --- a/internal-api/src/test/java/datadog/trace/api/TagMapBucketGroupTest.java +++ b/internal-api/src/test/java/datadog/trace/api/TagMapBucketGroupTest.java @@ -19,10 +19,9 @@ public void newGroup() { int firstHash = firstEntry.hash(); int secondHash = secondEntry.hash(); - TagMap.BucketGroup group = - new TagMap.BucketGroup( - firstHash, firstEntry, - secondHash, secondEntry); + TagMap.BucketGroup group = new TagMap.BucketGroup( + firstHash, firstEntry, + secondHash, secondEntry); assertEquals(firstHash, group._hashAt(0)); assertEquals(firstEntry, group._entryAt(0)); @@ -111,10 +110,9 @@ public void _remove() { int firstHash = firstEntry.hash(); int secondHash = secondEntry.hash(); - TagMap.BucketGroup group = - new TagMap.BucketGroup( - firstHash, firstEntry, - secondHash, secondEntry); + TagMap.BucketGroup group = new TagMap.BucketGroup( + firstHash, firstEntry, + secondHash, secondEntry); assertFalse(group._isEmpty()); diff --git a/internal-api/src/test/java/datadog/trace/api/TagMapEntryTest.java b/internal-api/src/test/java/datadog/trace/api/TagMapEntryTest.java index e7c483e80ec..989884ab80b 100644 --- a/internal-api/src/test/java/datadog/trace/api/TagMapEntryTest.java +++ b/internal-api/src/test/java/datadog/trace/api/TagMapEntryTest.java @@ -60,13 +60,12 @@ public void createObject() { test( () -> TagMap.Entry.create("foo", map), TagMap.Entry.ANY, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(map, entry), - checkTrue(entry::isObject), - checkFalse(entry::isNumber), - checkType(TagMap.Entry.OBJECT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(map, entry), + checkTrue(entry::isObject), + checkFalse(entry::isNumber), + checkType(TagMap.Entry.OBJECT, entry))); } @Test @@ -81,14 +80,13 @@ public void createCharSequence() { test( () -> TagMap.Entry.create("foo", "bar"), TagMap.Entry.OBJECT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue("bar", entry), - checkEquals("bar", entry::stringValue), - checkFalse(entry::isNumber), - checkTrue(entry::isObject), - checkType(TagMap.Entry.OBJECT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue("bar", entry), + checkEquals("bar", entry::stringValue), + checkFalse(entry::isNumber), + checkTrue(entry::isObject), + checkType(TagMap.Entry.OBJECT, entry))); } @Test @@ -108,14 +106,13 @@ public void newObjectEntry() { test( () -> TagMap.Entry.newObjectEntry("foo", "bar"), TagMap.Entry.OBJECT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue("bar", entry), - checkEquals("bar", entry::stringValue), - checkFalse(entry::isNumber), - checkTrue(entry::isObject), - checkType(TagMap.Entry.OBJECT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue("bar", entry), + checkEquals("bar", entry::stringValue), + checkFalse(entry::isNumber), + checkTrue(entry::isObject), + checkType(TagMap.Entry.OBJECT, entry))); } @Test @@ -124,13 +121,12 @@ public void anyEntryObject() { test( () -> TagMap.Entry.newAnyEntry("foo", "bar"), TagMap.Entry.ANY, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue("bar", entry), - checkTrue(entry::isObject), - checkFalse(entry::isNumber), - checkType(TagMap.EntryReader.OBJECT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue("bar", entry), + checkTrue(entry::isObject), + checkFalse(entry::isNumber), + checkType(TagMap.EntryReader.OBJECT, entry))); } @ParameterizedTest @@ -140,14 +136,13 @@ public void createBoolean(boolean value) { test( () -> TagMap.Entry.create("foo", value), TagMap.Entry.BOOLEAN, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkFalse(entry::isNumericPrimitive), - checkFalse(entry::isNumber), - checkFalse(entry::isObject), - checkType(TagMap.Entry.BOOLEAN, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkFalse(entry::isNumericPrimitive), + checkFalse(entry::isNumber), + checkFalse(entry::isObject), + checkType(TagMap.Entry.BOOLEAN, entry))); } @ParameterizedTest @@ -157,14 +152,13 @@ public void newBooleanEntry(boolean value) { test( () -> TagMap.Entry.create("foo", value), TagMap.Entry.BOOLEAN, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkFalse(entry::isNumericPrimitive), - checkFalse(entry::isNumber), - checkFalse(entry::isObject), - checkType(TagMap.Entry.BOOLEAN, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkFalse(entry::isNumericPrimitive), + checkFalse(entry::isNumber), + checkFalse(entry::isObject), + checkType(TagMap.Entry.BOOLEAN, entry))); } @ParameterizedTest @@ -174,14 +168,13 @@ public void newBooleanEntryBoxed(boolean value) { test( () -> TagMap.Entry.newBooleanEntry("foo", Boolean.valueOf(value)), TagMap.Entry.BOOLEAN, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkFalse(entry::isNumericPrimitive), - checkFalse(entry::isNumber), - checkFalse(entry::isObject), - checkType(TagMap.Entry.BOOLEAN, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkFalse(entry::isNumericPrimitive), + checkFalse(entry::isNumber), + checkFalse(entry::isObject), + checkType(TagMap.Entry.BOOLEAN, entry))); } @ParameterizedTest @@ -191,15 +184,14 @@ public void newAnyEntryBoolean(boolean value) { test( () -> TagMap.Entry.newAnyEntry("foo", Boolean.valueOf(value)), TagMap.Entry.ANY, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkFalse(entry::isNumericPrimitive), - checkFalse(entry::isNumber), - checkFalse(entry::isObject), - checkType(TagMap.Entry.BOOLEAN, entry), - checkValue(value, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkFalse(entry::isNumericPrimitive), + checkFalse(entry::isNumber), + checkFalse(entry::isObject), + checkType(TagMap.Entry.BOOLEAN, entry), + checkValue(value, entry))); } @ParameterizedTest @@ -209,13 +201,12 @@ public void createInt(int value) { test( () -> TagMap.Entry.create("foo", value), TagMap.Entry.INT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkInstanceOf(Number.class, entry), - checkType(TagMap.Entry.INT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkInstanceOf(Number.class, entry), + checkType(TagMap.Entry.INT, entry))); } @ParameterizedTest @@ -225,13 +216,12 @@ public void newIntEntry(int value) { test( () -> TagMap.Entry.newIntEntry("foo", value), TagMap.Entry.INT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkInstanceOf(Number.class, entry), - checkType(TagMap.Entry.INT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkInstanceOf(Number.class, entry), + checkType(TagMap.Entry.INT, entry))); } @ParameterizedTest @@ -241,13 +231,12 @@ public void newIntEntryBoxed(int value) { test( () -> TagMap.Entry.newIntEntry("foo", Integer.valueOf(value)), TagMap.Entry.INT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkInstanceOf(Number.class, entry), - checkType(TagMap.Entry.INT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkInstanceOf(Number.class, entry), + checkType(TagMap.Entry.INT, entry))); } @ParameterizedTest @@ -257,13 +246,12 @@ public void newIntEntryBoxedShort(short value) { test( () -> TagMap.Entry.newIntEntry("foo", Short.valueOf(value)), TagMap.Entry.INT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkInstanceOf(Number.class, entry), - checkType(TagMap.Entry.INT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkInstanceOf(Number.class, entry), + checkType(TagMap.Entry.INT, entry))); } @ParameterizedTest @@ -273,13 +261,12 @@ public void newIntEntryBoxedByte(byte value) { test( () -> TagMap.Entry.newIntEntry("foo", Byte.valueOf(value)), TagMap.Entry.INT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkInstanceOf(Number.class, entry), - checkType(TagMap.Entry.INT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkInstanceOf(Number.class, entry), + checkType(TagMap.Entry.INT, entry))); } @ParameterizedTest @@ -289,14 +276,13 @@ public void newAnyEntryInteger(int value) { test( () -> TagMap.Entry.newAnyEntry("foo", Integer.valueOf(value)), TagMap.Entry.ANY, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkInstanceOf(Number.class, entry), - checkType(TagMap.Entry.INT, entry), - checkValue(value, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkInstanceOf(Number.class, entry), + checkType(TagMap.Entry.INT, entry), + checkValue(value, entry))); } @ParameterizedTest @@ -321,12 +307,11 @@ public void createLong(long value) { test( () -> TagMap.Entry.create("foo", value), TagMap.Entry.LONG, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkTrue(entry::isNumericPrimitive), - checkType(TagMap.Entry.LONG, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkTrue(entry::isNumericPrimitive), + checkType(TagMap.Entry.LONG, entry))); } @ParameterizedTest @@ -351,12 +336,11 @@ public void newLongEntry(long value) { test( () -> TagMap.Entry.newLongEntry("foo", value), TagMap.Entry.LONG, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkTrue(entry::isNumericPrimitive), - checkType(TagMap.Entry.LONG, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkTrue(entry::isNumericPrimitive), + checkType(TagMap.Entry.LONG, entry))); } @ParameterizedTest @@ -381,12 +365,11 @@ public void newLongEntryBoxed(long value) { test( () -> TagMap.Entry.newLongEntry("foo", Long.valueOf(value)), TagMap.Entry.LONG, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkType(TagMap.Entry.LONG, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkType(TagMap.Entry.LONG, entry))); } @ParameterizedTest @@ -411,13 +394,12 @@ public void newAnyEntryLong(long value) { test( () -> TagMap.Entry.newAnyEntry("foo", Long.valueOf(value)), TagMap.Entry.ANY, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkTrue(() -> entry.is(TagMap.Entry.LONG)), - checkValue(value, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkTrue(() -> entry.is(TagMap.Entry.LONG)), + checkValue(value, entry))); } @ParameterizedTest @@ -427,12 +409,11 @@ public void createFloat(float value) { test( () -> TagMap.Entry.create("foo", value), TagMap.Entry.FLOAT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkTrue(entry::isNumericPrimitive), - checkType(TagMap.Entry.FLOAT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkTrue(entry::isNumericPrimitive), + checkType(TagMap.Entry.FLOAT, entry))); } @ParameterizedTest @@ -442,12 +423,11 @@ public void newFloatEntry(float value) { test( () -> TagMap.Entry.newFloatEntry("foo", value), TagMap.Entry.FLOAT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkTrue(entry::isNumericPrimitive), - checkType(TagMap.Entry.FLOAT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkTrue(entry::isNumericPrimitive), + checkType(TagMap.Entry.FLOAT, entry))); } @ParameterizedTest @@ -457,12 +437,11 @@ public void newFloatEntryBoxed(float value) { test( () -> TagMap.Entry.newFloatEntry("foo", Float.valueOf(value)), TagMap.Entry.FLOAT, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkType(TagMap.Entry.FLOAT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkType(TagMap.Entry.FLOAT, entry))); } @ParameterizedTest @@ -472,12 +451,11 @@ public void newAnyEntryFloat(float value) { test( () -> TagMap.Entry.newAnyEntry("foo", Float.valueOf(value)), TagMap.Entry.ANY, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkTrue(entry::isNumericPrimitive), - checkType(TagMap.Entry.FLOAT, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkTrue(entry::isNumericPrimitive), + checkType(TagMap.Entry.FLOAT, entry))); } @ParameterizedTest @@ -488,12 +466,11 @@ public void createDouble(double value) { test( () -> TagMap.Entry.create("foo", value), TagMap.Entry.DOUBLE, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkType(TagMap.Entry.DOUBLE, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkType(TagMap.Entry.DOUBLE, entry))); } @ParameterizedTest @@ -503,12 +480,11 @@ public void newDoubleEntry(double value) { test( () -> TagMap.Entry.newDoubleEntry("foo", value), TagMap.Entry.DOUBLE, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkIsNumericPrimitive(entry), - checkType(TagMap.Entry.DOUBLE, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkIsNumericPrimitive(entry), + checkType(TagMap.Entry.DOUBLE, entry))); } @ParameterizedTest @@ -519,12 +495,11 @@ public void newDoubleEntryBoxed(double value) { test( () -> TagMap.Entry.newDoubleEntry("foo", Double.valueOf(value)), TagMap.Entry.DOUBLE, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkTrue(entry::isNumericPrimitive), - checkType(TagMap.Entry.DOUBLE, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkTrue(entry::isNumericPrimitive), + checkType(TagMap.Entry.DOUBLE, entry))); } @ParameterizedTest @@ -535,13 +510,12 @@ public void newAnyEntryDouble(double value) { test( () -> TagMap.Entry.newAnyEntry("foo", Double.valueOf(value)), TagMap.Entry.ANY, - (entry) -> - multiCheck( - checkKey("foo", entry), - checkValue(value, entry), - checkTrue(entry::isNumericPrimitive), - checkType(TagMap.Entry.DOUBLE, entry), - checkValue(value, entry))); + (entry) -> multiCheck( + checkKey("foo", entry), + checkValue(value, entry), + checkTrue(entry::isNumericPrimitive), + checkType(TagMap.Entry.DOUBLE, entry), + checkValue(value, entry))); } @Test @@ -552,27 +526,24 @@ public void removalChange() { static final int NUM_THREADS = 4; static final ExecutorService EXECUTOR = - Executors.newFixedThreadPool( - NUM_THREADS, - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread thread = new Thread(r, "multithreaded-test-runner"); - thread.setDaemon(true); - return thread; - } - }); + Executors.newFixedThreadPool(NUM_THREADS, new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r, "multithreaded-test-runner"); + thread.setDaemon(true); + return thread; + } + }); static final void test( Supplier entrySupplier, byte rawType, Function checkSupplier) { - Function combinedCheckSupplier = - (entry) -> { - return multiCheck( - checkSupplier.apply(entry), - checkSame(entry, entry.entry()), - checkSame(entry, entry.mapEntry())); - }; + Function combinedCheckSupplier = (entry) -> { + return multiCheck( + checkSupplier.apply(entry), + checkSame(entry, entry.entry()), + checkSame(entry, entry.mapEntry())); + }; // repeat the test several times to exercise different orderings in this thread for (int i = 0; i < 10; ++i) { @@ -606,12 +577,11 @@ static final void testMultiThreaded( // Different shuffle for each thread Check shuffledChecks = checks.shuffle(); - callables.add( - () -> { - shuffledChecks.check(); + callables.add(() -> { + shuffledChecks.check(); - return null; - }); + return null; + }); } List> futures; diff --git a/internal-api/src/test/java/datadog/trace/api/TagMapFuzzTest.java b/internal-api/src/test/java/datadog/trace/api/TagMapFuzzTest.java index 685dc1d9cdf..10697ef2cfc 100644 --- a/internal-api/src/test/java/datadog/trace/api/TagMapFuzzTest.java +++ b/internal-api/src/test/java/datadog/trace/api/TagMapFuzzTest.java @@ -44,818 +44,814 @@ void testMerge() { @Test void priorFailingCase0() { - TagMap map = - makeTagMap( - remove("key-4"), - put("key-71", "values-443049055"), - put("key-2", "values-1227065898"), - put("key-25", "values-696891692"), - put("key-93", "values-763707175"), - put("key-23", "values--1514091210"), - put("key-16", "values--1388742686")); - - MapAction failingAction = - putAllTagMap( - "key-17", - "values--2085338893", - "key-51", - "values-960243765", - "key-33", - "values-1493544499", - "key-46", - "values-697926849", - "key-70", - "values--184054454", + TagMap map = makeTagMap( + remove("key-4"), + put("key-71", "values-443049055"), + put("key-2", "values-1227065898"), + put("key-25", "values-696891692"), + put("key-93", "values-763707175"), + put("key-23", "values--1514091210"), + put("key-16", "values--1388742686")); + + MapAction failingAction = putAllTagMap( + "key-17", + "values--2085338893", + "key-51", + "values-960243765", + "key-33", + "values-1493544499", + "key-46", + "values-697926849", + "key-70", + "values--184054454", + "key-67", + "values-374577326", + "key-9", + "values--742453833", + "key-11", + "values-1606950841", + "key-119", + "values--1914593057", + "key-53", + "values-375236438", + "key-96", + "values--107185569", + "key-47", + "values--1276407408", + "key-125", + "values--1627172151", + "key-110", + "values--1227150283", + "key-15", + "values-380379920", + "key-42", + "values--632271048", + "key-99", + "values--650090786", + "key-8", + "values--1990889145", + "key-103", + "values-1815698254", + "key-120", + "values-279025031", + "key-93", + "values-589795963", + "key-12", + "values--935895941", + "key-105", + "values-94976227", + "key-85", + "values--424609970", + "key-78", + "values-1231948102", + "key-115", + "values-88670282", + "key-26", + "values-733903384", + "key-100", + "values-2102967487", + "key-74", + "values-958598087", + "key-104", + "values-264458254", + "key-125", + "values--1781797927", + "key-27", + "values--562810078", + "key-7", + "values--376776745", + "key-111", + "values-263564677", + "key-50", + "values--859673100", + "key-57", + "values-1585057281", + "key-48", + "values--617889787", + "key-98", + "values--1878108220", + "key-9", + "values--227223375", + "key-59", + "values-1577082288", + "key-94", + "values--268049040", + "key-0", + "values-1708355496", + "key-62", + "values--733451297", + "key-14", + "values-232732747", + "key-4", + "values--406605642", + "key-58", + "values-1772476833", + "key-8", + "values--1155025225", + "key-101", + "values-144480545", + "key-66", + "values-355117269", + "key-121", + "values-1858008722", + "key-33", + "values-1947754079", + "key-1", + "values--1475603838", + "key-125", + "values--2146772243", + "key-117", + "values-852022714", + "key-53", + "values--2039348506", + "key-65", + "values-2011228657", + "key-108", + "values-1581592518", + "key-17", + "values-2129571020", + "key-5", + "values-1106900841", + "key-80", + "values-1791757923", + "key-18", + "values--1992962227", + "key-2", + "values-328863878", + "key-110", + "values-1182949334", + "key-5", + "values-1049403346", + "key-107", + "values-1246502060", + "key-115", + "values-2053931423", + "key-19", + "values--1731179633", + "key-104", + "values--1090790550", + "key-67", + "values--1312759979", + "key-10", + "values-1411135", + "key-109", + "values--1784920248", + "key-20", + "values--827644780", + "key-55", + "values--1610270998", + "key-60", + "values-1287959520", + "key-31", + "values-1686541667", + "key-41", + "values-399844058", + "key-115", + "values-2045201464", + "key-78", + "values-358081227", + "key-57", + "values--1374149269", + "key-65", + "values-1871734555", + "key-124", + "values--211494558", + "key-119", + "values-1757597102", + "key-32", + "values--336988038", + "key-85", + "values-1415155858", + "key-44", + "values-1455425178", + "key-48", + "values--325658059", + "key-68", + "values--793590840", + "key-96", + "values--2010766492", + "key-40", + "values-2007171160", + "key-29", + "values-186945230", + "key-63", + "values-1741962849", + "key-26", + "values-948582805", + "key-31", + "values-47004766", + "key-90", + "values-1304302008", + "key-69", + "values-2120328211", + "key-111", + "values-2053321468", + "key-69", + "values--498524858", + "key-125", + "values--193004619", + "key-30", + "values--1142090845", + "key-15", + "values--1334900170", + "key-33", + "values-1011001500", + "key-55", + "values-452401605", + "key-18", + "values-1260118555", + "key-44", + "values--1109396459", + "key-2", + "values--555647718", + "key-61", + "values-1060742038", + "key-51", + "values--827099230", + "key-62", + "values--1443716296", + "key-16", + "values-534556355", + "key-81", + "values--787910427", + "key-20", + "values-1429697120", + "key-36", + "values--1775988293", + "key-66", + "values-624669635", + "key-25", + "values--684183265", + "key-26", + "values-293626449", + "key-91", + "values--1212867803", + "key-6", + "values-1778251481", + "key-83", + "values-1257370908", + "key-92", + "values--1120490028", + "key-111", + "values-9646496", + "key-90", + "values-1485206899"); + failingAction.applyToTestMap(map); + failingAction.verifyTestMap(map); + } + + @Test + void priorFailingCase1() { + TagMap map = makeTagMap(put("key-68", "values--37178328"), put("key-93", "values--2093086281")); + + MapAction failingAction = putAllTagMap( + "key-36", + "values--1951535044", + "key-59", + "values--1045985660", + "key-68", + "values-1270827526", + "key-65", + "values-440073158", + "key-91", + "values-954365843", + "key-75", + "values-1014366449", + "key-117", + "values--1306617705", + "key-90", + "values-984567966", + "key-120", + "values--1802603599", + "key-56", + "values-319574488", + "key-78", + "values--711288173", + "key-103", + "values-694279462", + "key-84", + "values-1391260657", + "key-59", + "values--484807195", + "key-67", + "values-1675498322", + "key-91", + "values--227731796", + "key-105", + "values--1471022333", + "key-112", + "values--755617374", + "key-117", + "values--668324524", + "key-65", + "values-1165174761", + "key-13", + "values--1947081814", + "key-72", + "values-2032502631", + "key-106", + "values-256372025", + "key-71", + "values--995163162", + "key-92", + "values-972782926", + "key-116", + "values-25012447", + "key-23", + "values--979671053", + "key-94", + "values-367125724", + "key-48", + "values--2011523144", + "key-14", + "values-578926680", + "key-65", + "values-1325737627", + "key-89", + "values-1539092266", + "key-100", + "values--319629978", + "key-53", + "values-1125496255", + "key-2", + "values-1988036327", + "key-105", + "values--1333468536", + "key-37", + "values-351345678", + "key-4", + "values-683252782", + "key-62", + "values--1466612877", + "key-100", + "values-268100559", + "key-104", + "values-3517495", + "key-48", + "values--1588410835", + "key-42", + "values--180653405", + "key-118", + "values--1181647255", + "key-17", + "values-509279769", + "key-33", + "values-298668287", + "key-76", + "values-2062435628", + "key-18", + "values-287811864", + "key-46", + "values--1337930894", + "key-50", + "values-2089310564", + "key-24", + "values--1870293199", + "key-47", + "values--1155431370", + "key-81", + "values--1507929564", + "key-115", + "values-1149614815", + "key-57", + "values--334611395", + "key-86", + "values-146447703", + "key-107", + "values-938082683", + "key-38", + "values-338654203", + "key-40", + "values--376260149", + "key-20", + "values--860844060", + "key-20", + "values-2003129702", + "key-75", + "values--1787311067", + "key-39", + "values--1988768973", + "key-58", + "values--479797619", + "key-16", + "values-571033631", + "key-65", + "values--1867296166", + "key-56", + "values--2071960469", + "key-12", + "values-821930484", + "key-40", + "values--54692885", + "key-65", + "values-328817493", + "key-121", + "values-1276016318", + "key-33", + "values--2081652233", + "key-31", + "values-381335133", + "key-77", + "values-1486312656", + "key-48", + "values--1058365372", + "key-109", + "values--733344537", + "key-85", + "values-1236864082", + "key-35", + "values-2045087594", + "key-49", + "values-1990762822", + "key-38", + "values--1582706513", + "key-18", + "values--626997990", + "key-80", + "values--1995264473", + "key-126", + "values--558193472", + "key-83", + "values-415016167", + "key-53", + "values-1348674948", + "key-58", + "values-612738550", + "key-12", + "values-417676134", + "key-101", + "values--58098778", + "key-127", + "values-1658306930", + "key-17", + "values-985378289", + "key-68", + "values-686600535", + "key-36", + "values-365513638", + "key-87", + "values--1737233661", + "key-67", + "values--1840935230", + "key-8", + "values-540289596", + "key-11", + "values--2045114386", + "key-38", + "values--786598887", + "key-48", + "values-1877144385", + "key-5", + "values-65838542", + "key-18", + "values-263200779", + "key-120", + "values--1500947489", + "key-65", + "values-769990109", + "key-38", + "values-1886840000", + "key-29", + "values--48760205", + "key-61", + "values--1942966789"); + failingAction.applyToTestMap(map); + failingAction.verifyTestMap(map); + } + + @Test + void priorFailingCase2() { + TestCase testCase = new TestCase( + remove("key-34"), + put("key-122", "values-1828753938"), + putAll( + "key-123", + "values--118789056", + "key-28", + "values--751841781", + "key-105", + "values-1663318183", + "key-63", + "values--2036414463", + "key-74", + "values-1584612783", + "key-118", + "values--414681411", "key-67", - "values-374577326", - "key-9", - "values--742453833", - "key-11", - "values-1606950841", - "key-119", - "values--1914593057", - "key-53", - "values-375236438", - "key-96", - "values--107185569", - "key-47", - "values--1276407408", - "key-125", - "values--1627172151", + "values-1154668404", + "key-1", + "values--1755856616", + "key-89", + "values--344740102", "key-110", - "values--1227150283", - "key-15", - "values-380379920", - "key-42", - "values--632271048", - "key-99", - "values--650090786", - "key-8", - "values--1990889145", + "values-1884649283", + "key-1", + "values--1420345075", + "key-22", + "values-1951712698", "key-103", - "values-1815698254", - "key-120", - "values-279025031", - "key-93", - "values-589795963", - "key-12", - "values--935895941", + "values-488559164", + "key-8", + "values-1180668912", + "key-44", + "values-290310046", "key-105", - "values-94976227", - "key-85", - "values--424609970", - "key-78", - "values-1231948102", - "key-115", - "values-88670282", + "values--303926067", "key-26", - "values-733903384", - "key-100", - "values-2102967487", - "key-74", - "values-958598087", - "key-104", - "values-264458254", - "key-125", - "values--1781797927", - "key-27", - "values--562810078", - "key-7", - "values--376776745", - "key-111", - "values-263564677", - "key-50", - "values--859673100", - "key-57", - "values-1585057281", - "key-48", - "values--617889787", - "key-98", - "values--1878108220", - "key-9", - "values--227223375", + "values-910376351", "key-59", - "values-1577082288", - "key-94", - "values--268049040", - "key-0", - "values-1708355496", - "key-62", - "values--733451297", - "key-14", - "values-232732747", - "key-4", - "values--406605642", - "key-58", - "values-1772476833", - "key-8", - "values--1155025225", - "key-101", - "values-144480545", - "key-66", - "values-355117269", - "key-121", - "values-1858008722", - "key-33", - "values-1947754079", + "values-1600204544", + "key-23", + "values-425861746", + "key-76", + "values--1045446587", + "key-21", + "values-453905226", "key-1", - "values--1475603838", - "key-125", - "values--2146772243", - "key-117", - "values-852022714", - "key-53", - "values--2039348506", - "key-65", - "values-2011228657", - "key-108", - "values-1581592518", - "key-17", - "values-2129571020", - "key-5", - "values-1106900841", - "key-80", - "values-1791757923", - "key-18", - "values--1992962227", - "key-2", - "values-328863878", - "key-110", - "values-1182949334", - "key-5", - "values-1049403346", - "key-107", - "values-1246502060", - "key-115", - "values-2053931423", - "key-19", - "values--1731179633", - "key-104", - "values--1090790550", - "key-67", - "values--1312759979", - "key-10", - "values-1411135", - "key-109", - "values--1784920248", - "key-20", - "values--827644780", - "key-55", - "values--1610270998", - "key-60", - "values-1287959520", - "key-31", - "values-1686541667", - "key-41", - "values-399844058", - "key-115", - "values-2045201464", - "key-78", - "values-358081227", + "values-286624672", + "key-69", + "values-934359656", "key-57", - "values--1374149269", - "key-65", - "values-1871734555", - "key-124", - "values--211494558", - "key-119", - "values-1757597102", - "key-32", - "values--336988038", - "key-85", - "values-1415155858", - "key-44", - "values-1455425178", - "key-48", - "values--325658059", + "values--1890465763", + "key-13", + "values--1949062639", "key-68", - "values--793590840", - "key-96", - "values--2010766492", - "key-40", - "values-2007171160", - "key-29", - "values-186945230", - "key-63", - "values-1741962849", - "key-26", - "values-948582805", + "values-242077328", + "key-42", + "values--1584075743", + "key-46", + "values--1306318288", "key-31", - "values-47004766", - "key-90", - "values-1304302008", - "key-69", - "values-2120328211", - "key-111", - "values-2053321468", - "key-69", - "values--498524858", - "key-125", - "values--193004619", - "key-30", - "values--1142090845", - "key-15", - "values--1334900170", - "key-33", - "values-1011001500", - "key-55", - "values-452401605", + "values--848418043", + "key-71", + "values--1547961101", + "key-121", + "values--1493693636", + "key-24", + "values-330660358", + "key-24", + "values--1466871690", + "key-91", + "values--995064376", "key-18", - "values-1260118555", + "values-1615316779", + "key-124", + "values--296191510", + "key-52", + "values-740309054", + "key-8", + "values-1777392898", + "key-73", + "values-92831985", + "key-13", + "values--1711360891", + "key-114", + "values-1960346620", "key-44", - "values--1109396459", - "key-2", - "values--555647718", - "key-61", - "values-1060742038", - "key-51", - "values--827099230", - "key-62", - "values--1443716296", - "key-16", - "values-534556355", - "key-81", - "values--787910427", - "key-20", - "values-1429697120", - "key-36", - "values--1775988293", - "key-66", - "values-624669635", - "key-25", - "values--684183265", - "key-26", - "values-293626449", - "key-91", - "values--1212867803", - "key-6", - "values-1778251481", - "key-83", - "values-1257370908", - "key-92", - "values--1120490028", + "values--1599497099", + "key-107", + "values-668485357", + "key-116", + "values--1792788504"), + put("key-123", "values--1844485682"), + putAll( + "key-64", + "values--1694520036", + "key-17", + "values--469732912", + "key-79", + "values--1293521097", + "key-11", + "values--2000592955", + "key-98", + "values-517073723", + "key-28", + "values-1085152681", + "key-34", + "values-1943586726", + "key-3", + "values-216087991", + "key-97", + "values-222660872", + "key-41", + "values-90906196", + "key-63", + "values--934208984", + "key-57", + "values-327167184", "key-111", - "values-9646496", - "key-90", - "values-1485206899"); - failingAction.applyToTestMap(map); - failingAction.verifyTestMap(map); - } - - @Test - void priorFailingCase1() { - TagMap map = makeTagMap(put("key-68", "values--37178328"), put("key-93", "values--2093086281")); - - MapAction failingAction = - putAllTagMap( - "key-36", - "values--1951535044", - "key-59", - "values--1045985660", - "key-68", - "values-1270827526", - "key-65", - "values-440073158", - "key-91", - "values-954365843", + "values--1059115125", "key-75", - "values-1014366449", - "key-117", - "values--1306617705", + "values--2031064209", + "key-8", + "values-1924310140", + "key-69", + "values--362514182", "key-90", - "values-984567966", - "key-120", - "values--1802603599", - "key-56", - "values-319574488", - "key-78", - "values--711288173", - "key-103", - "values-694279462", - "key-84", - "values-1391260657", - "key-59", - "values--484807195", - "key-67", - "values-1675498322", - "key-91", - "values--227731796", - "key-105", - "values--1471022333", - "key-112", - "values--755617374", - "key-117", - "values--668324524", - "key-65", - "values-1165174761", - "key-13", - "values--1947081814", - "key-72", - "values-2032502631", + "values-852043703", + "key-98", + "values--998302860", + "key-49", + "values-1658920804", "key-106", - "values-256372025", - "key-71", - "values--995163162", - "key-92", - "values-972782926", - "key-116", - "values-25012447", - "key-23", - "values--979671053", - "key-94", - "values-367125724", - "key-48", - "values--2011523144", - "key-14", - "values-578926680", + "values--227162298", + "key-25", + "values-493046373", + "key-52", + "values--555623542", + "key-77", + "values--717275660", + "key-31", + "values-1930766287", + "key-69", + "values--1367213079", + "key-38", + "values--1112081116", "key-65", - "values-1325737627", - "key-89", - "values-1539092266", - "key-100", - "values--319629978", - "key-53", - "values-1125496255", - "key-2", - "values-1988036327", - "key-105", - "values--1333468536", - "key-37", - "values-351345678", + "values--1916889923", + "key-96", + "values-157036191", + "key-127", + "values--302553995", + "key-38", + "values-485874872", + "key-110", + "values--855874569", + "key-39", + "values--390829775", + "key-7", + "values--452123269", + "key-63", + "values--527204905", + "key-101", + "values-166173307", + "key-126", + "values-1050454498", "key-4", - "values-683252782", - "key-62", - "values--1466612877", - "key-100", - "values-268100559", - "key-104", - "values-3517495", - "key-48", - "values--1588410835", + "values--215188400", + "key-25", + "values-947961204", "key-42", - "values--180653405", - "key-118", - "values--1181647255", - "key-17", - "values-509279769", - "key-33", - "values-298668287", - "key-76", - "values-2062435628", - "key-18", - "values-287811864", - "key-46", - "values--1337930894", - "key-50", - "values-2089310564", + "values-145803888", + "key-1", + "values--970532578", + "key-43", + "values--1675493776", + "key-29", + "values-1193328809", + "key-108", + "values-1302659140", + "key-120", + "values--1722764270", "key-24", - "values--1870293199", - "key-47", - "values--1155431370", - "key-81", - "values--1507929564", - "key-115", - "values-1149614815", - "key-57", - "values--334611395", - "key-86", - "values-146447703", - "key-107", - "values-938082683", - "key-38", - "values-338654203", - "key-40", - "values--376260149", - "key-20", - "values--860844060", - "key-20", - "values-2003129702", - "key-75", - "values--1787311067", + "values--483238806", + "key-53", + "values-611589672", "key-39", - "values--1988768973", - "key-58", - "values--479797619", - "key-16", - "values-571033631", - "key-65", - "values--1867296166", - "key-56", - "values--2071960469", + "values--229429656", + "key-29", + "values--733337788", + "key-9", + "values-736222322", + "key-74", + "values--950770749", + "key-91", + "values-202817768", + "key-95", + "values-500260096", + "key-71", + "values--1798188865", "key-12", - "values-821930484", + "values--1936098297", + "key-28", + "values--2116134632", + "key-21", + "values-799594067", + "key-68", + "values--333178107", + "key-50", + "values-445767791", + "key-88", + "values-1307699662", + "key-69", + "values--110615017", + "key-25", + "values-699603233", + "key-101", + "values--2093413536", + "key-91", + "values--2022040839", + "key-45", + "values-888546703", "key-40", - "values--54692885", + "values--2140684954", + "key-1", + "values-371033654", + "key-68", + "values--20293415", + "key-59", + "values-697437101", + "key-43", + "values--1145022834", + "key-62", + "values--2125187195", + "key-15", + "values--1062944166", + "key-103", + "values--889634836", + "key-125", + "values-8694763", + "key-101", + "values--281475498", + "key-13", + "values-1972488719", + "key-32", + "values-1900833863", + "key-119", + "values--926978044", + "key-82", + "values-288820151", + "key-78", + "values--303310027", + "key-25", + "values--1284661437", + "key-47", + "values-1624726045", + "key-14", + "values-1658036950", "key-65", - "values-328817493", - "key-121", - "values-1276016318", - "key-33", - "values--2081652233", - "key-31", - "values-381335133", - "key-77", - "values-1486312656", - "key-48", - "values--1058365372", - "key-109", - "values--733344537", + "values-1629683219", + "key-10", + "values-275264679", + "key-126", + "values--592085694", + "key-32", + "values-1844385705", "key-85", - "values-1236864082", - "key-35", - "values-2045087594", + "values--1815321660", + "key-72", + "values-918231225", + "key-91", + "values-675699466", + "key-121", + "values--2008685332", + "key-61", + "values--1398921570", + "key-19", + "values-617817427", + "key-122", + "values--793708860", + "key-41", + "values--2027225350", + "key-41", + "values-1194206680", + "key-1", + "values-1116090448", "key-49", - "values-1990762822", + "values-1662444555", + "key-54", + "values-747436284", + "key-118", + "values--1367237858", + "key-65", + "values-133495093", + "key-73", + "values--1451855551", + "key-43", + "values--357794833", + "key-76", + "values-129403123", + "key-59", + "values--65688873", + "key-22", + "values-480031738", + "key-73", + "values--310815862", + "key-0", + "values--1734944386", + "key-56", + "values--540459893", "key-38", - "values--1582706513", - "key-18", - "values--626997990", - "key-80", - "values--1995264473", - "key-126", - "values--558193472", - "key-83", - "values-415016167", - "key-53", - "values-1348674948", - "key-58", - "values-612738550", - "key-12", - "values-417676134", - "key-101", - "values--58098778", - "key-127", - "values-1658306930", + "values-1308912555", + "key-2", + "values--2073028093", + "key-14", + "values--693713438", + "key-76", + "values-295450436", + "key-113", + "values--2065146687", + "key-0", + "values-2076623027", "key-17", - "values-985378289", - "key-68", - "values-686600535", - "key-36", - "values-365513638", - "key-87", - "values--1737233661", - "key-67", - "values--1840935230", - "key-8", - "values-540289596", - "key-11", - "values--2045114386", - "key-38", - "values--786598887", - "key-48", - "values-1877144385", + "values--1394046356", + "key-78", + "values--2014478659", "key-5", - "values-65838542", - "key-18", - "values-263200779", - "key-120", - "values--1500947489", - "key-65", - "values-769990109", - "key-38", - "values-1886840000", - "key-29", - "values--48760205", - "key-61", - "values--1942966789"); - failingAction.applyToTestMap(map); - failingAction.verifyTestMap(map); - } - - @Test - void priorFailingCase2() { - TestCase testCase = - new TestCase( - remove("key-34"), - put("key-122", "values-1828753938"), - putAll( - "key-123", - "values--118789056", - "key-28", - "values--751841781", - "key-105", - "values-1663318183", - "key-63", - "values--2036414463", - "key-74", - "values-1584612783", - "key-118", - "values--414681411", - "key-67", - "values-1154668404", - "key-1", - "values--1755856616", - "key-89", - "values--344740102", - "key-110", - "values-1884649283", - "key-1", - "values--1420345075", - "key-22", - "values-1951712698", - "key-103", - "values-488559164", - "key-8", - "values-1180668912", - "key-44", - "values-290310046", - "key-105", - "values--303926067", - "key-26", - "values-910376351", - "key-59", - "values-1600204544", - "key-23", - "values-425861746", - "key-76", - "values--1045446587", - "key-21", - "values-453905226", - "key-1", - "values-286624672", - "key-69", - "values-934359656", - "key-57", - "values--1890465763", - "key-13", - "values--1949062639", - "key-68", - "values-242077328", - "key-42", - "values--1584075743", - "key-46", - "values--1306318288", - "key-31", - "values--848418043", - "key-71", - "values--1547961101", - "key-121", - "values--1493693636", - "key-24", - "values-330660358", - "key-24", - "values--1466871690", - "key-91", - "values--995064376", - "key-18", - "values-1615316779", - "key-124", - "values--296191510", - "key-52", - "values-740309054", - "key-8", - "values-1777392898", - "key-73", - "values-92831985", - "key-13", - "values--1711360891", - "key-114", - "values-1960346620", - "key-44", - "values--1599497099", - "key-107", - "values-668485357", - "key-116", - "values--1792788504"), - put("key-123", "values--1844485682"), - putAll( - "key-64", - "values--1694520036", - "key-17", - "values--469732912", - "key-79", - "values--1293521097", - "key-11", - "values--2000592955", - "key-98", - "values-517073723", - "key-28", - "values-1085152681", - "key-34", - "values-1943586726", - "key-3", - "values-216087991", - "key-97", - "values-222660872", - "key-41", - "values-90906196", - "key-63", - "values--934208984", - "key-57", - "values-327167184", - "key-111", - "values--1059115125", - "key-75", - "values--2031064209", - "key-8", - "values-1924310140", - "key-69", - "values--362514182", - "key-90", - "values-852043703", - "key-98", - "values--998302860", - "key-49", - "values-1658920804", - "key-106", - "values--227162298", - "key-25", - "values-493046373", - "key-52", - "values--555623542", - "key-77", - "values--717275660", - "key-31", - "values-1930766287", - "key-69", - "values--1367213079", - "key-38", - "values--1112081116", - "key-65", - "values--1916889923", - "key-96", - "values-157036191", - "key-127", - "values--302553995", - "key-38", - "values-485874872", - "key-110", - "values--855874569", - "key-39", - "values--390829775", - "key-7", - "values--452123269", - "key-63", - "values--527204905", - "key-101", - "values-166173307", - "key-126", - "values-1050454498", - "key-4", - "values--215188400", - "key-25", - "values-947961204", - "key-42", - "values-145803888", - "key-1", - "values--970532578", - "key-43", - "values--1675493776", - "key-29", - "values-1193328809", - "key-108", - "values-1302659140", - "key-120", - "values--1722764270", - "key-24", - "values--483238806", - "key-53", - "values-611589672", - "key-39", - "values--229429656", - "key-29", - "values--733337788", - "key-9", - "values-736222322", - "key-74", - "values--950770749", - "key-91", - "values-202817768", - "key-95", - "values-500260096", - "key-71", - "values--1798188865", - "key-12", - "values--1936098297", - "key-28", - "values--2116134632", - "key-21", - "values-799594067", - "key-68", - "values--333178107", - "key-50", - "values-445767791", - "key-88", - "values-1307699662", - "key-69", - "values--110615017", - "key-25", - "values-699603233", - "key-101", - "values--2093413536", - "key-91", - "values--2022040839", - "key-45", - "values-888546703", - "key-40", - "values--2140684954", - "key-1", - "values-371033654", - "key-68", - "values--20293415", - "key-59", - "values-697437101", - "key-43", - "values--1145022834", - "key-62", - "values--2125187195", - "key-15", - "values--1062944166", - "key-103", - "values--889634836", - "key-125", - "values-8694763", - "key-101", - "values--281475498", - "key-13", - "values-1972488719", - "key-32", - "values-1900833863", - "key-119", - "values--926978044", - "key-82", - "values-288820151", - "key-78", - "values--303310027", - "key-25", - "values--1284661437", - "key-47", - "values-1624726045", - "key-14", - "values-1658036950", - "key-65", - "values-1629683219", - "key-10", - "values-275264679", - "key-126", - "values--592085694", - "key-32", - "values-1844385705", - "key-85", - "values--1815321660", - "key-72", - "values-918231225", - "key-91", - "values-675699466", - "key-121", - "values--2008685332", - "key-61", - "values--1398921570", - "key-19", - "values-617817427", - "key-122", - "values--793708860", - "key-41", - "values--2027225350", - "key-41", - "values-1194206680", - "key-1", - "values-1116090448", - "key-49", - "values-1662444555", - "key-54", - "values-747436284", - "key-118", - "values--1367237858", - "key-65", - "values-133495093", - "key-73", - "values--1451855551", - "key-43", - "values--357794833", - "key-76", - "values-129403123", - "key-59", - "values--65688873", - "key-22", - "values-480031738", - "key-73", - "values--310815862", - "key-0", - "values--1734944386", - "key-56", - "values--540459893", - "key-38", - "values-1308912555", - "key-2", - "values--2073028093", - "key-14", - "values--693713438", - "key-76", - "values-295450436", - "key-113", - "values--2065146687", - "key-0", - "values-2076623027", - "key-17", - "values--1394046356", - "key-78", - "values--2014478659", - "key-5", - "values--665180960"), - put("key-124", "values-460160716"), - put("key-112", "values--1828904046"), - put("key-41", "values--904162962")); + "values--665180960"), + put("key-124", "values-460160716"), + put("key-112", "values--1828904046"), + put("key-41", "values--904162962")); Map expected = makeMap(testCase); TagMap actual = makeTagMap(testCase); diff --git a/internal-api/src/test/java/datadog/trace/api/TagMapTest.java b/internal-api/src/test/java/datadog/trace/api/TagMapTest.java index 9a72b7bdd60..3986e8371aa 100644 --- a/internal-api/src/test/java/datadog/trace/api/TagMapTest.java +++ b/internal-api/src/test/java/datadog/trace/api/TagMapTest.java @@ -129,17 +129,16 @@ public void booleanEntry(TagMapScenario scenario) { @Test public void numericZeroToBooleanCoercion() { - TagMap map = - TagMap.ledger() - .set("int", 0) - .set("intObj", Integer.valueOf(0)) - .set("long", 0L) - .set("longObj", Long.valueOf(0L)) - .set("float", 0F) - .set("floatObj", Float.valueOf(0F)) - .set("double", 0D) - .set("doubleObj", Double.valueOf(0D)) - .build(); + TagMap map = TagMap.ledger() + .set("int", 0) + .set("intObj", Integer.valueOf(0)) + .set("long", 0L) + .set("longObj", Long.valueOf(0L)) + .set("float", 0F) + .set("floatObj", Float.valueOf(0F)) + .set("double", 0D) + .set("doubleObj", Double.valueOf(0D)) + .build(); assertBoolean(false, map, "int"); assertBoolean(false, map, "intObj"); @@ -155,17 +154,16 @@ public void numericZeroToBooleanCoercion() { @Test public void numericNonZeroToBooleanCoercion() { - TagMap map = - TagMap.ledger() - .set("int", 1) - .set("intObj", Integer.valueOf(1)) - .set("long", 1L) - .set("longObj", Long.valueOf(1L)) - .set("float", 1F) - .set("floatObj", Float.valueOf(1F)) - .set("double", 1D) - .set("doubleObj", Double.valueOf(1D)) - .build(); + TagMap map = TagMap.ledger() + .set("int", 1) + .set("intObj", Integer.valueOf(1)) + .set("long", 1L) + .set("longObj", Long.valueOf(1L)) + .set("float", 1F) + .set("floatObj", Float.valueOf(1F)) + .set("double", 1D) + .set("doubleObj", Double.valueOf(1D)) + .build(); assertBoolean(true, map, "int"); assertBoolean(true, map, "intObj"); @@ -181,12 +179,11 @@ public void numericNonZeroToBooleanCoercion() { @Test public void objectToBooleanCoercion() { - TagMap map = - TagMap.ledger() - .set("obj", new Object()) - .set("trueStr", "true") - .set("falseStr", "false") - .build(); + TagMap map = TagMap.ledger() + .set("obj", new Object()) + .set("trueStr", "true") + .set("falseStr", "false") + .build(); assertBoolean(true, map, "obj"); assertBoolean(true, map, "trueStr"); @@ -489,10 +486,9 @@ public void freeze(TagMapScenario scenario) { map.freeze(); - assertFrozen( - () -> { - map.remove("foo"); - }); + assertFrozen(() -> { + map.remove("foo"); + }); assertEntry("foo", "bar", map); diff --git a/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java b/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java index 145b3b117f6..ef12a6ab84d 100644 --- a/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java +++ b/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java @@ -39,42 +39,41 @@ public void setUp() { gateway = new InstrumentationGateway(); ss = gateway.getSubscriptionService(RequestContextSlot.APPSEC); cbp = gateway.getCallbackProvider(RequestContextSlot.APPSEC); - context = - new RequestContext() { - @Override - public void close() {} - - @Override - public Object getData(RequestContextSlot slot) { - return this; - } - - @Override - public TraceSegment getTraceSegment() { - return TraceSegment.NoOp.INSTANCE; - } - - @Override - public void setBlockResponseFunction(BlockResponseFunction blockResponseFunction) {} - - @Override - public BlockResponseFunction getBlockResponseFunction() { - return null; - } - - @Override - public T getOrCreateMetaStructTop(String key, Function defaultValue) { - return null; - } - - @Override - public void setClientIpAddressData(ClientIpAddressData clientIpAddressData) {} - - @Override - public ClientIpAddressData getClientIpAddressData() { - return null; - } - }; + context = new RequestContext() { + @Override + public void close() {} + + @Override + public Object getData(RequestContextSlot slot) { + return this; + } + + @Override + public TraceSegment getTraceSegment() { + return TraceSegment.NoOp.INSTANCE; + } + + @Override + public void setBlockResponseFunction(BlockResponseFunction blockResponseFunction) {} + + @Override + public BlockResponseFunction getBlockResponseFunction() { + return null; + } + + @Override + public T getOrCreateMetaStructTop(String key, Function defaultValue) { + return null; + } + + @Override + public void setClientIpAddressData(ClientIpAddressData clientIpAddressData) {} + + @Override + public ClientIpAddressData getClientIpAddressData() { + return null; + } + }; flow = new Flow.ResultFlow<>(null); callback = new Callback(context, flow); events = Events.get(); @@ -118,10 +117,8 @@ public void testDoubleRegistration() { // check event with registered callback assertEquals(cbp.getCallback(events.requestStarted()), callback); // check that we can't overwrite the callback - IllegalStateException ex = - assertThrows( - IllegalStateException.class, - () -> ss.registerCallback(events.requestStarted(), callback)); + IllegalStateException ex = assertThrows( + IllegalStateException.class, () -> ss.registerCallback(events.requestStarted(), callback)); assertAll( () -> assertTrue(ex.getMessage().startsWith("Trying to overwrite existing callback ")), () -> assertTrue(ex.getMessage().contains(events.requestStarted().toString()))); @@ -153,11 +150,10 @@ public void testRequestBlockingAction() { assertEquals(400, rba.getStatusCode()); assertEquals(BlockingContentType.HTML, rba.getBlockingContentType()); - rba = - new Flow.Action.RequestBlockingAction( - 400, - BlockingContentType.HTML, - Collections.singletonMap("Location", "https://www.google.com/")); + rba = new Flow.Action.RequestBlockingAction( + 400, + BlockingContentType.HTML, + Collections.singletonMap("Location", "https://www.google.com/")); assertTrue(rba.isBlocking()); assertEquals(400, rba.getStatusCode()); assertEquals(BlockingContentType.HTML, rba.getBlockingContentType()); @@ -173,12 +169,11 @@ public void testRequestBlockingAction() { @Test public void blockResponseFunctionDefaultMethodDelegatesRequestBlockingAction() { TraceSegment segment = TraceSegment.NoOp.INSTANCE; - Flow.Action.RequestBlockingAction action = - new Flow.Action.RequestBlockingAction( - 451, - BlockingContentType.JSON, - Collections.singletonMap("x-blocked", "true"), - "security-response-id"); + Flow.Action.RequestBlockingAction action = new Flow.Action.RequestBlockingAction( + 451, + BlockingContentType.JSON, + Collections.singletonMap("x-blocked", "true"), + "security-response-id"); CapturingBlockResponseFunction blockResponseFunction = new CapturingBlockResponseFunction(); @@ -284,13 +279,15 @@ public void testThrowableBlocking() { Throwback throwback = new Throwback(); // check that we block the thrown exceptions ss.registerCallback(events.requestStarted(), throwback); - assertEquals(Flow.ResultFlow.empty(), cbp.getCallback(events.requestStarted()).get()); + assertEquals( + Flow.ResultFlow.empty(), cbp.getCallback(events.requestStarted()).get()); ss.registerCallback(events.requestEnded(), throwback); assertEquals(Flow.ResultFlow.empty(), cbp.getCallback(events.requestEnded()).apply(null, null)); ss.registerCallback(events.requestHeader(), throwback); cbp.getCallback(events.requestHeader()).accept(null, null, null); ss.registerCallback(events.requestHeaderDone(), throwback.function); - assertEquals(Flow.ResultFlow.empty(), cbp.getCallback(events.requestHeaderDone()).apply(null)); + assertEquals( + Flow.ResultFlow.empty(), cbp.getCallback(events.requestHeaderDone()).apply(null)); ss.registerCallback(events.requestMethodUriRaw(), throwback); assertEquals( Flow.ResultFlow.empty(), @@ -412,13 +409,12 @@ public void invalidRequestContextSlot() { public void universalCallbackProviderForRequestEnded() { SubscriptionService ssIast = gateway.getSubscriptionService(RequestContextSlot.IAST); final int[] count = new int[1]; - BiFunction> cb = - (requestContext, igSpanInfo) -> { - assertSame(callback.ctx, requestContext); - assertSame(AgentTracer.noopSpan(), igSpanInfo); - count[0]++; - return new Flow.ResultFlow<>(null); - }; + BiFunction> cb = (requestContext, igSpanInfo) -> { + assertSame(callback.ctx, requestContext); + assertSame(AgentTracer.noopSpan(), igSpanInfo); + count[0]++; + return new Flow.ResultFlow<>(null); + }; ss.registerCallback(events.requestEnded(), cb); ssIast.registerCallback(events.requestEnded(), cb); BiFunction> uniCb = @@ -474,13 +470,12 @@ public void mergeFlowIdenticalFlows() { @Test public void mergeFlowBlockingActionHasPriority() { Flow flow1 = new Flow.ResultFlow<>(null); - Flow flow2 = - new Flow.ResultFlow(null) { - @Override - public Action getAction() { - return new Action.RequestBlockingAction(410, BlockingContentType.AUTO); - } - }; + Flow flow2 = new Flow.ResultFlow(null) { + @Override + public Action getAction() { + return new Action.RequestBlockingAction(410, BlockingContentType.AUTO); + } + }; Flow resFlow1 = InstrumentationGateway.mergeFlows(flow1, flow2); Flow resFlow2 = InstrumentationGateway.mergeFlows(flow2, flow1); @@ -528,11 +523,10 @@ private static class Callback public Callback(RequestContext ctx, Flow flow) { this.ctx = ctx; this.flow = flow; - function = - input -> { - count++; - return flow; - }; + function = input -> { + count++; + return flow; + }; } @Override @@ -617,11 +611,10 @@ private static class Throwback private int count = 0; - private final Function> function = - input -> { - count++; - throw new IllegalArgumentException(); - }; + private final Function> function = input -> { + count++; + throw new IllegalArgumentException(); + }; @Override public Flow apply(RequestContext requestContext, T arg) { diff --git a/internal-api/src/test/java/datadog/trace/api/http/MultipartContentDecoderTest.java b/internal-api/src/test/java/datadog/trace/api/http/MultipartContentDecoderTest.java index 013ac39b3c7..c2cafb44a4e 100644 --- a/internal-api/src/test/java/datadog/trace/api/http/MultipartContentDecoderTest.java +++ b/internal-api/src/test/java/datadog/trace/api/http/MultipartContentDecoderTest.java @@ -108,7 +108,8 @@ void extractCharsetIsCaseInsensitive(String contentType) { @ParameterizedTest @CsvSource({"text/plain; charset=UTF-8, UTF-8", "text/xml; charset=ISO-8859-1, ISO-8859-1"}) void extractCharsetFromStandardContentType(String contentType, String expectedCharset) { - assertEquals(expectedCharset, MultipartContentDecoder.extractCharset(contentType).name()); + assertEquals( + expectedCharset, MultipartContentDecoder.extractCharset(contentType).name()); } @Test @@ -134,12 +135,11 @@ void extractCharsetHandlesAdditionalParameters() { } @ParameterizedTest - @CsvSource({ - "text/plain; charset=\"UTF-8\", UTF-8", - "text/xml; charset=\"ISO-8859-1\", ISO-8859-1" + @CsvSource({"text/plain; charset=\"UTF-8\", UTF-8", "text/xml; charset=\"ISO-8859-1\", ISO-8859-1" }) void extractCharsetHandlesQuotedCharsetValue(String contentType, String expectedCharset) { - assertEquals(expectedCharset, MultipartContentDecoder.extractCharset(contentType).name()); + assertEquals( + expectedCharset, MultipartContentDecoder.extractCharset(contentType).name()); } @Test @@ -163,13 +163,12 @@ void readInputStreamTruncatesAtMaxBytes() throws IOException { void readInputStreamHandlesMultipleReadCallsToFillBuffer() throws IOException { byte[] data = "hello world".getBytes(StandardCharsets.UTF_8); // InputStream that returns 2 bytes per read() call to exercise the accumulation loop. - InputStream slow = - new ByteArrayInputStream(data) { - @Override - public synchronized int read(byte[] b, int off, int len) { - return super.read(b, off, Math.min(len, 2)); - } - }; + InputStream slow = new ByteArrayInputStream(data) { + @Override + public synchronized int read(byte[] b, int off, int len) { + return super.read(b, off, Math.min(len, 2)); + } + }; assertEquals("hello world", MultipartContentDecoder.readInputStream(slow, data.length, null)); } } diff --git a/internal-api/src/test/java/datadog/trace/api/llmobs/LLMObsContextTest.java b/internal-api/src/test/java/datadog/trace/api/llmobs/LLMObsContextTest.java index 20f91b51a8f..09dca2c9cff 100644 --- a/internal-api/src/test/java/datadog/trace/api/llmobs/LLMObsContextTest.java +++ b/internal-api/src/test/java/datadog/trace/api/llmobs/LLMObsContextTest.java @@ -175,9 +175,8 @@ void attachWithoutSamplingDecisionLeavesSamplingValuesNull() { @Test void attachWithSamplingDecisionStoresDecisionAndRate() { AgentSpanContext ctx = mock(AgentSpanContext.class); - try (ContextScope scope = - LLMObsContext.attach( - ctx, null, null, "0.25", LLMObsContext.SAMPLING_DECISION_DROPPED, null, null)) { + try (ContextScope scope = LLMObsContext.attach( + ctx, null, null, "0.25", LLMObsContext.SAMPLING_DECISION_DROPPED, null, null)) { assertEquals( LLMObsContext.SAMPLING_DECISION_DROPPED, LLMObsContext.currentSamplingDecision()); assertEquals("0.25", LLMObsContext.currentSampleRate()); @@ -200,9 +199,8 @@ void attachWithNullSamplingDecisionIgnoresSampleRate() { void childScopeInheritsParentSamplingDecision() { AgentSpanContext parent = mock(AgentSpanContext.class); AgentSpanContext child = mock(AgentSpanContext.class); - try (ContextScope parentScope = - LLMObsContext.attach( - parent, null, null, "1", LLMObsContext.SAMPLING_DECISION_SAMPLED, null, null)) { + try (ContextScope parentScope = LLMObsContext.attach( + parent, null, null, "1", LLMObsContext.SAMPLING_DECISION_SAMPLED, null, null)) { try (ContextScope childScope = LLMObsContext.attach(child)) { assertEquals(child, LLMObsContext.current()); assertEquals( @@ -227,15 +225,14 @@ void currentParentAgentNameReturnsNullWhenNoContextAttached() { @Test void fullAttachStoresAllFields() { AgentSpanContext ctx = mock(AgentSpanContext.class); - try (ContextScope scope = - LLMObsContext.attach( - ctx, - "session-1", - "v2", - "0.5", - LLMObsContext.SAMPLING_DECISION_SAMPLED, - "span-99", - "my-agent")) { + try (ContextScope scope = LLMObsContext.attach( + ctx, + "session-1", + "v2", + "0.5", + LLMObsContext.SAMPLING_DECISION_SAMPLED, + "span-99", + "my-agent")) { assertEquals(ctx, LLMObsContext.current()); assertEquals("session-1", LLMObsContext.currentSessionId()); assertEquals("v2", LLMObsContext.currentAgentVersion()); @@ -334,15 +331,14 @@ void attachPropagatesAllFourMechanismsTogether() { AgentSpanContext parent = mock(AgentSpanContext.class); AgentSpanContext child = mock(AgentSpanContext.class); // All four propagation mechanisms coexist on one context and are inherited together. - try (ContextScope parentScope = - LLMObsContext.attach( - parent, - "session-abc", - "v7", - "0.5", - LLMObsContext.SAMPLING_DECISION_SAMPLED, - "agent-span-7", - "agent-seven")) { + try (ContextScope parentScope = LLMObsContext.attach( + parent, + "session-abc", + "v7", + "0.5", + LLMObsContext.SAMPLING_DECISION_SAMPLED, + "agent-span-7", + "agent-seven")) { try (ContextScope childScope = LLMObsContext.attach(child)) { assertEquals("session-abc", LLMObsContext.currentSessionId()); assertEquals("v7", LLMObsContext.currentAgentVersion()); diff --git a/internal-api/src/test/java/datadog/trace/api/profiling/ProfilerFlareLoggerTest.java b/internal-api/src/test/java/datadog/trace/api/profiling/ProfilerFlareLoggerTest.java index f42747b5576..9d9a806d757 100644 --- a/internal-api/src/test/java/datadog/trace/api/profiling/ProfilerFlareLoggerTest.java +++ b/internal-api/src/test/java/datadog/trace/api/profiling/ProfilerFlareLoggerTest.java @@ -228,16 +228,13 @@ void testFlareContentFormat() throws Exception { ZipOutputStream zip = new ZipOutputStream(baos); try (MockedStatic mockedStatic = mockStatic(TracerFlare.class)) { - mockedStatic - .when(() -> TracerFlare.addText(any(), any(), any())) - .then( - invocation -> { - String content = invocation.getArgument(2); - assertTrue(content.contains("Message 1")); - assertTrue(content.contains("Message 2 with arg")); - assertTrue(content.contains("\n")); // Should have newlines between messages - return null; - }); + mockedStatic.when(() -> TracerFlare.addText(any(), any(), any())).then(invocation -> { + String content = invocation.getArgument(2); + assertTrue(content.contains("Message 1")); + assertTrue(content.contains("Message 2 with arg")); + assertTrue(content.contains("\n")); // Should have newlines between messages + return null; + }); logger.addReportToFlare(zip); } @@ -275,21 +272,20 @@ void testConcurrentLogging() throws Exception { for (int i = 0; i < threadCount; i++) { final int threadId = i; - executor.submit( - () -> { - try { - startLatch.await(); - for (int j = 0; j < messagesPerThread; j++) { - if (logger.log("Thread {} message {}", threadId, j)) { - successCount.incrementAndGet(); - } - } - } catch (Exception e) { - fail("Exception in thread: " + e.getMessage()); - } finally { - doneLatch.countDown(); + executor.submit(() -> { + try { + startLatch.await(); + for (int j = 0; j < messagesPerThread; j++) { + if (logger.log("Thread {} message {}", threadId, j)) { + successCount.incrementAndGet(); } - }); + } + } catch (Exception e) { + fail("Exception in thread: " + e.getMessage()); + } finally { + doneLatch.countDown(); + } + }); } startLatch.countDown(); @@ -311,18 +307,16 @@ void testConcurrentCleanupAndLogging() throws Exception { CountDownLatch latch = new CountDownLatch(2); // Logger thread - executor.submit( - () -> { - logger.log("Concurrent message"); - latch.countDown(); - }); + executor.submit(() -> { + logger.log("Concurrent message"); + latch.countDown(); + }); // Cleanup thread - executor.submit( - () -> { - logger.cleanup(); - latch.countDown(); - }); + executor.submit(() -> { + logger.cleanup(); + latch.countDown(); + }); assertTrue(latch.await(1, TimeUnit.SECONDS)); } diff --git a/internal-api/src/test/java/datadog/trace/api/rum/RumInjectorConfigTest.java b/internal-api/src/test/java/datadog/trace/api/rum/RumInjectorConfigTest.java index ba561e2e40c..b267b65ca40 100644 --- a/internal-api/src/test/java/datadog/trace/api/rum/RumInjectorConfigTest.java +++ b/internal-api/src/test/java/datadog/trace/api/rum/RumInjectorConfigTest.java @@ -73,22 +73,21 @@ void testValidConfig( Float sessionSampleRate, Float sessionReplaySampleRate, String remoteConfigurationId) { - RumInjectorConfig injectorConfig = - new RumInjectorConfig( - applicationId, - clientToken, - site, - service, - env, - majorVersion, - version, - trackUserInteractions, - trackResources, - trackLongTask, - defaultPrivacyLevel, - sessionSampleRate, - sessionReplaySampleRate, - remoteConfigurationId); + RumInjectorConfig injectorConfig = new RumInjectorConfig( + applicationId, + clientToken, + site, + service, + env, + majorVersion, + version, + trackUserInteractions, + trackResources, + trackLongTask, + defaultPrivacyLevel, + sessionSampleRate, + sessionReplaySampleRate, + remoteConfigurationId); String jsonPayload = injectorConfig.jsonPayload(); assertTrue(jsonPayload.contains(applicationId)); @@ -204,21 +203,20 @@ void testInvalidConfig( String remoteConfigurationId) { assertThrows( IllegalArgumentException.class, - () -> - new RumInjectorConfig( - applicationId, - clientToken, - site, - service, - env, - majorVersion, - version, - trackUserInteractions, - trackResources, - trackLongTask, - defaultPrivacyLevel, - sessionSampleRate, - sessionReplaySampleRate, - remoteConfigurationId)); + () -> new RumInjectorConfig( + applicationId, + clientToken, + site, + service, + env, + majorVersion, + version, + trackUserInteractions, + trackResources, + trackLongTask, + defaultPrivacyLevel, + sessionSampleRate, + sessionReplaySampleRate, + remoteConfigurationId)); } } diff --git a/internal-api/src/test/java/datadog/trace/api/sampling/AdaptiveSamplerTest.java b/internal-api/src/test/java/datadog/trace/api/sampling/AdaptiveSamplerTest.java index 8b732467622..0426ebde7f0 100644 --- a/internal-api/src/test/java/datadog/trace/api/sampling/AdaptiveSamplerTest.java +++ b/internal-api/src/test/java/datadog/trace/api/sampling/AdaptiveSamplerTest.java @@ -186,9 +186,14 @@ private static class WindowSamplingResult { private static final int AVERAGE_LOOKBACK = 30; private static final int BUDGET_LOOKBACK = 16; - @Mock AgentTaskScheduler taskScheduler; - @Captor ArgumentCaptor> rollWindowTaskCaptor; - @Captor ArgumentCaptor rollWindowTargetCaptor; + @Mock + AgentTaskScheduler taskScheduler; + + @Captor + ArgumentCaptor> rollWindowTaskCaptor; + + @Captor + ArgumentCaptor rollWindowTargetCaptor; @BeforeEach public void setup() { @@ -289,69 +294,63 @@ public void testDrop() { @Test void testConfigListener() throws Exception { AtomicInteger counter = new AtomicInteger(0); - final AdaptiveSampler sampler = - new AdaptiveSampler( - WINDOW_DURATION, - 2, - 1, - 1, - (totalCount, sampledCount, budget, totalAverage, probability) -> { - switch (counter.getAndIncrement()) { - case 0: - { - // initial config at the sampler instantiation - assertEquals(0, totalCount); - assertEquals(0, sampledCount); - assertEquals(4, budget); - assertEquals(0.0d, totalAverage); - assertEquals(1.0d, probability); - break; - } - case 1: - { - // after first roll window - assertEquals(2, totalCount); - assertEquals(1, sampledCount); - assertEquals(1, budget); - assertEquals(2.0d, totalAverage); - assertEquals(0.5d, probability); - break; - } - case 2: - { - // after second roll window - assertEquals(3, totalCount); - assertEquals(2, sampledCount); - assertEquals(0, budget); - assertEquals(3.0d, totalAverage); - assertEquals(0.0d, probability); - break; - } - case 3: - { - // after third roll window - assertEquals(3, totalCount); - assertEquals(0, sampledCount); - assertEquals(2, budget); - assertEquals(3.0d, totalAverage); - assertEquals(0.6666d, probability, 0.00007d); - System.err.println( - "==> " - + totalCount - + ", " - + sampledCount - + ", " - + budget - + ", " - + totalAverage - + ", " - + probability); - break; - } - } - }, - taskScheduler, - true); + final AdaptiveSampler sampler = new AdaptiveSampler( + WINDOW_DURATION, + 2, + 1, + 1, + (totalCount, sampledCount, budget, totalAverage, probability) -> { + switch (counter.getAndIncrement()) { + case 0: { + // initial config at the sampler instantiation + assertEquals(0, totalCount); + assertEquals(0, sampledCount); + assertEquals(4, budget); + assertEquals(0.0d, totalAverage); + assertEquals(1.0d, probability); + break; + } + case 1: { + // after first roll window + assertEquals(2, totalCount); + assertEquals(1, sampledCount); + assertEquals(1, budget); + assertEquals(2.0d, totalAverage); + assertEquals(0.5d, probability); + break; + } + case 2: { + // after second roll window + assertEquals(3, totalCount); + assertEquals(2, sampledCount); + assertEquals(0, budget); + assertEquals(3.0d, totalAverage); + assertEquals(0.0d, probability); + break; + } + case 3: { + // after third roll window + assertEquals(3, totalCount); + assertEquals(0, sampledCount); + assertEquals(2, budget); + assertEquals(3.0d, totalAverage); + assertEquals(0.6666d, probability, 0.00007d); + System.err.println("==> " + + totalCount + + ", " + + sampledCount + + ", " + + budget + + ", " + + totalAverage + + ", " + + probability); + break; + } + } + }, + taskScheduler, + true); sampler.keep(); sampler.drop(); rollWindow(); @@ -367,9 +366,8 @@ void testConfigListener() throws Exception { private void testSampler(final IntSupplier windowEventsSupplier, final int maxErrorPercent) throws Exception { - int iterations = - Integer.parseInt( - System.getProperty("com.datadog.profiling.exceptions.test-iterations", "1")); + int iterations = Integer.parseInt( + System.getProperty("com.datadog.profiling.exceptions.test-iterations", "1")); for (int i = 0; i < iterations; i++) { testSamplerInline(windowEventsSupplier, maxErrorPercent); for (int numOfThreads = 1; numOfThreads <= 64; numOfThreads *= 2) { @@ -383,15 +381,14 @@ private void testSamplerInline( log.info( "> mode: {}, windows: {}, SAMPLES_PER_WINDOW: {}, LOOKBACK: {}, max error: {}%", windowEventsSupplier, WINDOWS, SAMPLES_PER_WINDOW, AVERAGE_LOOKBACK, maxErrorPercent); - final AdaptiveSampler sampler = - new AdaptiveSampler( - WINDOW_DURATION, - SAMPLES_PER_WINDOW, - AVERAGE_LOOKBACK, - BUDGET_LOOKBACK, - null, - taskScheduler, - true); + final AdaptiveSampler sampler = new AdaptiveSampler( + WINDOW_DURATION, + SAMPLES_PER_WINDOW, + AVERAGE_LOOKBACK, + BUDGET_LOOKBACK, + null, + taskScheduler, + true); // simulate event generation and sampling for the given number of sampling windows final long expectedSamples = WINDOWS * SAMPLES_PER_WINDOW; @@ -545,15 +542,14 @@ private void testSamplerConcurrently( final AtomicLong allSamples = new AtomicLong(0); final AtomicLong receivedEvents = new AtomicLong(0); - final AdaptiveSampler sampler = - new AdaptiveSampler( - WINDOW_DURATION, - SAMPLES_PER_WINDOW, - AVERAGE_LOOKBACK, - BUDGET_LOOKBACK, - null, - taskScheduler, - true); + final AdaptiveSampler sampler = new AdaptiveSampler( + WINDOW_DURATION, + SAMPLES_PER_WINDOW, + AVERAGE_LOOKBACK, + BUDGET_LOOKBACK, + null, + taskScheduler, + true); final CyclicBarrier startBarrier = new CyclicBarrier(threadCount); final CyclicBarrier endBarrier = new CyclicBarrier(threadCount, this::rollWindow); final Mean[] means = new Mean[threadCount]; @@ -561,21 +557,19 @@ private void testSamplerConcurrently( for (int i = 0; i < threadCount; i++) { means[i] = new Mean(); final Mean mean = means[i]; - threads[i] = - new Thread( - () -> { - try { - for (int w = 0; w < WINDOWS; w++) { - startBarrier.await(10, TimeUnit.SECONDS); - WindowSamplingResult samplingResult = - generateWindowEventsAndSample(windowEventsSupplier, sampler, mean); - allSamples.addAndGet(samplingResult.samples); - receivedEvents.addAndGet(samplingResult.events); - endBarrier.await(10, TimeUnit.SECONDS); - } - } catch (Throwable ignored) { - } - }); + threads[i] = new Thread(() -> { + try { + for (int w = 0; w < WINDOWS; w++) { + startBarrier.await(10, TimeUnit.SECONDS); + WindowSamplingResult samplingResult = + generateWindowEventsAndSample(windowEventsSupplier, sampler, mean); + allSamples.addAndGet(samplingResult.samples); + receivedEvents.addAndGet(samplingResult.events); + endBarrier.await(10, TimeUnit.SECONDS); + } + } catch (Throwable ignored) { + } + }); threads[i].start(); } for (final Thread t : threads) { diff --git a/internal-api/src/test/java/datadog/trace/api/telemetry/LLMObsMetricCollectorTest.java b/internal-api/src/test/java/datadog/trace/api/telemetry/LLMObsMetricCollectorTest.java index efce543cee3..8b27d630f8b 100644 --- a/internal-api/src/test/java/datadog/trace/api/telemetry/LLMObsMetricCollectorTest.java +++ b/internal-api/src/test/java/datadog/trace/api/telemetry/LLMObsMetricCollectorTest.java @@ -49,32 +49,28 @@ void recordsOneMetricPerDistinctTagCombination() { assertEquals(1L, metric.value); } assertEquals( - new HashSet<>( - Arrays.asList( - new HashSet<>( - Arrays.asList( - "integration:openai", - "span_kind:llm", - "is_root_span:1", - "autoinstrumented:1", - "error:0", - "has_session_id:0")), - new HashSet<>( - Arrays.asList( - "integration:openai", - "span_kind:llm", - "is_root_span:0", - "autoinstrumented:1", - "error:0", - "has_session_id:1")), - new HashSet<>( - Arrays.asList( - "integration:anthropic", - "span_kind:embedding", - "is_root_span:1", - "autoinstrumented:0", - "error:1", - "has_session_id:0")))), + new HashSet<>(Arrays.asList( + new HashSet<>(Arrays.asList( + "integration:openai", + "span_kind:llm", + "is_root_span:1", + "autoinstrumented:1", + "error:0", + "has_session_id:0")), + new HashSet<>(Arrays.asList( + "integration:openai", + "span_kind:llm", + "is_root_span:0", + "autoinstrumented:1", + "error:0", + "has_session_id:1")), + new HashSet<>(Arrays.asList( + "integration:anthropic", + "span_kind:embedding", + "is_root_span:1", + "autoinstrumented:0", + "error:1", + "has_session_id:0")))), tagSets(metrics)); } diff --git a/internal-api/src/test/java/datadog/trace/api/telemetry/OtelSpiCollectorTest.java b/internal-api/src/test/java/datadog/trace/api/telemetry/OtelSpiCollectorTest.java index f1ddf2f2dea..dad550564a7 100644 --- a/internal-api/src/test/java/datadog/trace/api/telemetry/OtelSpiCollectorTest.java +++ b/internal-api/src/test/java/datadog/trace/api/telemetry/OtelSpiCollectorTest.java @@ -35,9 +35,8 @@ public void recordedMetricSurfacesOnDrain() { assertEquals("count", metric.type); assertTrue(metric.common); assertEquals(1, metric.value); - assertTrue( - metric.tags.contains( - "spi_class:io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider")); + assertTrue(metric.tags.contains( + "spi_class:io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider")); assertTrue(metric.tags.contains("source:extensions_path")); } diff --git a/internal-api/src/test/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistryTest.java b/internal-api/src/test/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistryTest.java index 3d022cc9144..9ce1e66e418 100644 --- a/internal-api/src/test/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistryTest.java +++ b/internal-api/src/test/java/datadog/trace/api/telemetry/ScaReachabilityDependencyRegistryTest.java @@ -51,23 +51,22 @@ void recordHit_concurrentCallsForSameCve_exactlyOneCallsiteStored() throws Inter for (int i = 0; i < threadCount; i++) { final int idx = i; - pool.submit( - () -> { - try { - startLatch.await(); // wait until all threads are ready - ScaReachabilityDependencyRegistry.INSTANCE.recordHit( - "com.example:lib", - "1.0.0", - "GHSA-test", - "com.myapp.Controller" + idx, - "method" + idx, - idx); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } finally { - doneLatch.countDown(); - } - }); + pool.submit(() -> { + try { + startLatch.await(); // wait until all threads are ready + ScaReachabilityDependencyRegistry.INSTANCE.recordHit( + "com.example:lib", + "1.0.0", + "GHSA-test", + "com.myapp.Controller" + idx, + "method" + idx, + idx); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + doneLatch.countDown(); + } + }); } startLatch.countDown(); // release all threads simultaneously diff --git a/internal-api/src/test/java/datadog/trace/api/telemetry/WafMetricCollectorContextClosedRaceTest.java b/internal-api/src/test/java/datadog/trace/api/telemetry/WafMetricCollectorContextClosedRaceTest.java index c1b8a06a99c..07756df0cb3 100644 --- a/internal-api/src/test/java/datadog/trace/api/telemetry/WafMetricCollectorContextClosedRaceTest.java +++ b/internal-api/src/test/java/datadog/trace/api/telemetry/WafMetricCollectorContextClosedRaceTest.java @@ -18,8 +18,9 @@ void reportsContextClosedRaceCount() { collector.prepareMetrics(); Collection metrics = collector.drain(); - Optional raceMetric = - metrics.stream().filter(m -> "waf.context_closed_race".equals(m.metricName)).findFirst(); + Optional raceMetric = metrics.stream() + .filter(m -> "waf.context_closed_race".equals(m.metricName)) + .findFirst(); assertTrue(raceMetric.isPresent(), "expected waf.context_closed_race to be reported"); assertEquals("count", raceMetric.get().type); diff --git a/internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/KeyClassifierTest.java b/internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/KeyClassifierTest.java index 35e085a7892..d7894774be6 100644 --- a/internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/KeyClassifierTest.java +++ b/internal-api/src/test/java/datadog/trace/bootstrap/instrumentation/api/KeyClassifierTest.java @@ -31,11 +31,10 @@ public boolean accept(String key, String value) { void defaultTransformerMethodAppliesTransformerAndDelegates() { RecordingClassifier classifier = new RecordingClassifier(true); - boolean result = - classifier.accept( - "my-key", - "raw".getBytes(StandardCharsets.UTF_8), - bytes -> new String(bytes, StandardCharsets.UTF_8)); + boolean result = classifier.accept( + "my-key", + "raw".getBytes(StandardCharsets.UTF_8), + bytes -> new String(bytes, StandardCharsets.UTF_8)); assertEquals("my-key", classifier.lastKey); assertEquals("raw", classifier.lastValue); @@ -47,19 +46,15 @@ void transformerIsCalledExactlyOnce() { AtomicInteger callCount = new AtomicInteger(0); AtomicReference transformed = new AtomicReference<>(); - AgentPropagation.KeyClassifier classifier = - (key, value) -> { - transformed.set(value); - return true; - }; - - classifier.accept( - "key", - "input", - v -> { - callCount.incrementAndGet(); - return v.toUpperCase(); - }); + AgentPropagation.KeyClassifier classifier = (key, value) -> { + transformed.set(value); + return true; + }; + + classifier.accept("key", "input", v -> { + callCount.incrementAndGet(); + return v.toUpperCase(); + }); assertEquals(1, callCount.get()); assertEquals("INPUT", transformed.get()); diff --git a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD1Test.java b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD1Test.java index 540eb036c2f..bbea136f061 100644 --- a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD1Test.java +++ b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD1Test.java @@ -32,13 +32,10 @@ void getOrCreateOnMissBuildsEntry() { ConcurrentHashtable.D1 table = ConcurrentHashtable.D1.createBounded(StringEntry.class, 8); int[] createCount = {0}; - StringEntry created = - table.tryGetOrCreateOrNull( - "a", - k -> { - createCount[0]++; - return new StringEntry(k, 1); - }); + StringEntry created = table.tryGetOrCreateOrNull("a", k -> { + createCount[0]++; + return new StringEntry(k, 1); + }); assertNotNull(created); assertEquals(1, table.size()); assertEquals(1, createCount[0]); @@ -51,13 +48,10 @@ void getOrCreateOnHitSkipsCreator() { ConcurrentHashtable.D1.createBounded(StringEntry.class, 8); StringEntry seeded = table.tryGetOrCreateOrNull("a", k -> new StringEntry(k, 100)); int[] createCount = {0}; - StringEntry got = - table.tryGetOrCreateOrNull( - "a", - k -> { - createCount[0]++; - return new StringEntry(k, 999); - }); + StringEntry got = table.tryGetOrCreateOrNull("a", k -> { + createCount[0]++; + return new StringEntry(k, 999); + }); assertSame(seeded, got); assertEquals(1, table.size()); assertEquals(0, createCount[0]); @@ -111,23 +105,19 @@ void concurrentGetOrCreateProducesExactlyOneEntry() throws InterruptedException Thread[] workers = new Thread[threads]; for (int i = 0; i < threads; i++) { - workers[i] = - new Thread( - () -> { - ready.countDown(); - try { - go.await(); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - return; - } - table.tryGetOrCreateOrNull( - "shared", - k -> { - createCount.incrementAndGet(); - return new StringEntry(k, 1); - }); - }); + workers[i] = new Thread(() -> { + ready.countDown(); + try { + go.await(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return; + } + table.tryGetOrCreateOrNull("shared", k -> { + createCount.incrementAndGet(); + return new StringEntry(k, 1); + }); + }); workers[i].start(); } ready.await(); @@ -173,18 +163,16 @@ void concurrentDistinctKeyInsertionsAreAllRetained() throws InterruptedException Thread[] workers = new Thread[threads]; for (int i = 0; i < threads; i++) { final String key = keys[i]; - workers[i] = - new Thread( - () -> { - ready.countDown(); - try { - go.await(); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - return; - } - table.tryGetOrCreateOrNull(key, k -> new StringEntry(k, 1)); - }); + workers[i] = new Thread(() -> { + ready.countDown(); + try { + go.await(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return; + } + table.tryGetOrCreateOrNull(key, k -> new StringEntry(k, 1)); + }); workers[i].start(); } ready.await(); @@ -299,11 +287,10 @@ void drainRemovesEveryEntryAndFeedsSink() { Set drained = new HashSet<>(); int[] sum = {0}; - table.drain( - e -> { - drained.add(e.key); - sum[0] += e.value; - }); + table.drain(e -> { + drained.add(e.key); + sum[0] += e.value; + }); assertEquals(new HashSet<>(Arrays.asList("a", "b", "c")), drained); assertEquals(6, sum[0]); @@ -360,17 +347,15 @@ void concurrentReadsStaySafeWhileOneChainMemberChurns() throws InterruptedExcept AtomicBoolean stop = new AtomicBoolean(false); AtomicInteger missed = new AtomicInteger(); - Thread reader = - new Thread( - () -> { - while (!stop.get()) { - for (int i = 1; i < n; i++) { - if (table.get(keys[i]) == null) { - missed.incrementAndGet(); - } - } - } - }); + Thread reader = new Thread(() -> { + while (!stop.get()) { + for (int i = 1; i < n; i++) { + if (table.get(keys[i]) == null) { + missed.incrementAndGet(); + } + } + } + }); reader.start(); for (int r = 0; r < 100_000; r++) { table.remove(churn); @@ -398,15 +383,14 @@ void tryGetOrCreateOrEvictReturnsExistingEntryOnHitWithoutEvicting() { ConcurrentHashtable.D1 table = ConcurrentHashtable.D1.createBounded(StringEntry.class, 1); StringEntry a = table.tryGetOrCreateOrNull("a", k -> new StringEntry(k, 1)); - Maybe got = - table.tryGetOrCreateOrEvict( - "a", - k -> { - throw new AssertionError("creator must not run on a hit"); - }, - e -> { - throw new AssertionError("evictable must not run on a hit"); - }); + Maybe got = table.tryGetOrCreateOrEvict( + "a", + k -> { + throw new AssertionError("creator must not run on a hit"); + }, + e -> { + throw new AssertionError("evictable must not run on a hit"); + }); assertSame(a, got.getOrNull()); assertEquals(1, table.size()); } @@ -449,13 +433,12 @@ void tryGetOrCreateOrEvictOrNullEvictionRunsBeforeThrowingCreator() { assertThrows( RuntimeException.class, - () -> - table.tryGetOrCreateOrEvictOrNull( - "new", - k -> { - throw new RuntimeException("boom"); - }, - e -> true)); + () -> table.tryGetOrCreateOrEvictOrNull( + "new", + k -> { + throw new RuntimeException("boom"); + }, + e -> true)); // Eviction already happened before the creator threw: the table is left one entry smaller, // not corrupted or double-booked. diff --git a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD2Test.java b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD2Test.java index 182cb4c4f25..52627a61602 100644 --- a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD2Test.java +++ b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableD2Test.java @@ -36,14 +36,10 @@ void getOrCreateOnMissBuildsEntryViaCreator() { ConcurrentHashtable.D2 table = ConcurrentHashtable.D2.createBounded(PairEntry.class, 8); int[] createCount = {0}; - PairEntry created = - table.tryGetOrCreateOrNull( - "a", - 1, - (k1, k2) -> { - createCount[0]++; - return new PairEntry(k1, k2); - }); + PairEntry created = table.tryGetOrCreateOrNull("a", 1, (k1, k2) -> { + createCount[0]++; + return new PairEntry(k1, k2); + }); assertNotNull(created); assertEquals("a", created.key1); assertEquals(Integer.valueOf(1), created.key2); @@ -58,14 +54,10 @@ void getOrCreateOnHitSkipsCreator() { ConcurrentHashtable.D2.createBounded(PairEntry.class, 8); PairEntry seeded = table.tryGetOrCreateOrNull("a", 1, PairEntry::new); int[] createCount = {0}; - PairEntry got = - table.tryGetOrCreateOrNull( - "a", - 1, - (k1, k2) -> { - createCount[0]++; - return new PairEntry(k1, k2); - }); + PairEntry got = table.tryGetOrCreateOrNull("a", 1, (k1, k2) -> { + createCount[0]++; + return new PairEntry(k1, k2); + }); assertSame(seeded, got); assertEquals(1, table.size()); assertEquals(0, createCount[0]); @@ -108,24 +100,19 @@ void concurrentGetOrCreateProducesExactlyOneEntry() throws InterruptedException Thread[] workers = new Thread[threads]; for (int i = 0; i < threads; i++) { - workers[i] = - new Thread( - () -> { - ready.countDown(); - try { - go.await(); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - return; - } - table.tryGetOrCreateOrNull( - "shared", - 42, - (k1, k2) -> { - createCount.incrementAndGet(); - return new PairEntry(k1, k2); - }); - }); + workers[i] = new Thread(() -> { + ready.countDown(); + try { + go.await(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return; + } + table.tryGetOrCreateOrNull("shared", 42, (k1, k2) -> { + createCount.incrementAndGet(); + return new PairEntry(k1, k2); + }); + }); workers[i].start(); } ready.await(); @@ -174,18 +161,16 @@ void concurrentDistinctKeyInsertionsAreAllRetained() throws InterruptedException for (int i = 0; i < threads; i++) { final String k1 = k1s[i]; final Integer k2 = k2s[i]; - workers[i] = - new Thread( - () -> { - ready.countDown(); - try { - go.await(); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - return; - } - table.tryGetOrCreateOrNull(k1, k2, PairEntry::new); - }); + workers[i] = new Thread(() -> { + ready.countDown(); + try { + go.await(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return; + } + table.tryGetOrCreateOrNull(k1, k2, PairEntry::new); + }); workers[i].start(); } ready.await(); @@ -325,16 +310,15 @@ void tryGetOrCreateOrEvictReturnsExistingEntryOnHitWithoutEvicting() { ConcurrentHashtable.D2 table = ConcurrentHashtable.D2.createBounded(PairEntry.class, 1); PairEntry a = table.tryGetOrCreateOrNull("a", 1, PairEntry::new); - Maybe got = - table.tryGetOrCreateOrEvict( - "a", - 1, - (k1, k2) -> { - throw new AssertionError("creator must not run on a hit"); - }, - e -> { - throw new AssertionError("evictable must not run on a hit"); - }); + Maybe got = table.tryGetOrCreateOrEvict( + "a", + 1, + (k1, k2) -> { + throw new AssertionError("creator must not run on a hit"); + }, + e -> { + throw new AssertionError("evictable must not run on a hit"); + }); assertSame(a, got.getOrNull()); assertEquals(1, table.size()); } @@ -375,14 +359,13 @@ void tryGetOrCreateOrEvictOrNullEvictionRunsBeforeThrowingCreator() { assertThrows( RuntimeException.class, - () -> - table.tryGetOrCreateOrEvictOrNull( - "new", - 2, - (k1, k2) -> { - throw new RuntimeException("boom"); - }, - e -> true)); + () -> table.tryGetOrCreateOrEvictOrNull( + "new", + 2, + (k1, k2) -> { + throw new RuntimeException("boom"); + }, + e -> true)); // Eviction already happened before the creator threw: the table is left one entry smaller, // not corrupted or double-booked. diff --git a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableSizeManagerTest.java b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableSizeManagerTest.java index 24c581b2380..c1803bc90b1 100644 --- a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableSizeManagerTest.java +++ b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableSizeManagerTest.java @@ -353,18 +353,17 @@ void concurrentReserversCannotBothPassTheCap() throws InterruptedException { java.util.concurrent.atomic.AtomicInteger granted = new java.util.concurrent.atomic.AtomicInteger(); java.util.concurrent.CountDownLatch start = new java.util.concurrent.CountDownLatch(1); - Runnable reserve = - () -> { - try { - start.await(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - if (sizeManager.tryReserve()) { - granted.incrementAndGet(); - } - }; + Runnable reserve = () -> { + try { + start.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + if (sizeManager.tryReserve()) { + granted.incrementAndGet(); + } + }; Thread t1 = new Thread(reserve, "reserve-1"); Thread t2 = new Thread(reserve, "reserve-2"); t1.start(); diff --git a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableStaticsTest.java b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableStaticsTest.java index 8191e396e14..e13186362ef 100644 --- a/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableStaticsTest.java +++ b/internal-api/src/test/java/datadog/trace/util/ConcurrentHashtableStaticsTest.java @@ -175,12 +175,10 @@ void staticDrainRemovesEveryEntryAndFeedsSink() { Set keys = new HashSet<>(); int[] sum = {0}; - ConcurrentHashtable.drain( - table.buckets, - e -> { - keys.add(e.key); - sum[0] += e.value; - }); + ConcurrentHashtable.drain(table.buckets, e -> { + keys.add(e.key); + sum[0] += e.value; + }); assertEquals(new HashSet<>(java.util.Arrays.asList(1, 2, 3)), keys); assertEquals(60, sum[0]); @@ -264,18 +262,16 @@ void concurrentGetOrCreateViaStaticsProducesExactlyOneEntry() throws Interrupted Thread[] workers = new Thread[threads]; for (int i = 0; i < threads; i++) { - workers[i] = - new Thread( - () -> { - ready.countDown(); - try { - go.await(); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - return; - } - table.getOrCreateCounting(7, createCount); - }); + workers[i] = new Thread(() -> { + ready.countDown(); + try { + go.await(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return; + } + table.getOrCreateCounting(7, createCount); + }); workers[i].start(); } ready.await(); @@ -300,17 +296,15 @@ void concurrentReadsStaySafeWhileOneChainMemberChurnsViaStatics() throws Interru AtomicBoolean stop = new AtomicBoolean(false); AtomicInteger missed = new AtomicInteger(); - Thread reader = - new Thread( - () -> { - while (!stop.get()) { - for (int i = 1; i < n; i++) { - if (table.get(i) == null) { - missed.incrementAndGet(); - } - } - } - }); + Thread reader = new Thread(() -> { + while (!stop.get()) { + for (int i = 1; i < n; i++) { + if (table.get(i) == null) { + missed.incrementAndGet(); + } + } + } + }); reader.start(); for (int r = 0; r < 100_000; r++) { table.remove(churn); diff --git a/internal-api/src/test/java/datadog/trace/util/FlatHashtableD1Test.java b/internal-api/src/test/java/datadog/trace/util/FlatHashtableD1Test.java index 4fc6838974b..ecde499c5cd 100644 --- a/internal-api/src/test/java/datadog/trace/util/FlatHashtableD1Test.java +++ b/internal-api/src/test/java/datadog/trace/util/FlatHashtableD1Test.java @@ -187,13 +187,10 @@ void hashCollisionsResolveByEquality() { void getOrCreateOnMissBuildsEntryViaCreator() { FlatHashtable.D1 table = growable(8); int[] createCount = {0}; - StringIntEntry created = - table.getOrCreate( - "foo", - k -> { - createCount[0]++; - return new StringIntEntry(k, 42); - }); + StringIntEntry created = table.getOrCreate("foo", k -> { + createCount[0]++; + return new StringIntEntry(k, 42); + }); assertNotNull(created); assertEquals("foo", created.key()); assertEquals(42, created.value); @@ -208,13 +205,10 @@ void getOrCreateOnHitSkipsCreator() { StringIntEntry seeded = new StringIntEntry("foo", 1); table.insert(seeded); int[] createCount = {0}; - StringIntEntry got = - table.getOrCreate( - "foo", - k -> { - createCount[0]++; - return new StringIntEntry(k, 999); - }); + StringIntEntry got = table.getOrCreate("foo", k -> { + createCount[0]++; + return new StringIntEntry(k, 999); + }); assertSame(seeded, got); assertEquals(1, table.size()); assertEquals(0, createCount[0]); diff --git a/internal-api/src/test/java/datadog/trace/util/FlatHashtableD2Test.java b/internal-api/src/test/java/datadog/trace/util/FlatHashtableD2Test.java index 5d19af4fecf..de82324d45a 100644 --- a/internal-api/src/test/java/datadog/trace/util/FlatHashtableD2Test.java +++ b/internal-api/src/test/java/datadog/trace/util/FlatHashtableD2Test.java @@ -166,14 +166,10 @@ void nullKeyPartsArePermitted() { void getOrCreateOnMissBuildsEntryViaCreator() { FlatHashtable.D2 table = growable(8); int[] createCount = {0}; - PairEntry created = - table.getOrCreate( - "foo", - 1, - (k1, k2) -> { - createCount[0]++; - return new PairEntry(k1, k2, 42); - }); + PairEntry created = table.getOrCreate("foo", 1, (k1, k2) -> { + createCount[0]++; + return new PairEntry(k1, k2, 42); + }); assertNotNull(created); assertEquals("foo", created.key1()); assertEquals(1, created.key2()); @@ -189,14 +185,10 @@ void getOrCreateOnHitSkipsCreator() { PairEntry seeded = new PairEntry("foo", 1, 1); table.insert(seeded); int[] createCount = {0}; - PairEntry got = - table.getOrCreate( - "foo", - 1, - (k1, k2) -> { - createCount[0]++; - return new PairEntry(k1, k2, 999); - }); + PairEntry got = table.getOrCreate("foo", 1, (k1, k2) -> { + createCount[0]++; + return new PairEntry(k1, k2, 999); + }); assertSame(seeded, got); assertEquals(1, table.size()); assertEquals(0, createCount[0]); diff --git a/internal-api/src/test/java/datadog/trace/util/FlatHashtableTest.java b/internal-api/src/test/java/datadog/trace/util/FlatHashtableTest.java index b1099210611..e67482f6319 100644 --- a/internal-api/src/test/java/datadog/trace/util/FlatHashtableTest.java +++ b/internal-api/src/test/java/datadog/trace/util/FlatHashtableTest.java @@ -542,9 +542,8 @@ void entryIterator_emptyRunHasNoNext() { @Test void caseInsensitiveStrategy_matchesRegardlessOfCase() { TestEntry[] table = FlatHashtable.create(TestEntry.class, 4); - TestEntry stored = - FlatHashtable.getOrCreate( - table, "Content-Type", TestCaseInsensitiveStrategy.INSTANCE, CREATE); + TestEntry stored = FlatHashtable.getOrCreate( + table, "Content-Type", TestCaseInsensitiveStrategy.INSTANCE, CREATE); // Look-ups in any case resolve to the same stored entry, allocation-free. assertSame( diff --git a/internal-api/src/test/java/datadog/trace/util/HashtableD1Test.java b/internal-api/src/test/java/datadog/trace/util/HashtableD1Test.java index a3cd4c25247..7f1be29480b 100644 --- a/internal-api/src/test/java/datadog/trace/util/HashtableD1Test.java +++ b/internal-api/src/test/java/datadog/trace/util/HashtableD1Test.java @@ -195,13 +195,10 @@ void hashCollisionsThenRemoveLeavesOtherIntact() { void getOrCreateOnMissBuildsEntryViaCreator() { Hashtable.D1 table = new Hashtable.D1<>(8); int[] createCount = {0}; - StringIntEntry created = - table.getOrCreate( - "foo", - k -> { - createCount[0]++; - return new StringIntEntry(k, 42); - }); + StringIntEntry created = table.getOrCreate("foo", k -> { + createCount[0]++; + return new StringIntEntry(k, 42); + }); assertNotNull(created); assertEquals("foo", created.key); assertEquals(42, created.value); @@ -216,13 +213,10 @@ void getOrCreateOnHitSkipsCreator() { StringIntEntry seeded = new StringIntEntry("foo", 1); table.insert(seeded); int[] createCount = {0}; - StringIntEntry got = - table.getOrCreate( - "foo", - k -> { - createCount[0]++; - return new StringIntEntry(k, 999); - }); + StringIntEntry got = table.getOrCreate("foo", k -> { + createCount[0]++; + return new StringIntEntry(k, 999); + }); assertSame(seeded, got); assertEquals(1, table.size()); assertEquals(0, createCount[0]); diff --git a/internal-api/src/test/java/datadog/trace/util/HashtableD2Test.java b/internal-api/src/test/java/datadog/trace/util/HashtableD2Test.java index fb621f89482..9ccae05c3d3 100644 --- a/internal-api/src/test/java/datadog/trace/util/HashtableD2Test.java +++ b/internal-api/src/test/java/datadog/trace/util/HashtableD2Test.java @@ -83,14 +83,10 @@ void forEachWithContextPassesContextToConsumer() { void getOrCreateOnMissBuildsEntryViaCreator() { Hashtable.D2 table = new Hashtable.D2<>(8); int[] createCount = {0}; - PairEntry created = - table.getOrCreate( - "a", - 1, - (k1, k2) -> { - createCount[0]++; - return new PairEntry(k1, k2, 100); - }); + PairEntry created = table.getOrCreate("a", 1, (k1, k2) -> { + createCount[0]++; + return new PairEntry(k1, k2, 100); + }); assertNotNull(created); assertEquals("a", created.key1); assertEquals(Integer.valueOf(1), created.key2); @@ -106,14 +102,10 @@ void getOrCreateOnHitSkipsCreator() { PairEntry seeded = new PairEntry("a", 1, 100); table.insert(seeded); int[] createCount = {0}; - PairEntry got = - table.getOrCreate( - "a", - 1, - (k1, k2) -> { - createCount[0]++; - return new PairEntry(k1, k2, 999); - }); + PairEntry got = table.getOrCreate("a", 1, (k1, k2) -> { + createCount[0]++; + return new PairEntry(k1, k2, 999); + }); assertSame(seeded, got); assertEquals(1, table.size()); assertEquals(0, createCount[0]); diff --git a/internal-api/src/test/java/datadog/trace/util/HashtableTest.java b/internal-api/src/test/java/datadog/trace/util/HashtableTest.java index 953453ca3aa..2608adc3e81 100644 --- a/internal-api/src/test/java/datadog/trace/util/HashtableTest.java +++ b/internal-api/src/test/java/datadog/trace/util/HashtableTest.java @@ -391,9 +391,8 @@ void rangeBoundsOutOfOrderThrows() { () -> Support.mutatingTableIterator(table.buckets, 4, 2)); // end < start assertThrows( IndexOutOfBoundsException.class, - () -> - Support.mutatingTableIterator( - table.buckets, 0, table.buckets.length + 1)); // end > len + () -> Support.mutatingTableIterator( + table.buckets, 0, table.buckets.length + 1)); // end > len } @Test diff --git a/internal-api/src/test/java/datadog/trace/util/RandomUtilsTest.java b/internal-api/src/test/java/datadog/trace/util/RandomUtilsTest.java index 1a3969a5a77..99bd4b751ca 100644 --- a/internal-api/src/test/java/datadog/trace/util/RandomUtilsTest.java +++ b/internal-api/src/test/java/datadog/trace/util/RandomUtilsTest.java @@ -19,7 +19,8 @@ public void testRandomUUIDMatchesSpec() { @Test public void testSecureRandomUUIDMatchesSpec() { for (int i = 0; i < 8; i++) { - assertTrue(VERSION_4_UUID.matcher(RandomUtils.secureRandomUUID().toString()).matches()); + assertTrue( + VERSION_4_UUID.matcher(RandomUtils.secureRandomUUID().toString()).matches()); } } } diff --git a/internal-api/src/test/java/datadog/trace/util/StringsCaseInsensitiveHashCodeTest.java b/internal-api/src/test/java/datadog/trace/util/StringsCaseInsensitiveHashCodeTest.java index 52195d73693..b1ebb6383d2 100644 --- a/internal-api/src/test/java/datadog/trace/util/StringsCaseInsensitiveHashCodeTest.java +++ b/internal-api/src/test/java/datadog/trace/util/StringsCaseInsensitiveHashCodeTest.java @@ -81,8 +81,7 @@ void staysConsistentAcrossAllDefinedCodePoints() { if (!Character.isDefined(cp) || Character.isSurrogate((char) cp)) continue; String s = new String(Character.toChars(cp)); for (int variant : - new int[] { - Character.toUpperCase(cp), Character.toLowerCase(cp), Character.toTitleCase(cp) + new int[] {Character.toUpperCase(cp), Character.toLowerCase(cp), Character.toTitleCase(cp) }) { String t = new String(Character.toChars(variant)); if (s.equalsIgnoreCase(t)) { @@ -91,11 +90,10 @@ void staysConsistentAcrossAllDefinedCodePoints() { assertEquals( caseInsensitiveHashCode(s), caseInsensitiveHashCode(t), - () -> - "hash mismatch for equalsIgnoreCase pair U+" - + Integer.toHexString(fs.codePointAt(0)) - + " / U+" - + Integer.toHexString(ft.codePointAt(0))); + () -> "hash mismatch for equalsIgnoreCase pair U+" + + Integer.toHexString(fs.codePointAt(0)) + + " / U+" + + Integer.toHexString(ft.codePointAt(0))); } } } diff --git a/internal-api/src/test/java/datadog/trace/util/TempLocationManagerSecurityTest.java b/internal-api/src/test/java/datadog/trace/util/TempLocationManagerSecurityTest.java index 7906ea0e009..466eca4c4f8 100644 --- a/internal-api/src/test/java/datadog/trace/util/TempLocationManagerSecurityTest.java +++ b/internal-api/src/test/java/datadog/trace/util/TempLocationManagerSecurityTest.java @@ -28,7 +28,8 @@ */ public class TempLocationManagerSecurityTest { - @TempDir Path baseDir; + @TempDir + Path baseDir; @BeforeEach void requirePosix() { @@ -128,15 +129,14 @@ private TempLocationManager instance(Path base) { private static void assertTrue0700(Path dir) throws IOException { Set perms = Files.getPosixFilePermissions(dir); - for (PosixFilePermission bit : - new PosixFilePermission[] { - PosixFilePermission.GROUP_READ, - PosixFilePermission.GROUP_WRITE, - PosixFilePermission.GROUP_EXECUTE, - PosixFilePermission.OTHERS_READ, - PosixFilePermission.OTHERS_WRITE, - PosixFilePermission.OTHERS_EXECUTE - }) { + for (PosixFilePermission bit : new PosixFilePermission[] { + PosixFilePermission.GROUP_READ, + PosixFilePermission.GROUP_WRITE, + PosixFilePermission.GROUP_EXECUTE, + PosixFilePermission.OTHERS_READ, + PosixFilePermission.OTHERS_WRITE, + PosixFilePermission.OTHERS_EXECUTE + }) { if (perms.contains(bit)) { throw new AssertionError("Expected 0700 but found group/world bit " + bit + " on " + dir); } diff --git a/internal-api/src/test/java/datadog/trace/util/TempLocationManagerTest.java b/internal-api/src/test/java/datadog/trace/util/TempLocationManagerTest.java index af22b5fe804..61618227f17 100644 --- a/internal-api/src/test/java/datadog/trace/util/TempLocationManagerTest.java +++ b/internal-api/src/test/java/datadog/trace/util/TempLocationManagerTest.java @@ -52,10 +52,9 @@ void testDefault(String subPath) throws Exception { @ParameterizedTest @ValueSource(strings = {"", "test1"}) void testFromConfig(String subPath) throws Exception { - Path myDir = - Files.createTempDirectory( - "ddprof-test-", - PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); + Path myDir = Files.createTempDirectory( + "ddprof-test-", + PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); myDir.toFile().deleteOnExit(); Properties props = new Properties(); props.put(ProfilingConfig.PROFILING_TEMP_DIR, myDir.toString()); @@ -68,7 +67,8 @@ void testFromConfig(String subPath) throws Exception { @Test void testFromConfigInvalid() { - Path myDir = Paths.get(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString()); + Path myDir = + Paths.get(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString()); // do not create the directory - it should trigger an exception Properties props = new Properties(); props.put(ProfilingConfig.PROFILING_TEMP_DIR, myDir.toString()); @@ -78,10 +78,9 @@ void testFromConfigInvalid() { @Test void testFromConfigNotWritable() throws Exception { - Path myDir = - Files.createTempDirectory( - "ddprof-test-", - PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("r-x------"))); + Path myDir = Files.createTempDirectory( + "ddprof-test-", + PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("r-x------"))); myDir.toFile().deleteOnExit(); Properties props = new Properties(); props.put(ProfilingConfig.PROFILING_TEMP_DIR, myDir.toString()); @@ -92,10 +91,9 @@ void testFromConfigNotWritable() throws Exception { @ParameterizedTest @ValueSource(strings = {"", "test1"}) void testCleanup(String subPath) throws Exception { - Path myDir = - Files.createTempDirectory( - "ddprof-test-", - PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); + Path myDir = Files.createTempDirectory( + "ddprof-test-", + PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); myDir.toFile().deleteOnExit(); TempLocationManager tempLocationManager = instance(myDir, false, TempLocationManager.CleanupHook.EMPTY); @@ -131,10 +129,9 @@ void testConcurrentCleanup(String section) throws Exception { * 2. Main thread deletes file, signals via proceedSignal latch * 3. Cleanup thread continues and completes */ - Path baseDir = - Files.createTempDirectory( - "ddprof-test-", - PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); + Path baseDir = Files.createTempDirectory( + "ddprof-test-", + PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); baseDir.toFile().deleteOnExit(); Path fakeTempDir = @@ -153,49 +150,48 @@ void testConcurrentCleanup(String section) throws Exception { AtomicBoolean withTimeout = new AtomicBoolean(false); AtomicReference cleanupError = new AtomicReference<>(); - TempLocationManager.CleanupHook blocker = - new TempLocationManager.CleanupHook() { - private void syncPoint(boolean timeout) { - withTimeout.compareAndSet(false, timeout); - hookReached.countDown(); - try { - if (!proceedSignal.await(30, TimeUnit.SECONDS)) { - cleanupError.set( - new AssertionError("Cleanup thread: proceed signal timeout after 30s")); - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - cleanupError.set(e); - } + TempLocationManager.CleanupHook blocker = new TempLocationManager.CleanupHook() { + private void syncPoint(boolean timeout) { + withTimeout.compareAndSet(false, timeout); + hookReached.countDown(); + try { + if (!proceedSignal.await(30, TimeUnit.SECONDS)) { + cleanupError.set( + new AssertionError("Cleanup thread: proceed signal timeout after 30s")); } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + cleanupError.set(e); + } + } - @Override - public FileVisitResult preVisitDirectory( - Path dir, BasicFileAttributes attrs, boolean timeout) throws IOException { - if (section.equals("preVisitDirectory") && dir.equals(fakeTempDir)) { - syncPoint(timeout); - } - return TempLocationManager.CleanupHook.super.preVisitDirectory(dir, attrs, timeout); - } + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs, boolean timeout) + throws IOException { + if (section.equals("preVisitDirectory") && dir.equals(fakeTempDir)) { + syncPoint(timeout); + } + return TempLocationManager.CleanupHook.super.preVisitDirectory(dir, attrs, timeout); + } - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs, boolean timeout) - throws IOException { - if (section.equals("visitFile") && file.equals(fakeTempFile)) { - syncPoint(timeout); - } - return TempLocationManager.CleanupHook.super.visitFile(file, attrs, timeout); - } + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs, boolean timeout) + throws IOException { + if (section.equals("visitFile") && file.equals(fakeTempFile)) { + syncPoint(timeout); + } + return TempLocationManager.CleanupHook.super.visitFile(file, attrs, timeout); + } - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc, boolean timeout) - throws IOException { - if (section.equals("postVisitDirectory") && dir.equals(fakeTempDir)) { - syncPoint(timeout); - } - return TempLocationManager.CleanupHook.super.postVisitDirectory(dir, exc, timeout); - } - }; + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc, boolean timeout) + throws IOException { + if (section.equals("postVisitDirectory") && dir.equals(fakeTempDir)) { + syncPoint(timeout); + } + return TempLocationManager.CleanupHook.super.postVisitDirectory(dir, exc, timeout); + } + }; TempLocationManager mgr = instance(baseDir, false, blocker); @@ -246,50 +242,48 @@ void testCleanupWithTimeout(boolean shouldSucceed, String section) throws Except AtomicBoolean withTimeout = new AtomicBoolean(false); AtomicBoolean timeAdvanced = new AtomicBoolean(false); - TempLocationManager.CleanupHook delayer = - new TempLocationManager.CleanupHook() { - private void maybeAdvanceTime() { - // Only advance time once, and only for failure case - if (!shouldSucceed && timeAdvanced.compareAndSet(false, true)) { - // Advance well past the timeout - timeSource.advance(TimeUnit.MILLISECONDS.toNanos(timeoutMs * 10)); - } - } + TempLocationManager.CleanupHook delayer = new TempLocationManager.CleanupHook() { + private void maybeAdvanceTime() { + // Only advance time once, and only for failure case + if (!shouldSucceed && timeAdvanced.compareAndSet(false, true)) { + // Advance well past the timeout + timeSource.advance(TimeUnit.MILLISECONDS.toNanos(timeoutMs * 10)); + } + } - @Override - public FileVisitResult preVisitDirectory( - Path dir, BasicFileAttributes attrs, boolean timeout) throws IOException { - withTimeout.compareAndSet(false, timeout); - if (section.equals("preVisitDirectory")) { - maybeAdvanceTime(); - } - return TempLocationManager.CleanupHook.super.preVisitDirectory(dir, attrs, timeout); - } + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs, boolean timeout) + throws IOException { + withTimeout.compareAndSet(false, timeout); + if (section.equals("preVisitDirectory")) { + maybeAdvanceTime(); + } + return TempLocationManager.CleanupHook.super.preVisitDirectory(dir, attrs, timeout); + } - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc, boolean timeout) - throws IOException { - withTimeout.compareAndSet(false, timeout); - if (section.equals("postVisitDirectory")) { - maybeAdvanceTime(); - } - return TempLocationManager.CleanupHook.super.postVisitDirectory(dir, exc, timeout); - } + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc, boolean timeout) + throws IOException { + withTimeout.compareAndSet(false, timeout); + if (section.equals("postVisitDirectory")) { + maybeAdvanceTime(); + } + return TempLocationManager.CleanupHook.super.postVisitDirectory(dir, exc, timeout); + } - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs, boolean timeout) - throws IOException { - withTimeout.compareAndSet(false, timeout); - if (section.equals("visitFile")) { - maybeAdvanceTime(); - } - return TempLocationManager.CleanupHook.super.visitFile(file, attrs, timeout); - } - }; - Path baseDir = - Files.createTempDirectory( - "ddprof-test-", - PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs, boolean timeout) + throws IOException { + withTimeout.compareAndSet(false, timeout); + if (section.equals("visitFile")) { + maybeAdvanceTime(); + } + return TempLocationManager.CleanupHook.super.visitFile(file, attrs, timeout); + } + }; + Path baseDir = Files.createTempDirectory( + "ddprof-test-", + PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"))); baseDir.toFile().deleteOnExit(); TempLocationManager instance = instance(baseDir, false, delayer, timeSource); Path mytempdir = instance.getTempDir(); diff --git a/internal-api/src/test/java/datadog/trace/util/stacktrace/HotSpotStackWalkerTest.java b/internal-api/src/test/java/datadog/trace/util/stacktrace/HotSpotStackWalkerTest.java index 3488a320edb..d17e63097c6 100644 --- a/internal-api/src/test/java/datadog/trace/util/stacktrace/HotSpotStackWalkerTest.java +++ b/internal-api/src/test/java/datadog/trace/util/stacktrace/HotSpotStackWalkerTest.java @@ -94,12 +94,9 @@ public void iterable_from_HotSpotStackWalker_doGetStack_is_not_in_the_filtered_s // When List list = stackWalker.walk(s -> s.collect(Collectors.toList())); // Then - assertFalse( - list.stream() - .anyMatch( - stackTraceElement -> - stackTraceElement - .toString() - .equals("java.lang.Iterable.spliterator(Iterable.java:101)"))); + assertFalse(list.stream() + .anyMatch(stackTraceElement -> stackTraceElement + .toString() + .equals("java.lang.Iterable.spliterator(Iterable.java:101)"))); } } diff --git a/internal-api/src/test/java/datadog/trace/util/stacktrace/StackUtilsTest.java b/internal-api/src/test/java/datadog/trace/util/stacktrace/StackUtilsTest.java index 2de4d2d0996..c8d30c32c26 100644 --- a/internal-api/src/test/java/datadog/trace/util/stacktrace/StackUtilsTest.java +++ b/internal-api/src/test/java/datadog/trace/util/stacktrace/StackUtilsTest.java @@ -37,19 +37,17 @@ public void test_identity_function() { @Test public void test_filter_all_datadog() { - final StackTraceElement[] stack = - new StackTraceElement[] { - stack().className("org.junit.jupiter.api.Test").build(), - stack().className("datadog.trace.util.stacktrace.StackUtilsTest").build(), - stack().className("java.util.function.Function").build(), - stack().className("datadog.trace.util.stacktrace.StackUtils").build(), - stack().className("org.junit.jupiter.api.Assertions").build() - }; + final StackTraceElement[] stack = new StackTraceElement[] { + stack().className("org.junit.jupiter.api.Test").build(), + stack().className("datadog.trace.util.stacktrace.StackUtilsTest").build(), + stack().className("java.util.function.Function").build(), + stack().className("datadog.trace.util.stacktrace.StackUtils").build(), + stack().className("org.junit.jupiter.api.Assertions").build() + }; final StackTraceElement[] expected = new StackTraceElement[] {stack[0], stack[2], stack[4]}; - final Throwable filtered = - StackUtils.filter( - withStack(stack), item -> !item.getClassName().startsWith("datadog.trace")); + final Throwable filtered = StackUtils.filter( + withStack(stack), item -> !item.getClassName().startsWith("datadog.trace")); assertArrayEquals(expected, filtered.getStackTrace()); final Throwable filtered2 = StackUtils.filterDatadog(withStack(stack)); @@ -58,20 +56,18 @@ public void test_filter_all_datadog() { @Test public void test_stack_filters() { - final StackTraceElement[] stack = - new StackTraceElement[] { - stack().className("org.junit.jupiter.api.Test").build(), - stack().className("datadog.trace.util.stacktrace.StackUtilsTest").build(), - stack().className("java.util.function.Function").build(), - stack().className("datadog.trace.util.stacktrace.StackUtils").build(), - stack().className("org.junit.jupiter.api.Assertions").build() - }; + final StackTraceElement[] stack = new StackTraceElement[] { + stack().className("org.junit.jupiter.api.Test").build(), + stack().className("datadog.trace.util.stacktrace.StackUtilsTest").build(), + stack().className("java.util.function.Function").build(), + stack().className("datadog.trace.util.stacktrace.StackUtils").build(), + stack().className("org.junit.jupiter.api.Assertions").build() + }; final StackTraceElement[] expected = new StackTraceElement[] {stack[0], stack[2], stack[3], stack[4]}; - final Throwable filtered = - StackUtils.filterFirst( - withStack(stack), item -> !item.getClassName().startsWith("datadog.trace")); + final Throwable filtered = StackUtils.filterFirst( + withStack(stack), item -> !item.getClassName().startsWith("datadog.trace")); assertArrayEquals(expected, filtered.getStackTrace()); final Throwable filtered2 = StackUtils.filterFirstDatadog(withStack(stack)); @@ -80,20 +76,18 @@ public void test_stack_filters() { @Test public void test_filter_until() { - final StackTraceElement[] stack = - new StackTraceElement[] { - stack().className("org.junit.jupiter.api.Test").build(), - stack().className("datadog.trace.util.stacktrace.StackUtilsTest").build(), - stack().className("java.util.function.Function").build(), - stack().className("datadog.trace.util.stacktrace.StackUtils").build(), - stack().className("org.junit.jupiter.api.Assertions").build() - }; + final StackTraceElement[] stack = new StackTraceElement[] { + stack().className("org.junit.jupiter.api.Test").build(), + stack().className("datadog.trace.util.stacktrace.StackUtilsTest").build(), + stack().className("java.util.function.Function").build(), + stack().className("datadog.trace.util.stacktrace.StackUtils").build(), + stack().className("org.junit.jupiter.api.Assertions").build() + }; final StackTraceElement[] expected = new StackTraceElement[] {stack[4]}; - final Throwable removed = - StackUtils.filterUntil( - withStack(stack), - entry -> entry.getClassName().equals("datadog.trace.util.stacktrace.StackUtils")); + final Throwable removed = StackUtils.filterUntil( + withStack(stack), + entry -> entry.getClassName().equals("datadog.trace.util.stacktrace.StackUtils")); assertArrayEquals(expected, removed.getStackTrace()); final Throwable noRemoval = StackUtils.filterUntil(withStack(stack), entry -> false); diff --git a/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java b/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java index 3ca823aa2d3..a347a63e673 100644 --- a/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java +++ b/internal-api/src/test/java/datadog/trace/util/stacktrace/StackWalkerTestUtil.java @@ -30,11 +30,9 @@ public static boolean isRunningJDK8WithHotSpot() { public static List getStackWalkFrom( final StackWalker walker, final String clazz) { final AtomicReference> result = new AtomicReference<>(); - AnyStackRunner.callWithinStack( - clazz, - () -> { - result.set(walker.walk(s -> s.collect(Collectors.toList()))); - }); + AnyStackRunner.callWithinStack(clazz, () -> { + result.set(walker.walk(s -> s.collect(Collectors.toList()))); + }); return result.get(); } } diff --git a/products/feature-flagging/feature-flagging-agent/src/main/java/com/datadog/featureflag/FeatureFlaggingSystem.java b/products/feature-flagging/feature-flagging-agent/src/main/java/com/datadog/featureflag/FeatureFlaggingSystem.java index 7f105d00213..8a924c95d5c 100644 --- a/products/feature-flagging/feature-flagging-agent/src/main/java/com/datadog/featureflag/FeatureFlaggingSystem.java +++ b/products/feature-flagging/feature-flagging-agent/src/main/java/com/datadog/featureflag/FeatureFlaggingSystem.java @@ -97,10 +97,9 @@ private static void initializeSystem(final SharedCommunicationObjects sco, final final ExposureWriter exposureWriter = new ExposureWriterImpl(sco, config); initialize(configService, exposureWriter); - final boolean evalCountsEnabled = - config - .configProvider() - .getBoolean(FeatureFlaggingConfig.FLAGGING_EVALUATION_COUNTS_ENABLED, true); + final boolean evalCountsEnabled = config + .configProvider() + .getBoolean(FeatureFlaggingConfig.FLAGGING_EVALUATION_COUNTS_ENABLED, true); FeatureFlaggingGateway.setFlagEvaluationEnqueueEnabled(evalCountsEnabled); if (evalCountsEnabled) { final FlagEvaluationWriterImpl evalWriter = new FlagEvaluationWriterImpl(sco, config); diff --git a/products/feature-flagging/feature-flagging-agent/src/test/java/com/datadog/featureflag/FeatureFlaggingSystemTest.java b/products/feature-flagging/feature-flagging-agent/src/test/java/com/datadog/featureflag/FeatureFlaggingSystemTest.java index 5b88389aefc..f50406b33e8 100644 --- a/products/feature-flagging/feature-flagging-agent/src/test/java/com/datadog/featureflag/FeatureFlaggingSystemTest.java +++ b/products/feature-flagging/feature-flagging-agent/src/test/java/com/datadog/featureflag/FeatureFlaggingSystemTest.java @@ -297,17 +297,15 @@ void explicitRemoteConfigUsesRemoteConfigService() { @Test @WithConfig(key = FEATURE_FLAGS_CONFIGURATION_SOURCE, value = "offline") void offlineConfigurationSourceDoesNotStartNetworkSource() { - assertNull( - FeatureFlaggingSystem.createConfigurationSourceService( - sharedCommunicationObjects(), Config.get())); + assertNull(FeatureFlaggingSystem.createConfigurationSourceService( + sharedCommunicationObjects(), Config.get())); } @Test @WithConfig(key = FEATURE_FLAGS_CONFIGURATION_SOURCE, value = "invalid") void invalidConfigurationSourceDoesNotStartNetworkSource() { - assertNull( - FeatureFlaggingSystem.createConfigurationSourceService( - sharedCommunicationObjects(), Config.get())); + assertNull(FeatureFlaggingSystem.createConfigurationSourceService( + sharedCommunicationObjects(), Config.get())); } @Test @@ -315,9 +313,8 @@ void unsupportedNormalizedConfigurationSourceDoesNotStartNetworkSource() { Config config = mock(Config.class); when(config.getFeatureFlaggingConfigurationSource()).thenReturn("invalid"); - assertNull( - FeatureFlaggingSystem.createConfigurationSourceService( - sharedCommunicationObjects(), config)); + assertNull(FeatureFlaggingSystem.createConfigurationSourceService( + sharedCommunicationObjects(), config)); } @Test @@ -350,7 +347,9 @@ void startWithInvalidConfigurationSourceDisablesSystem() { void initializationFailureClosesConfigurationSourceAndExposureWriter() { ConfigurationSourceService configService = mock(ConfigurationSourceService.class); ExposureWriter exposureWriter = mock(ExposureWriter.class); - doThrow(new IllegalStateException("exposure init failed")).when(exposureWriter).init(); + doThrow(new IllegalStateException("exposure init failed")) + .when(exposureWriter) + .init(); assertThrows( IllegalStateException.class, @@ -364,7 +363,9 @@ void initializationFailureClosesConfigurationSourceAndExposureWriter() { @Test void initializationFailureWithoutConfigurationSourceClosesExposureWriter() { ExposureWriter exposureWriter = mock(ExposureWriter.class); - doThrow(new IllegalStateException("exposure init failed")).when(exposureWriter).init(); + doThrow(new IllegalStateException("exposure init failed")) + .when(exposureWriter) + .init(); assertThrows( IllegalStateException.class, () -> FeatureFlaggingSystem.initialize(null, exposureWriter)); @@ -376,8 +377,12 @@ void initializationFailureWithoutConfigurationSourceClosesExposureWriter() { void initializationFailureClosesConfigurationSourceWhenExposureWriterCloseFails() { ConfigurationSourceService configService = mock(ConfigurationSourceService.class); ExposureWriter exposureWriter = mock(ExposureWriter.class); - doThrow(new IllegalStateException("exposure init failed")).when(exposureWriter).init(); - doThrow(new IllegalArgumentException("exposure close failed")).when(exposureWriter).close(); + doThrow(new IllegalStateException("exposure init failed")) + .when(exposureWriter) + .init(); + doThrow(new IllegalArgumentException("exposure close failed")) + .when(exposureWriter) + .close(); assertThrows( IllegalArgumentException.class, diff --git a/products/feature-flagging/feature-flagging-api/src/jmh/java/datadog/trace/api/openfeature/FlagEvalHookHotPathBenchmark.java b/products/feature-flagging/feature-flagging-api/src/jmh/java/datadog/trace/api/openfeature/FlagEvalHookHotPathBenchmark.java index e292424e53e..6b5529f611e 100644 --- a/products/feature-flagging/feature-flagging-api/src/jmh/java/datadog/trace/api/openfeature/FlagEvalHookHotPathBenchmark.java +++ b/products/feature-flagging/feature-flagging-api/src/jmh/java/datadog/trace/api/openfeature/FlagEvalHookHotPathBenchmark.java @@ -82,13 +82,12 @@ public class FlagEvalHookHotPathBenchmark { @Setup(Level.Trial) public void setUp() { final MutableContext ctx = buildContext(shape); - hookContext = - HookContext.builder() - .flagKey("bench-flag") - .type(FlagValueType.STRING) - .defaultValue("default") - .ctx(ctx) - .build(); + hookContext = HookContext.builder() + .flagKey("bench-flag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(ctx) + .build(); consentOnDetails = details(true); consentOffDetails = details(false); @@ -127,13 +126,12 @@ private static FlagEvaluationDetails details(final boolean observeFullEv .value("on-value") .variant("on") .reason(Reason.TARGETING_MATCH.name()) - .flagMetadata( - ImmutableMetadata.builder() - .addString("allocationKey", "alloc-1") - .addLong("__dd_eval_timestamp_ms", 1_700_000_000_000L) - .addBoolean( - DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, observeFullEvaluationData) - .build()) + .flagMetadata(ImmutableMetadata.builder() + .addString("allocationKey", "alloc-1") + .addLong("__dd_eval_timestamp_ms", 1_700_000_000_000L) + .addBoolean( + DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, observeFullEvaluationData) + .build()) .build(); } diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/DDEvaluator.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/DDEvaluator.java index a9f51b4a660..a6a83d27c01 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/DDEvaluator.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/DDEvaluator.java @@ -544,13 +544,12 @@ private static ProviderEvaluation resolveVariant( // Stamp eval-time at the resolution point so first/last_evaluation reflect evaluation time, // not hook-fire time. Passed to the hook via provider metadata "__dd_eval_timestamp_ms". - final ImmutableMetadata.ImmutableMetadataBuilder metadataBuilder = - ImmutableMetadata.builder() - .addString("flagKey", flag.key) - .addString("variationType", flag.variationType.name()) - .addString("allocationKey", allocation.key) - .addLong("__dd_eval_timestamp_ms", evalTimestampMs) - .addBoolean(METADATA_OBSERVE_FULL_EVALUATION_DATA, observeFullEvaluationData); + final ImmutableMetadata.ImmutableMetadataBuilder metadataBuilder = ImmutableMetadata.builder() + .addString("flagKey", flag.key) + .addString("variationType", flag.variationType.name()) + .addString("allocationKey", allocation.key) + .addLong("__dd_eval_timestamp_ms", evalTimestampMs) + .addBoolean(METADATA_OBSERVE_FULL_EVALUATION_DATA, observeFullEvaluationData); // Surface the UFC split's serial id and the allocation's doLog flag for APM span enrichment — // only when span enrichment is on, so a provider without enrichment pays nothing extra. // __dd_split_serial_id is omitted when the split carries no serial id; __dd_do_log is always @@ -562,18 +561,17 @@ private static ProviderEvaluation resolveVariant( } metadataBuilder.addBoolean(METADATA_DO_LOG, allocation.doLog != null && allocation.doLog); } - final ProviderEvaluation result = - ProviderEvaluation.builder() - .value(mappedValue) - .reason( - !isEmpty(allocation.rules) - ? Reason.TARGETING_MATCH.name() - : allocation.startAt != null || allocation.endAt != null - ? Reason.DEFAULT.name() - : !isEmpty(split.shards) ? Reason.SPLIT.name() : Reason.STATIC.name()) - .variant(variant.key) - .flagMetadata(metadataBuilder.build()) - .build(); + final ProviderEvaluation result = ProviderEvaluation.builder() + .value(mappedValue) + .reason( + !isEmpty(allocation.rules) + ? Reason.TARGETING_MATCH.name() + : allocation.startAt != null || allocation.endAt != null + ? Reason.DEFAULT.name() + : !isEmpty(split.shards) ? Reason.SPLIT.name() : Reason.STATIC.name()) + .variant(variant.key) + .flagMetadata(metadataBuilder.build()) + .build(); final boolean doLog = allocation.doLog != null && allocation.doLog; if (doLog) { dispatchExposure(key, result, context); @@ -655,13 +653,12 @@ private static void dispatchExposure( if (allocationKey == null || variantKey == null) { return; } - final ExposureEvent event = - new ExposureEvent( - System.currentTimeMillis(), - new datadog.trace.api.featureflag.exposure.Allocation(allocationKey), - new datadog.trace.api.featureflag.exposure.Flag(flag), - new datadog.trace.api.featureflag.exposure.Variant(variantKey), - new Subject(context.getTargetingKey(), flattenContext(context))); + final ExposureEvent event = new ExposureEvent( + System.currentTimeMillis(), + new datadog.trace.api.featureflag.exposure.Allocation(allocationKey), + new datadog.trace.api.featureflag.exposure.Flag(flag), + new datadog.trace.api.featureflag.exposure.Variant(variantKey), + new Subject(context.getTargetingKey(), flattenContext(context))); FeatureFlaggingGateway.dispatch(event); } diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalLoggingHook.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalLoggingHook.java index 322f11ac9e1..1f80a41612a 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalLoggingHook.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalLoggingHook.java @@ -115,10 +115,9 @@ public void finallyAfter( // Consent is read from metadata stamped by DDEvaluator (pinned to its ServerConfiguration). // Missing key = non-DD provider → false, the privacy-preserving default. - final Boolean consentFromMetadata = - metadata != null - ? metadata.getBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA) - : null; + final Boolean consentFromMetadata = metadata != null + ? metadata.getBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA) + : null; final boolean observeFullEvaluationData = consentFromMetadata != null && consentFromMetadata; // Error message: prefer the human-readable message under consent-on; under consent-off the @@ -151,16 +150,15 @@ public void finallyAfter( attrs = Collections.emptyMap(); } - w.enqueue( - new FlagEvalEvent( - flagKey, - variant, - allocationKey, - targetingKey, - errorMessage, - evalTimeMs, - observeFullEvaluationData, - attrs)); + w.enqueue(new FlagEvalEvent( + flagKey, + variant, + allocationKey, + targetingKey, + errorMessage, + evalTimeMs, + observeFullEvaluationData, + attrs)); } catch (LinkageError e) { // Never let EVP recording break flag evaluation } diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java index eba3b7ba4b5..1ee35b5d8c5 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java @@ -34,13 +34,13 @@ class FlagEvalMetrics implements Closeable { FlagEvalMetrics() { try { - Meter meter = GlobalOpenTelemetry.get().getMeterProvider().meterBuilder(METER_NAME).build(); - counter = - meter - .counterBuilder(METRIC_NAME) - .setUnit(METRIC_UNIT) - .setDescription(METRIC_DESC) - .build(); + Meter meter = + GlobalOpenTelemetry.get().getMeterProvider().meterBuilder(METER_NAME).build(); + counter = meter + .counterBuilder(METRIC_NAME) + .setUnit(METRIC_UNIT) + .setDescription(METRIC_DESC) + .build(); log.debug("Flag evaluation metrics initialized"); } catch (NoClassDefFoundError e) { @@ -68,11 +68,10 @@ void record( return; } try { - AttributesBuilder builder = - Attributes.builder() - .put(ATTR_FLAG_KEY, flagKey) - .put(ATTR_VARIANT, variant != null ? variant : "") - .put(ATTR_REASON, reason != null ? reason.toLowerCase() : "unknown"); + AttributesBuilder builder = Attributes.builder() + .put(ATTR_FLAG_KEY, flagKey) + .put(ATTR_VARIANT, variant != null ? variant : "") + .put(ATTR_REASON, reason != null ? reason.toLowerCase() : "unknown"); if (errorCode != null) { builder.put(ATTR_ERROR_TYPE, errorCode.name().toLowerCase()); diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/Provider.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/Provider.java index 17009d9933a..b3dd51abb14 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/Provider.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/Provider.java @@ -79,10 +79,9 @@ public Provider(final Options options) { // Span enrichment is wired ONLY when the gate is on — off means no capture hook and no idle // per-evaluation overhead. - final boolean spanEnrichmentEnabled = - spanEnrichmentEnabledOverride != null - ? spanEnrichmentEnabledOverride - : SpanEnrichmentGate.isEnabled(); + final boolean spanEnrichmentEnabled = spanEnrichmentEnabledOverride != null + ? spanEnrichmentEnabledOverride + : SpanEnrichmentGate.isEnabled(); this.spanEnrichmentHook = spanEnrichmentEnabled ? new SpanEnrichmentHook() : null; // Precompute the immutable hook list once so getProviderHooks() (called on every evaluation) diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/SpanEnrichmentHook.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/SpanEnrichmentHook.java index 40e998a6546..62c0cdf8e1f 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/SpanEnrichmentHook.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/SpanEnrichmentHook.java @@ -61,9 +61,8 @@ public void finallyAfter( } else if (details.getVariant() == null) { // Runtime-default detection = MISSING VARIANT (never a reason enum). Unwrap any OpenFeature // Value to a native Java type here so the seam carries only JDK types. - FeatureFlaggingGateway.dispatch( - SpanEnrichmentEvent.runtimeDefault( - details.getFlagKey(), unwrapDefaultValue(details.getValue()))); + FeatureFlaggingGateway.dispatch(SpanEnrichmentEvent.runtimeDefault( + details.getFlagKey(), unwrapDefaultValue(details.getValue()))); } } catch (final Throwable t) { // Never let span enrichment break flag evaluation; a debug line aids diagnosis if it does. diff --git a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/DDEvaluatorTest.java b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/DDEvaluatorTest.java index aa4fe133c0d..b5dca6f3c2c 100644 --- a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/DDEvaluatorTest.java +++ b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/DDEvaluatorTest.java @@ -70,12 +70,11 @@ public class DDEvaluatorTest { private static final String CANONICAL_FIXTURE_PATH = "dd-smoke-tests/openfeature/src/test/resources/ffe-system-test-data"; - private static final Moshi MOSHI = - new Moshi.Builder() - .add(Date.class, new DateAdapter()) - .add(ShardAdapter.FACTORY) - .add(FlagMapAdapter.FACTORY) - .build(); + private static final Moshi MOSHI = new Moshi.Builder() + .add(Date.class, new DateAdapter()) + .add(ShardAdapter.FACTORY) + .add(FlagMapAdapter.FACTORY) + .build(); private static final JsonAdapter CONFIG_ADAPTER = MOSHI.adapter(ServerConfiguration.class); private static final Type FIXTURE_LIST_TYPE = @@ -239,11 +238,9 @@ public void testEvaluateUnsignedShardRange() { variations.put("on", new Variant("on", 1)); // The selected shard is above Integer.MAX_VALUE, so this test proves that evaluation uses // unsigned semantics after binary-compatible int storage. - final Shard shard = - new Shard( - "salt", - singletonList(new ShardRange((int) 3_699_531_192L, (int) 3_699_531_193L)), - (int) MAX_UNSIGNED_INT); + final Shard shard = new Shard( + "salt", singletonList(new ShardRange((int) 3_699_531_192L, (int) 3_699_531_193L)), (int) + MAX_UNSIGNED_INT); final Split split = new Split(singletonList(shard), "on", emptyMap(), null); final Allocation allocation = new Allocation("alloc-1", null, null, null, singletonList(split), Boolean.FALSE); @@ -481,9 +478,8 @@ public void numericConditionOnTargetingKeyErrorMessageNeverContainsPiiUnderConse private static ProviderEvaluation evaluateWithNumericRuleOnId( final String targetingKey, final boolean observeFullEvaluationData) { final Map flags = new HashMap<>(); - final List rules = - singletonList( - new Rule(singletonList(new ConditionConfiguration(ConditionOperator.GT, "id", 0)))); + final List rules = singletonList( + new Rule(singletonList(new ConditionConfiguration(ConditionOperator.GT, "id", 0)))); // Split must be non-empty so the allocation is considered a match target; its contents don't // matter because the rule throws before a split is picked. final Allocation allocation = @@ -534,9 +530,8 @@ private static Flag semverFlag(final ConditionOperator operator, final String co condition.semverComparand = parsed; final Rule rule = new Rule(singletonList(condition)); final Split split = new Split(emptyList(), "on", null, null); - final Allocation allocation = - Allocation.fromInstants( - "targeted", singletonList(rule), null, null, singletonList(split), false); + final Allocation allocation = Allocation.fromInstants( + "targeted", singletonList(rule), null, null, singletonList(split), false); final Map variations = new HashMap<>(); variations.put("on", new Variant("on", true)); return new Flag("test-flag", true, ValueType.BOOLEAN, variations, singletonList(allocation)); @@ -676,21 +671,17 @@ public void testEvaluateMalformedFlagReturnsParseError() { private static Arguments[] flatteningTestCases() { final List arguments = new ArrayList<>(); arguments.add(Arguments.of(emptyMap(), emptyMap())); - arguments.add( - Arguments.of( - mapOf("integer", 1, "double", 23D, "boolean", true, "string", "string", "null", null), - mapOf("integer", 1, "double", 23D, "boolean", true, "string", "string", "null", null))); - arguments.add( - Arguments.of( - mapOf("list", asList(1, 2, singletonList(4))), - mapOf("list[0]", 1, "list[1]", 2, "list[2][0]", 4))); - arguments.add( - Arguments.of( - mapOf("map", mapOf("key1", 1, "key2", 2, "key3", mapOf("key4", 4))), - mapOf("map.key1", 1, "map.key2", 2, "map.key3.key4", 4))); - arguments.add( - Arguments.of( - mapOf("plan", "gold", "cohort", "gold"), mapOf("plan", "gold", "cohort", "gold"))); + arguments.add(Arguments.of( + mapOf("integer", 1, "double", 23D, "boolean", true, "string", "string", "null", null), + mapOf("integer", 1, "double", 23D, "boolean", true, "string", "string", "null", null))); + arguments.add(Arguments.of( + mapOf("list", asList(1, 2, singletonList(4))), + mapOf("list[0]", 1, "list[1]", 2, "list[2][0]", 4))); + arguments.add(Arguments.of( + mapOf("map", mapOf("key1", 1, "key2", 2, "key3", mapOf("key4", 4))), + mapOf("map.key1", 1, "map.key2", 2, "map.key3.key4", 4))); + arguments.add(Arguments.of( + mapOf("plan", "gold", "cohort", "gold"), mapOf("plan", "gold", "cohort", "gold"))); final Instant instant = Instant.parse("2026-07-10T12:34:56Z"); arguments.add(Arguments.of(mapOf("instant", instant), mapOf("instant", instant.toString()))); return arguments.toArray(new Arguments[0]); @@ -800,7 +791,8 @@ public void testCopyPrunedContextCapsStructureWidth() { final DDEvaluator.CopyResult result = DDEvaluator.copyPrunedContext(context); - long structKeys = result.attrs.keySet().stream().filter(k -> k.startsWith("struct.")).count(); + long structKeys = + result.attrs.keySet().stream().filter(k -> k.startsWith("struct.")).count(); assertThat(structKeys, equalTo((long) DDEvaluator.MAX_STRUCTURE_PROPERTIES)); assertThat(result.truncatedReason, equalTo("max_structure_properties")); } @@ -998,11 +990,10 @@ private static List canonicalTestCases() throws IOException { final List result = new ArrayList<>(); try (final Stream paths = Files.list(evaluationCases)) { - final List files = - paths - .filter(path -> path.getFileName().toString().endsWith(".json")) - .sorted((left, right) -> left.getFileName().compareTo(right.getFileName())) - .collect(Collectors.toList()); + final List files = paths + .filter(path -> path.getFileName().toString().endsWith(".json")) + .sorted((left, right) -> left.getFileName().compareTo(right.getFileName())) + .collect(Collectors.toList()); for (final Path file : files) { final List testCases = FIXTURE_LIST_ADAPTER.fromJson(read(file)); if (testCases == null) { @@ -1109,13 +1100,12 @@ private static final class FixtureResult { * Mirrors the production parser's binary-compatible uint32 representation for fixture parsing. */ private static final class ShardAdapter extends JsonAdapter { - private static final JsonAdapter.Factory FACTORY = - (type, annotations, moshi) -> { - if (!annotations.isEmpty() || type != Shard.class) { - return null; - } - return new ShardAdapter(moshi.adapter(ShardJson.class)); - }; + private static final JsonAdapter.Factory FACTORY = (type, annotations, moshi) -> { + if (!annotations.isEmpty() || type != Shard.class) { + return null; + } + return new ShardAdapter(moshi.adapter(ShardJson.class)); + }; private final JsonAdapter delegate; @@ -1178,13 +1168,12 @@ private static final class FlagMapAdapter extends JsonAdapter> private static final Type FLAGS_TYPE = Types.newParameterizedType(Map.class, String.class, Flag.class); - private static final JsonAdapter.Factory FACTORY = - (type, annotations, moshi) -> { - if (!annotations.isEmpty() || !Types.equals(type, FLAGS_TYPE)) { - return null; - } - return new FlagMapAdapter(moshi.adapter(Flag.class)); - }; + private static final JsonAdapter.Factory FACTORY = (type, annotations, moshi) -> { + if (!annotations.isEmpty() || !Types.equals(type, FLAGS_TYPE)) { + return null; + } + return new FlagMapAdapter(moshi.adapter(Flag.class)); + }; private final JsonAdapter flagAdapter; diff --git a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalLoggingHookTest.java b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalLoggingHookTest.java index 3b7910d4712..ea1527b0df7 100644 --- a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalLoggingHookTest.java +++ b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalLoggingHookTest.java @@ -127,13 +127,12 @@ void finallyAfterEnqueuesEventWithAllBasicFields() { final AtomicReference captured = new AtomicReference<>(); final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); - final FlagEvaluationDetails det = - details( - "my-flag", - "on-value", - "on", - Reason.TARGETING_MATCH.name(), - ImmutableMetadata.builder().addString("allocationKey", "alloc-1").build()); + final FlagEvaluationDetails det = details( + "my-flag", + "on-value", + "on", + Reason.TARGETING_MATCH.name(), + ImmutableMetadata.builder().addString("allocationKey", "alloc-1").build()); hook.finallyAfter(null, det, Collections.emptyMap()); @@ -152,13 +151,12 @@ void variantIsTheVariantKeyNotTheEvaluatedValue() { final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); // value and variant DIFFER, so a value-vs-variant mistake is detectable. - final FlagEvaluationDetails det = - details( - "g1-flag", - "the-evaluated-value", // value - "the-variant-key", // variant - Reason.TARGETING_MATCH.name(), - null); + final FlagEvaluationDetails det = details( + "g1-flag", + "the-evaluated-value", // value + "the-variant-key", // variant + Reason.TARGETING_MATCH.name(), + null); hook.finallyAfter(null, det, Collections.emptyMap()); @@ -177,16 +175,15 @@ void evalTimeMsComesFromMetadataWhenPresent() { final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); final long expectedTimestamp = 1_700_000_000_000L; - final FlagEvaluationDetails det = - details( - "ts-flag", - "v", - "v", - Reason.SPLIT.name(), - ImmutableMetadata.builder() - .addString("allocationKey", "a") - .addLong("__dd_eval_timestamp_ms", expectedTimestamp) - .build()); + final FlagEvaluationDetails det = details( + "ts-flag", + "v", + "v", + Reason.SPLIT.name(), + ImmutableMetadata.builder() + .addString("allocationKey", "a") + .addLong("__dd_eval_timestamp_ms", expectedTimestamp) + .build()); hook.finallyAfter(null, det, Collections.emptyMap()); @@ -244,15 +241,14 @@ void errorMessageCapturedFromDetailsUnderConsentOn() { final AtomicReference captured = new AtomicReference<>(); final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); - final FlagEvaluationDetails det = - FlagEvaluationDetails.builder() - .flagKey("err-flag") - .value("default") - .reason(Reason.ERROR.name()) - .errorCode(ErrorCode.TYPE_MISMATCH) - .errorMessage("value does not match declared type") - .flagMetadata(consentOnMetadata()) - .build(); + final FlagEvaluationDetails det = FlagEvaluationDetails.builder() + .flagKey("err-flag") + .value("default") + .reason(Reason.ERROR.name()) + .errorCode(ErrorCode.TYPE_MISMATCH) + .errorMessage("value does not match declared type") + .flagMetadata(consentOnMetadata()) + .build(); hook.finallyAfter(null, det, Collections.emptyMap()); @@ -272,15 +268,14 @@ void errorMessageReplacedByErrorCodeUnderConsentOff() { final AtomicReference captured = new AtomicReference<>(); final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); - final FlagEvaluationDetails det = - FlagEvaluationDetails.builder() - .flagKey("err-flag") - .value("default") - .reason(Reason.ERROR.name()) - .errorCode(ErrorCode.TYPE_MISMATCH) - .errorMessage("For input string: \"jane.doe@datadoghq.com\"") - .flagMetadata(consentOffMetadata()) - .build(); + final FlagEvaluationDetails det = FlagEvaluationDetails.builder() + .flagKey("err-flag") + .value("default") + .reason(Reason.ERROR.name()) + .errorCode(ErrorCode.TYPE_MISMATCH) + .errorMessage("For input string: \"jane.doe@datadoghq.com\"") + .flagMetadata(consentOffMetadata()) + .build(); hook.finallyAfter(null, det, Collections.emptyMap()); @@ -302,14 +297,13 @@ void errorMessageDroppedWhenConsentOffAndNoErrorCode() { final AtomicReference captured = new AtomicReference<>(); final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); - final FlagEvaluationDetails det = - FlagEvaluationDetails.builder() - .flagKey("err-flag") - .value("default") - .reason(Reason.ERROR.name()) - .errorMessage("For input string: \"jane.doe@datadoghq.com\"") - .flagMetadata(consentOffMetadata()) - .build(); + final FlagEvaluationDetails det = FlagEvaluationDetails.builder() + .flagKey("err-flag") + .value("default") + .reason(Reason.ERROR.name()) + .errorMessage("For input string: \"jane.doe@datadoghq.com\"") + .flagMetadata(consentOffMetadata()) + .build(); hook.finallyAfter(null, det, Collections.emptyMap()); @@ -324,13 +318,12 @@ void errorCodeUsedAsFallbackWhenMessageEmpty() { final AtomicReference captured = new AtomicReference<>(); final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); - final FlagEvaluationDetails det = - FlagEvaluationDetails.builder() - .flagKey("err-flag") - .value("default") - .reason(Reason.ERROR.name()) - .errorCode(ErrorCode.FLAG_NOT_FOUND) - .build(); + final FlagEvaluationDetails det = FlagEvaluationDetails.builder() + .flagKey("err-flag") + .value("default") + .reason(Reason.ERROR.name()) + .errorCode(ErrorCode.FLAG_NOT_FOUND) + .build(); hook.finallyAfter(null, det, Collections.emptyMap()); @@ -407,20 +400,14 @@ void countContextTruncatedCalledWhenContextIsTruncated() { java.util.Arrays.fill(longChars, 'x'); final MutableContext ctx = new MutableContext("user-1"); ctx.add("oversized", new String(longChars)); - final HookContext hookCtx = - HookContext.builder() - .flagKey("flag") - .type(dev.openfeature.sdk.FlagValueType.STRING) - .defaultValue("default") - .ctx(ctx) - .build(); - final FlagEvaluationDetails det = - details( - "flag", - "v", - "v", - dev.openfeature.sdk.Reason.TARGETING_MATCH.name(), - consentOnMetadata()); + final HookContext hookCtx = HookContext.builder() + .flagKey("flag") + .type(dev.openfeature.sdk.FlagValueType.STRING) + .defaultValue("default") + .ctx(ctx) + .build(); + final FlagEvaluationDetails det = details( + "flag", "v", "v", dev.openfeature.sdk.Reason.TARGETING_MATCH.name(), consentOnMetadata()); hook.finallyAfter(hookCtx, det, Collections.emptyMap()); @@ -436,20 +423,14 @@ void countContextTruncatedNotCalledWhenNoTruncation() { final MutableContext ctx = new MutableContext("user-1"); ctx.add("region", "us-east-1"); - final HookContext hookCtx = - HookContext.builder() - .flagKey("flag") - .type(dev.openfeature.sdk.FlagValueType.STRING) - .defaultValue("default") - .ctx(ctx) - .build(); - final FlagEvaluationDetails det = - details( - "flag", - "v", - "v", - dev.openfeature.sdk.Reason.TARGETING_MATCH.name(), - consentOnMetadata()); + final HookContext hookCtx = HookContext.builder() + .flagKey("flag") + .type(dev.openfeature.sdk.FlagValueType.STRING) + .defaultValue("default") + .ctx(ctx) + .build(); + final FlagEvaluationDetails det = details( + "flag", "v", "v", dev.openfeature.sdk.Reason.TARGETING_MATCH.name(), consentOnMetadata()); hook.finallyAfter(hookCtx, det, Collections.emptyMap()); @@ -461,12 +442,10 @@ void countContextTruncatedNotCalledWhenNoTruncation() { void enqueueDisabledIsNoOpBeforeWriterLookup() { FeatureFlaggingGateway.setFlagEvaluationEnqueueEnabled(false); final AtomicReference writerResolved = new AtomicReference<>(false); - final FlagEvalLoggingHook hook = - new FlagEvalLoggingHook<>( - () -> { - writerResolved.set(true); - throw new AssertionError("writer should not be resolved when enqueue is disabled"); - }); + final FlagEvalLoggingHook hook = new FlagEvalLoggingHook<>(() -> { + writerResolved.set(true); + throw new AssertionError("writer should not be resolved when enqueue is disabled"); + }); final FlagEvaluationDetails det = details("flag", "v", "v", Reason.TARGETING_MATCH.name(), null); @@ -489,11 +468,9 @@ void writerNullIsNoOp() { @Test void writerLookupLinkageErrorIsNoOp() { - final FlagEvalLoggingHook hook = - new FlagEvalLoggingHook<>( - () -> { - throw new NoSuchMethodError("old bootstrap"); - }); + final FlagEvalLoggingHook hook = new FlagEvalLoggingHook<>(() -> { + throw new NoSuchMethodError("old bootstrap"); + }); final FlagEvaluationDetails det = details("flag", "v", "v", Reason.TARGETING_MATCH.name(), null); @@ -548,13 +525,12 @@ void contextAttributesAreFlattenedAndConvertedInline() { new MutableContext(Value.objectToValue(attributes).asStructure().asMap()); context.setTargetingKey("user-42"); - final HookContext hookCtx = - HookContext.builder() - .flagKey("ctx-flag") - .type(FlagValueType.STRING) - .defaultValue("default") - .ctx(context) - .build(); + final HookContext hookCtx = HookContext.builder() + .flagKey("ctx-flag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(context) + .build(); final FlagEvaluationDetails det = details("ctx-flag", "v", "v", Reason.TARGETING_MATCH.name(), consentOnMetadata()); @@ -587,13 +563,12 @@ void contextAttributesUseEnqueueTimeSnapshot() { cohorts.add(Value.objectToValue("beta")); context.add("cohorts", cohorts); - final HookContext hookCtx = - HookContext.builder() - .flagKey("ctx-flag") - .type(FlagValueType.STRING) - .defaultValue("default") - .ctx(context) - .build(); + final HookContext hookCtx = HookContext.builder() + .flagKey("ctx-flag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(context) + .build(); final FlagEvaluationDetails det = details("ctx-flag", "v", "v", Reason.TARGETING_MATCH.name(), consentOnMetadata()); @@ -643,17 +618,15 @@ void protectedPathSkipsEvaluationContextCapture() { final MutableContext context = new MutableContext("user-1"); context.add("region", "us-east-1"); - final HookContext hookCtx = - HookContext.builder() - .flagKey("ctx-flag") - .type(FlagValueType.STRING) - .defaultValue("default") - .ctx(context) - .build(); - final ImmutableMetadata consentOff = - ImmutableMetadata.builder() - .addBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, false) - .build(); + final HookContext hookCtx = HookContext.builder() + .flagKey("ctx-flag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(context) + .build(); + final ImmutableMetadata consentOff = ImmutableMetadata.builder() + .addBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, false) + .build(); hook.finallyAfter( hookCtx, @@ -683,12 +656,11 @@ void ignoresGatewayConsentEvenWhenItDisagreesWithMetadata() { private FlagEvalEvent enqueuedEventWithConsentMetadata(final Boolean consent) { final AtomicReference captured = new AtomicReference<>(); final FlagEvalLoggingHook hook = hookWithWriter(capturingWriter(captured)); - final ImmutableMetadata metadata = - consent == null - ? null - : ImmutableMetadata.builder() - .addBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, consent) - .build(); + final ImmutableMetadata metadata = consent == null + ? null + : ImmutableMetadata.builder() + .addBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, consent) + .build(); hook.finallyAfter( hookCtxWithTargetingKey("obs-flag", "user-1"), details("obs-flag", "on", "on", Reason.TARGETING_MATCH.name(), metadata), diff --git a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsHookTest.java b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsHookTest.java index 322a06d2de7..72111bd75fe 100644 --- a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsHookTest.java +++ b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsHookTest.java @@ -20,15 +20,15 @@ void finallyAfterRecordsBasicEvaluation() { FlagEvalMetrics metrics = mock(FlagEvalMetrics.class); FlagEvalMetricsHook hook = new FlagEvalMetricsHook(metrics); - FlagEvaluationDetails details = - FlagEvaluationDetails.builder() - .flagKey("my-flag") - .value("on-value") - .variant("on") - .reason(Reason.TARGETING_MATCH.name()) - .flagMetadata( - ImmutableMetadata.builder().addString("allocationKey", "default-alloc").build()) - .build(); + FlagEvaluationDetails details = FlagEvaluationDetails.builder() + .flagKey("my-flag") + .value("on-value") + .variant("on") + .reason(Reason.TARGETING_MATCH.name()) + .flagMetadata(ImmutableMetadata.builder() + .addString("allocationKey", "default-alloc") + .build()) + .build(); hook.finallyAfter(null, details, Collections.emptyMap()); @@ -46,13 +46,12 @@ void finallyAfterRecordsErrorEvaluation() { FlagEvalMetrics metrics = mock(FlagEvalMetrics.class); FlagEvalMetricsHook hook = new FlagEvalMetricsHook(metrics); - FlagEvaluationDetails details = - FlagEvaluationDetails.builder() - .flagKey("missing-flag") - .value("default") - .reason(Reason.ERROR.name()) - .errorCode(ErrorCode.FLAG_NOT_FOUND) - .build(); + FlagEvaluationDetails details = FlagEvaluationDetails.builder() + .flagKey("missing-flag") + .value("default") + .reason(Reason.ERROR.name()) + .errorCode(ErrorCode.FLAG_NOT_FOUND) + .build(); hook.finallyAfter(null, details, Collections.emptyMap()); @@ -70,13 +69,12 @@ void finallyAfterHandlesNullFlagMetadata() { FlagEvalMetrics metrics = mock(FlagEvalMetrics.class); FlagEvalMetricsHook hook = new FlagEvalMetricsHook(metrics); - FlagEvaluationDetails details = - FlagEvaluationDetails.builder() - .flagKey("my-flag") - .value(true) - .variant("on") - .reason(Reason.TARGETING_MATCH.name()) - .build(); + FlagEvaluationDetails details = FlagEvaluationDetails.builder() + .flagKey("my-flag") + .value(true) + .variant("on") + .reason(Reason.TARGETING_MATCH.name()) + .build(); hook.finallyAfter(null, details, Collections.emptyMap()); @@ -89,8 +87,10 @@ void finallyAfterHandlesNullVariantAndReason() { FlagEvalMetrics metrics = mock(FlagEvalMetrics.class); FlagEvalMetricsHook hook = new FlagEvalMetricsHook(metrics); - FlagEvaluationDetails details = - FlagEvaluationDetails.builder().flagKey("my-flag").value("default").build(); + FlagEvaluationDetails details = FlagEvaluationDetails.builder() + .flagKey("my-flag") + .value("default") + .build(); hook.finallyAfter(null, details, Collections.emptyMap()); @@ -112,13 +112,12 @@ void finallyAfterNeverThrows() { void finallyAfterIsNoOpWhenMetricsIsNull() { FlagEvalMetricsHook hook = new FlagEvalMetricsHook(null); - FlagEvaluationDetails details = - FlagEvaluationDetails.builder() - .flagKey("my-flag") - .value(true) - .variant("on") - .reason(Reason.TARGETING_MATCH.name()) - .build(); + FlagEvaluationDetails details = FlagEvaluationDetails.builder() + .flagKey("my-flag") + .value(true) + .variant("on") + .reason(Reason.TARGETING_MATCH.name()) + .build(); // Should not throw hook.finallyAfter(null, details, Collections.emptyMap()); diff --git a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java index 214fadc7274..c77deceecef 100644 --- a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java +++ b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java @@ -145,12 +145,11 @@ void defaultConstructorUsesOpenTelemetryApiOnly() { } private static void assertAttribute(Attributes attrs, String key, String expected) { - String value = - attrs.asMap().entrySet().stream() - .filter(e -> e.getKey().getKey().equals(key)) - .map(e -> e.getValue().toString()) - .findFirst() - .orElse(null); + String value = attrs.asMap().entrySet().stream() + .filter(e -> e.getKey().getKey().equals(key)) + .map(e -> e.getValue().toString()) + .findFirst() + .orElse(null); if (!expected.equals(value)) { throw new AssertionError("Expected attribute " + key + "=" + expected + " but got " + value); } diff --git a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/ProviderTest.java b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/ProviderTest.java index d7adf645e74..27a2bf2061d 100644 --- a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/ProviderTest.java +++ b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/ProviderTest.java @@ -127,37 +127,36 @@ public void testSetProviderAndWaitTimeoutRecoversWhenConfigurationArrives() thro public void testSetProviderAndWaitCompletesWhenConfigurationArrivesAtTimeoutBoundary() throws Exception { final Provider[] providerRef = new Provider[1]; - final Evaluator evaluator = - new Evaluator() { - private boolean hasConfiguration; + final Evaluator evaluator = new Evaluator() { + private boolean hasConfiguration; - @Override - public boolean initialize( - final long timeout, - final java.util.concurrent.TimeUnit timeUnit, - final EvaluationContext context) { - hasConfiguration = true; - providerRef[0].onConfigurationChange(); - return false; - } + @Override + public boolean initialize( + final long timeout, + final java.util.concurrent.TimeUnit timeUnit, + final EvaluationContext context) { + hasConfiguration = true; + providerRef[0].onConfigurationChange(); + return false; + } - @Override - public boolean hasConfiguration() { - return hasConfiguration; - } + @Override + public boolean hasConfiguration() { + return hasConfiguration; + } - @Override - public void shutdown() {} + @Override + public void shutdown() {} - @Override - public ProviderEvaluation evaluate( - final Class target, - final String key, - final T defaultValue, - final EvaluationContext context) { - return ProviderEvaluation.builder().value(defaultValue).build(); - } - }; + @Override + public ProviderEvaluation evaluate( + final Class target, + final String key, + final T defaultValue, + final EvaluationContext context) { + return ProviderEvaluation.builder().value(defaultValue).build(); + } + }; final OpenFeatureAPI api = OpenFeatureAPI.getInstance(); providerRef[0] = new Provider(new Options().initTimeout(10, MILLISECONDS), evaluator); @@ -170,39 +169,38 @@ public ProviderEvaluation evaluate( @Test public void testSetProviderAndWaitFailsWhenConfigurationIsRemovedBeforeInitializationCompletes() { final Provider[] providerRef = new Provider[1]; - final Evaluator evaluator = - new Evaluator() { - private boolean hasConfiguration; + final Evaluator evaluator = new Evaluator() { + private boolean hasConfiguration; - @Override - public boolean initialize( - final long timeout, - final java.util.concurrent.TimeUnit timeUnit, - final EvaluationContext context) { - hasConfiguration = true; - providerRef[0].onConfigurationChange(); - hasConfiguration = false; - providerRef[0].onConfigurationChange(); - return true; - } + @Override + public boolean initialize( + final long timeout, + final java.util.concurrent.TimeUnit timeUnit, + final EvaluationContext context) { + hasConfiguration = true; + providerRef[0].onConfigurationChange(); + hasConfiguration = false; + providerRef[0].onConfigurationChange(); + return true; + } - @Override - public boolean hasConfiguration() { - return hasConfiguration; - } + @Override + public boolean hasConfiguration() { + return hasConfiguration; + } - @Override - public void shutdown() {} + @Override + public void shutdown() {} - @Override - public ProviderEvaluation evaluate( - final Class target, - final String key, - final T defaultValue, - final EvaluationContext context) { - return ProviderEvaluation.builder().value(defaultValue).build(); - } - }; + @Override + public ProviderEvaluation evaluate( + final Class target, + final String key, + final T defaultValue, + final EvaluationContext context) { + return ProviderEvaluation.builder().value(defaultValue).build(); + } + }; final OpenFeatureAPI api = OpenFeatureAPI.getInstance(); providerRef[0] = new Provider(new Options().initTimeout(10, MILLISECONDS), evaluator); @@ -216,42 +214,41 @@ public ProviderEvaluation evaluate( @Test public void testInitializationErrorDoesNotOverwriteRecoveredReadyState() throws Exception { final Provider[] providerRef = new Provider[1]; - final Evaluator evaluator = - new Evaluator() { - private boolean hasConfiguration; + final Evaluator evaluator = new Evaluator() { + private boolean hasConfiguration; - @Override - public boolean initialize( - final long timeout, - final java.util.concurrent.TimeUnit timeUnit, - final EvaluationContext context) { - hasConfiguration = true; - providerRef[0].onConfigurationChange(); - hasConfiguration = false; - providerRef[0].onConfigurationChange(); - hasConfiguration = true; - providerRef[0].onConfigurationChange(); - throw new ProviderNotReadyError( - "Provider timed-out while waiting for initial configuration"); - } + @Override + public boolean initialize( + final long timeout, + final java.util.concurrent.TimeUnit timeUnit, + final EvaluationContext context) { + hasConfiguration = true; + providerRef[0].onConfigurationChange(); + hasConfiguration = false; + providerRef[0].onConfigurationChange(); + hasConfiguration = true; + providerRef[0].onConfigurationChange(); + throw new ProviderNotReadyError( + "Provider timed-out while waiting for initial configuration"); + } - @Override - public boolean hasConfiguration() { - return hasConfiguration; - } + @Override + public boolean hasConfiguration() { + return hasConfiguration; + } - @Override - public void shutdown() {} + @Override + public void shutdown() {} - @Override - public ProviderEvaluation evaluate( - final Class target, - final String key, - final T defaultValue, - final EvaluationContext context) { - return ProviderEvaluation.builder().value(defaultValue).build(); - } - }; + @Override + public ProviderEvaluation evaluate( + final Class target, + final String key, + final T defaultValue, + final EvaluationContext context) { + return ProviderEvaluation.builder().value(defaultValue).build(); + } + }; providerRef[0] = new Provider(new Options().initTimeout(10, MILLISECONDS), evaluator); @@ -308,15 +305,13 @@ public void testFailureToLoadInternalApi() { assertThrows( FatalError.class, - () -> - api.setProviderAndWait( - new Provider() { - @Override - protected Class loadEvaluatorClass() throws ClassNotFoundException { - throw new ClassNotFoundException( - "Class " + FeatureFlaggingGateway.class.getName() + " not found"); - } - })); + () -> api.setProviderAndWait(new Provider() { + @Override + protected Class loadEvaluatorClass() throws ClassNotFoundException { + throw new ClassNotFoundException( + "Class " + FeatureFlaggingGateway.class.getName() + " not found"); + } + })); } @Test @@ -355,18 +350,16 @@ public void testClientEvaluationRoutesThroughFlagEvalLoggingHook() throws Except when(evaluator.initialize(eq(10L), eq(SECONDS), any())).thenReturn(true); when(evaluator.hasConfiguration()).thenReturn(true); when(evaluator.evaluate(eq(String.class), eq("logged-flag"), eq("default"), any())) - .thenReturn( - ProviderEvaluation.builder() - .value("value") - .reason("STATIC") - .variant("variant-1") - .flagMetadata( - ImmutableMetadata.builder() - .addString("allocationKey", "allocation-1") - .addLong("__dd_eval_timestamp_ms", 1_700_000_000_000L) - .addBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, true) - .build()) - .build()); + .thenReturn(ProviderEvaluation.builder() + .value("value") + .reason("STATIC") + .variant("variant-1") + .flagMetadata(ImmutableMetadata.builder() + .addString("allocationKey", "allocation-1") + .addLong("__dd_eval_timestamp_ms", 1_700_000_000_000L) + .addBoolean(DDEvaluator.METADATA_OBSERVE_FULL_EVALUATION_DATA, true) + .build()) + .build()); final OpenFeatureAPI api = OpenFeatureAPI.getInstance(); api.setProviderAndWait(new Provider(new Options().initTimeout(10, SECONDS), evaluator)); final MutableContext context = new MutableContext("user-1"); @@ -442,12 +435,10 @@ public void testProviderEvaluation( when(evaluator.initialize(eq(10L), eq(SECONDS), any())).thenReturn(true); when(evaluator.hasConfiguration()).thenReturn(true); when(evaluator.evaluate(any(), any(), any(), any())) - .thenAnswer( - invocation -> - ProviderEvaluation.builder() - .value(invocation.getArgument(2)) - .reason("MOCK") - .build()); + .thenAnswer(invocation -> ProviderEvaluation.builder() + .value(invocation.getArgument(2)) + .reason("MOCK") + .build()); final OpenFeatureAPI api = OpenFeatureAPI.getInstance(); api.setProviderAndWait(new Provider(new Options().initTimeout(10, SECONDS), evaluator)); final Client client = api.getClient(); @@ -470,11 +461,10 @@ private static String initializationState(final Provider provider) throws Except private static Consumer completingHandler( final CompletableFuture event) { final Consumer handler = mock(Consumer.class); - doAnswer( - invocation -> { - event.complete(invocation.getArgument(0)); - return null; - }) + doAnswer(invocation -> { + event.complete(invocation.getArgument(0)); + return null; + }) .when(handler) .accept(any()); return handler; diff --git a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/SpanEnrichmentHookTest.java b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/SpanEnrichmentHookTest.java index 2ce0931e116..c779327b8a5 100644 --- a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/SpanEnrichmentHookTest.java +++ b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/SpanEnrichmentHookTest.java @@ -118,11 +118,10 @@ void serialIdWithoutDoLogStillDispatchesSerialButNotDoLog() { @Test void wrongTypedSerialIdDispatchesNothing() { // Defensive: a non-integer value under the serial-id key (wrong type) is ignored, not crashed. - final ImmutableMetadata bad = - ImmutableMetadata.builder() - .addString(SpanEnrichmentHook.METADATA_SERIAL_ID, "not-a-number") - .addBoolean(SpanEnrichmentHook.METADATA_DO_LOG, true) - .build(); + final ImmutableMetadata bad = ImmutableMetadata.builder() + .addString(SpanEnrichmentHook.METADATA_SERIAL_ID, "not-a-number") + .addBoolean(SpanEnrichmentHook.METADATA_DO_LOG, true) + .build(); new SpanEnrichmentHook() .finallyAfter( ctx("flag", "user-1"), details("flag", "on", "v", bad), Collections.emptyMap()); @@ -157,7 +156,11 @@ void missingVariantUnwrapsOpenFeatureValueStructureToNativeMap() { new SpanEnrichmentHook() .finallyAfter( ctx("struct-flag", "user-1"), - details("struct-flag", null, structureDefault, ImmutableMetadata.builder().build()), + details( + "struct-flag", + null, + structureDefault, + ImmutableMetadata.builder().build()), Collections.emptyMap()); assertEquals(1, captured.size()); diff --git a/products/feature-flagging/feature-flagging-bootstrap/src/test/java/datadog/trace/api/featureflag/ufc/v1/ParsedSemverTest.java b/products/feature-flagging/feature-flagging-bootstrap/src/test/java/datadog/trace/api/featureflag/ufc/v1/ParsedSemverTest.java index e3d78ac4b86..93af51cdc35 100644 --- a/products/feature-flagging/feature-flagging-bootstrap/src/test/java/datadog/trace/api/featureflag/ufc/v1/ParsedSemverTest.java +++ b/products/feature-flagging/feature-flagging-bootstrap/src/test/java/datadog/trace/api/featureflag/ufc/v1/ParsedSemverTest.java @@ -110,10 +110,9 @@ void normalizesMissingCorePartsAndComparesExtendedCoreParts() { assertTrue( ParsedSemver.compare(ParsedSemver.parse("1.2.3.4.5.6"), ParsedSemver.parse("1.2.3.4.5.7")) < 0); - assertTrue( - ParsedSemver.compare( - ParsedSemver.parse("1.2.3.4.5.6.7"), ParsedSemver.parse("1.2.3.4.5.6.8")) - < 0); + assertTrue(ParsedSemver.compare( + ParsedSemver.parse("1.2.3.4.5.6.7"), ParsedSemver.parse("1.2.3.4.5.6.8")) + < 0); assertTrue( ParsedSemver.compare(ParsedSemver.parse("18.0.0.0"), ParsedSemver.parse("17.0.0")) > 0); assertTrue( diff --git a/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationEnqueueContentionBenchmark.java b/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationEnqueueContentionBenchmark.java index bbec5d65229..c073f8a7dca 100644 --- a/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationEnqueueContentionBenchmark.java +++ b/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationEnqueueContentionBenchmark.java @@ -91,13 +91,12 @@ public void setUp() { final Config config = Config.get(); final BackendApiFactory factory = new BackendApiFactory(config, null); // Capacity well above what the batch-draining consumer should ever let build up. - writer = - new FlagEvaluationWriterImpl( - 1 << 20, - Long.MAX_VALUE, - NANOSECONDS, - () -> factory.createBackendApi(Intake.EVENT_PLATFORM, false), - config); + writer = new FlagEvaluationWriterImpl( + 1 << 20, + Long.MAX_VALUE, + NANOSECONDS, + () -> factory.createBackendApi(Intake.EVENT_PLATFORM, false), + config); } /** @@ -109,11 +108,10 @@ public void setUp() { public void reportOverflow() { final long dropped = writer.droppedQueueOverflow(); if (dropped > 0) { - System.out.println( - "\nWARNING: queue overflowed " - + dropped - + " times - consumer could not keep up, enqueue timings for this iteration are" - + " measuring overflow accounting, not the enqueue path."); + System.out.println("\nWARNING: queue overflowed " + + dropped + + " times - consumer could not keep up, enqueue timings for this iteration are" + + " measuring overflow accounting, not the enqueue path."); } } diff --git a/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationHotPathBenchmark.java b/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationHotPathBenchmark.java index fbd467b88d2..e79bea9d24f 100644 --- a/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationHotPathBenchmark.java +++ b/products/feature-flagging/feature-flagging-lib/src/jmh/java/com/datadog/featureflag/FlagEvaluationHotPathBenchmark.java @@ -80,18 +80,16 @@ public void setUp() { final BackendApiFactory factory = new BackendApiFactory(config, null); final Map ddContext = new HashMap<>(); ddContext.put("service", "bench-service"); - handler = - FlagEvaluationWriterImpl.createHandlerForTest( - () -> factory.createBackendApi(Intake.EVENT_PLATFORM, false), ddContext); + handler = FlagEvaluationWriterImpl.createHandlerForTest( + () -> factory.createBackendApi(Intake.EVENT_PLATFORM, false), ddContext); // Capacity large enough that the benchmark never overflows within a measurement window. - writer = - new FlagEvaluationWriterImpl( - 1 << 20, - Long.MAX_VALUE, - NANOSECONDS, - () -> factory.createBackendApi(Intake.EVENT_PLATFORM, false), - config); + writer = new FlagEvaluationWriterImpl( + 1 << 20, + Long.MAX_VALUE, + NANOSECONDS, + () -> factory.createBackendApi(Intake.EVENT_PLATFORM, false), + config); } /** diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/AgentlessConfigurationSource.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/AgentlessConfigurationSource.java index f4fc35cce30..32c7fa912ce 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/AgentlessConfigurationSource.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/AgentlessConfigurationSource.java @@ -130,12 +130,8 @@ public void init() { synchronized (lifecycleLock) { if (!closed) { - scheduledPoll = - executor.scheduleWithFixedDelay( - this::pollOnceSafely, - pollIntervalMillis, - pollIntervalMillis, - TimeUnit.MILLISECONDS); + scheduledPoll = executor.scheduleWithFixedDelay( + this::pollOnceSafely, pollIntervalMillis, pollIntervalMillis, TimeUnit.MILLISECONDS); } } } @@ -273,11 +269,10 @@ private static HttpUrl endpointFromConfiguredBaseUrl(final String configuredBase } private static HttpUrl datadogApiServerDistributionEndpoint(final Config config) { - final HttpUrl.Builder endpoint = - new HttpUrl.Builder() - .scheme("https") - .host("ufc-server.ff-cdn." + config.getSite()) - .addPathSegments(DATADOG_UFC_RULES_BASED_SERVER_PATH.substring(1)); + final HttpUrl.Builder endpoint = new HttpUrl.Builder() + .scheme("https") + .host("ufc-server.ff-cdn." + config.getSite()) + .addPathSegments(DATADOG_UFC_RULES_BASED_SERVER_PATH.substring(1)); final String env = config.getEnv(); if (env != null && !env.isEmpty()) { endpoint.addQueryParameter("dd_env", env); @@ -318,8 +313,12 @@ interface RetrySleeper { static final class UfcHttpResponse { final int status; - @Nullable final String etag; - @Nullable final byte[] body; + + @Nullable + final String etag; + + @Nullable + final byte[] body; UfcHttpResponse(final int status, @Nullable final String etag, @Nullable final byte[] body) { this.status = status; @@ -364,10 +363,10 @@ public UfcHttpResponse fetch(final HttpUrl endpoint, final Config config, final headers.put("If-None-Match", etag); } // Leave Accept-Encoding unset so OkHttp negotiates gzip and transparently decompresses it. - final Request request = - prepareRequest(endpoint, headers, config, isDatadogManagedEndpoint(endpoint, config)) - .get() - .build(); + final Request request = prepareRequest( + endpoint, headers, config, isDatadogManagedEndpoint(endpoint, config)) + .get() + .build(); if (!fetching.compareAndSet(false, true)) { throw new IllegalStateException("Feature Flagging HTTP request already in flight"); } @@ -376,35 +375,28 @@ public UfcHttpResponse fetch(final HttpUrl endpoint, final Config config, final throw new InterruptedIOException("Feature Flagging HTTP client is closed"); } try { - final HttpRetryPolicy.Factory retryPolicyFactory = - new HttpRetryPolicy.Factory(0, 0, 0) { - @Override - public HttpRetryPolicy create() { - return new AgentlessRetryPolicy( - cancelled, pollIntervalMillis, retrySleeper, jitter); - } - }; - final Call.Factory callFactory = - retryRequest -> { - final Call call = httpClient.newCall(retryRequest); - activeCall.set(call); - if (cancelled.get()) { - call.cancel(); - } - return call; - }; - return sendWithRetries( - callFactory, - retryPolicyFactory, - request, - response -> { - final int status = response.code(); - final String responseEtag = response.header("ETag"); - try (ResponseBody responseBody = response.body()) { - final byte[] body = responseBody != null ? responseBody.bytes() : null; - return new UfcHttpResponse(status, responseEtag, body); - } - }); + final HttpRetryPolicy.Factory retryPolicyFactory = new HttpRetryPolicy.Factory(0, 0, 0) { + @Override + public HttpRetryPolicy create() { + return new AgentlessRetryPolicy(cancelled, pollIntervalMillis, retrySleeper, jitter); + } + }; + final Call.Factory callFactory = retryRequest -> { + final Call call = httpClient.newCall(retryRequest); + activeCall.set(call); + if (cancelled.get()) { + call.cancel(); + } + return call; + }; + return sendWithRetries(callFactory, retryPolicyFactory, request, response -> { + final int status = response.code(); + final String responseEtag = response.header("ETag"); + try (ResponseBody responseBody = response.body()) { + final byte[] body = responseBody != null ? responseBody.bytes() : null; + return new UfcHttpResponse(status, responseEtag, body); + } + }); } finally { activeCall.set(null); fetching.set(false); diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ExposureWriterImpl.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ExposureWriterImpl.java index fcd50e5dc34..d08adb7b4ee 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ExposureWriterImpl.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ExposureWriterImpl.java @@ -56,14 +56,13 @@ public ExposureWriterImpl(final SharedCommunicationObjects sco, final Config con final FeatureFlagBackendApiFactory backendApiFactory, final Config config) { this.queue = Queues.mpscBlockingConsumerArrayQueue(capacity); - final ExposureSerializingHandler serializer = - new ExposureSerializingHandler( - backendApiFactory, - queue, - flushInterval, - timeUnit, - FeatureFlagEvpContext.from(config), - this::close); + final ExposureSerializingHandler serializer = new ExposureSerializingHandler( + backendApiFactory, + queue, + flushInterval, + timeUnit, + FeatureFlagEvpContext.from(config), + this::close); this.serializerThread = newAgentThread(FEATURE_FLAG_EXPOSURE_PROCESSOR, serializer); } diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagBackendApiFactory.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagBackendApiFactory.java index 0dbf9c74254..f4856c9a8ed 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagBackendApiFactory.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagBackendApiFactory.java @@ -42,14 +42,13 @@ BackendApi create() { final boolean directFallbackAvailable = CONFIGURATION_SOURCE_AGENTLESS.equals(config.getFeatureFlaggingConfigurationSource()) && hasDirectCredentials(); - final BackendApi proxyApi = - directFallbackAvailable - ? backendApiFactory.createEvpProxyApi( - Intake.EVENT_PLATFORM, - eventType.responseCompressionEnabled(), - HttpRetryPolicy.Factory.NEVER_RETRY) - : backendApiFactory.createEvpProxyApi( - Intake.EVENT_PLATFORM, eventType.responseCompressionEnabled()); + final BackendApi proxyApi = directFallbackAvailable + ? backendApiFactory.createEvpProxyApi( + Intake.EVENT_PLATFORM, + eventType.responseCompressionEnabled(), + HttpRetryPolicy.Factory.NEVER_RETRY) + : backendApiFactory.createEvpProxyApi( + Intake.EVENT_PLATFORM, eventType.responseCompressionEnabled()); if (!CONFIGURATION_SOURCE_AGENTLESS.equals(config.getFeatureFlaggingConfigurationSource())) { if (proxyApi == null) { LOGGER.warn( diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java index 3a8734fd516..5461ffad3e3 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java @@ -192,10 +192,9 @@ static class FlagEvaluationEvent { (allocation != null && !allocation.isEmpty()) ? new KeyObject(allocation) : null; this.targeting_key = targetingKey; this.runtime_default_used = runtimeDefaultUsed ? Boolean.TRUE : null; - this.context = - (evaluationAttrs != null && !evaluationAttrs.isEmpty()) - ? new EventContext(evaluationAttrs) - : null; + this.context = (evaluationAttrs != null && !evaluationAttrs.isEmpty()) + ? new EventContext(evaluationAttrs) + : null; this.error = (errorMessage != null && !errorMessage.isEmpty()) ? new ErrorObject(errorMessage) : null; } diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationWriterImpl.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationWriterImpl.java index 2da8ffe0256..2bb4ab011a4 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationWriterImpl.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationWriterImpl.java @@ -115,17 +115,16 @@ public FlagEvaluationWriterImpl(final SharedCommunicationObjects sco, final Conf final Supplier backendApiSupplier, final Config config) { this.queue = Queues.mpscBlockingConsumerArrayQueue(capacity); - this.serializer = - new FlagEvaluationSerializingHandler( - backendApiSupplier, - queue, - flushInterval, - timeUnit, - FeatureFlagEvpContext.from(config), - droppedQueueOverflow, - contextTruncatedCounts, - this::close, - FLAG_EVALUATION_PAYLOAD_SIZE_LIMIT_BYTES); + this.serializer = new FlagEvaluationSerializingHandler( + backendApiSupplier, + queue, + flushInterval, + timeUnit, + FeatureFlagEvpContext.from(config), + droppedQueueOverflow, + contextTruncatedCounts, + this::close, + FLAG_EVALUATION_PAYLOAD_SIZE_LIMIT_BYTES); this.serializerThread = newAgentThread(FEATURE_FLAG_EVALUATION_PROCESSOR, serializer); } @@ -316,9 +315,8 @@ static class FlagEvaluationSerializingHandler implements Runnable { final Runnable errorCallback, final int payloadSizeLimitBytes) { this.queue = queue; - this.evpPublisher = - new FeatureFlagEvpPublisher<>( - backendApiSupplier, FlagEvaluationPayloads.FlagEvaluationsRequest.class); + this.evpPublisher = new FeatureFlagEvpPublisher<>( + backendApiSupplier, FlagEvaluationPayloads.FlagEvaluationsRequest.class); this.context = context; this.droppedQueueOverflow = droppedQueueOverflow; this.contextTruncatedCounts = contextTruncatedCounts; @@ -487,14 +485,12 @@ private List buildEventList() { final List events = new ArrayList<>(aggregator.bucketCount()); for (final FlagEvaluationAggregator.EvalBucket bucket : aggregator.fullBuckets()) { - events.add( - FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( - bucket, true, bucket.observeFullEvaluationData, flushTimeMs)); + events.add(FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( + bucket, true, bucket.observeFullEvaluationData, flushTimeMs)); } for (final FlagEvaluationAggregator.EvalBucket bucket : aggregator.degradedBuckets()) { - events.add( - FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( - bucket, false, bucket.observeFullEvaluationData, flushTimeMs)); + events.add(FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( + bucket, false, bucket.observeFullEvaluationData, flushTimeMs)); } return events; } diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ULeb128Encoder.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ULeb128Encoder.java index 7566cf8698d..4b43ff08878 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ULeb128Encoder.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ULeb128Encoder.java @@ -84,14 +84,12 @@ static String hashTargetingKey(final String value) { // Per-thread SHA-256 instance: hashing runs on every doLog=true subject capture, so a // ThreadLocal avoids a provider lookup + allocation per call on that hot path. digest() resets // the instance after each hash; we also reset() defensively before use. - private static final ThreadLocal SHA_256 = - ThreadLocal.withInitial( - () -> { - try { - return MessageDigest.getInstance("SHA-256"); - } catch (final NoSuchAlgorithmException e) { - // SHA-256 is mandated by the JLS on every JVM; unreachable in practice. - throw new IllegalStateException("SHA-256 algorithm not available", e); - } - }); + private static final ThreadLocal SHA_256 = ThreadLocal.withInitial(() -> { + try { + return MessageDigest.getInstance("SHA-256"); + } catch (final NoSuchAlgorithmException e) { + // SHA-256 is mandated by the JLS on every JVM; unreachable in practice. + throw new IllegalStateException("SHA-256 algorithm not available", e); + } + }); } diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/UniversalFlagConfigParser.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/UniversalFlagConfigParser.java index 9778d980179..4cf0d5649ab 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/UniversalFlagConfigParser.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/UniversalFlagConfigParser.java @@ -52,14 +52,13 @@ final class UniversalFlagConfigParser implements ConfigurationDeserializer V1_ADAPTER = MOSHI.adapter(ServerConfiguration.class); @@ -214,27 +213,25 @@ private static void validateAndCacheSemverComparands(final String flagKey, final case SEMVER_GT: case SEMVER_GTE: if (!(condition.value instanceof String)) { - throw new InvalidSemverComparandException( - "flag \"" - + flagKey - + "\" allocation " - + allocIdx - + " rule has condition with operator \"" - + condition.operator - + "\" that requires string value"); + throw new InvalidSemverComparandException("flag \"" + + flagKey + + "\" allocation " + + allocIdx + + " rule has condition with operator \"" + + condition.operator + + "\" that requires string value"); } final ParsedSemver parsed = ParsedSemver.parse((String) condition.value); if (parsed == null) { - throw new InvalidSemverComparandException( - "flag \"" - + flagKey - + "\" allocation " - + allocIdx - + " rule has condition with operator \"" - + condition.operator - + "\" and invalid semantic version \"" - + condition.value - + "\""); + throw new InvalidSemverComparandException("flag \"" + + flagKey + + "\" allocation " + + allocIdx + + " rule has condition with operator \"" + + condition.operator + + "\" and invalid semantic version \"" + + condition.value + + "\""); } condition.semverComparand = parsed; break; @@ -267,20 +264,19 @@ static final class InvalidSemverComparandException extends IllegalArgumentExcept */ static final class ShardAdapter extends JsonAdapter { - static final Factory FACTORY = - new Factory() { - @Nullable - @Override - public JsonAdapter create( - @Nonnull final Type type, - @Nonnull final Set annotations, - @Nonnull final Moshi moshi) { - if (!annotations.isEmpty() || type != Shard.class) { - return null; - } - return new ShardAdapter(moshi.adapter(ShardJson.class)); - } - }; + static final Factory FACTORY = new Factory() { + @Nullable + @Override + public JsonAdapter create( + @Nonnull final Type type, + @Nonnull final Set annotations, + @Nonnull final Moshi moshi) { + if (!annotations.isEmpty() || type != Shard.class) { + return null; + } + return new ShardAdapter(moshi.adapter(ShardJson.class)); + } + }; private final JsonAdapter delegate; @@ -334,20 +330,19 @@ static final class FlagMapAdapter extends JsonAdapter> { private static final Type FLAGS_TYPE = Types.newParameterizedType(Map.class, String.class, Flag.class); - static final Factory FACTORY = - new Factory() { - @Nullable - @Override - public JsonAdapter create( - @Nonnull final Type type, - @Nonnull final Set annotations, - @Nonnull final Moshi moshi) { - if (!annotations.isEmpty() || !Types.equals(type, FLAGS_TYPE)) { - return null; - } - return new FlagMapAdapter(moshi.adapter(Flag.class)); - } - }; + static final Factory FACTORY = new Factory() { + @Nullable + @Override + public JsonAdapter create( + @Nonnull final Type type, + @Nonnull final Set annotations, + @Nonnull final Moshi moshi) { + if (!annotations.isEmpty() || !Types.equals(type, FLAGS_TYPE)) { + return null; + } + return new FlagMapAdapter(moshi.adapter(Flag.class)); + } + }; private final JsonAdapter flagAdapter; @@ -404,20 +399,19 @@ public void toJson(@Nonnull final JsonWriter writer, @Nullable final Map { - static final Factory FACTORY = - new Factory() { - @Nullable - @Override - public JsonAdapter create( - @Nonnull final Type type, - @Nonnull final Set annotations, - @Nonnull final Moshi moshi) { - if (!annotations.isEmpty() || type != Boolean.class) { - return null; - } - return new LenientBooleanAdapter(); - } - }; + static final Factory FACTORY = new Factory() { + @Nullable + @Override + public JsonAdapter create( + @Nonnull final Type type, + @Nonnull final Set annotations, + @Nonnull final Moshi moshi) { + if (!annotations.isEmpty() || type != Boolean.class) { + return null; + } + return new LenientBooleanAdapter(); + } + }; @Nullable @Override @@ -458,20 +452,19 @@ public void toJson(@Nonnull final JsonWriter writer, @Nullable final Instant val static final class AllocationAdapter extends JsonAdapter { - static final Factory FACTORY = - new Factory() { - @Nullable - @Override - public JsonAdapter create( - @Nonnull final Type type, - @Nonnull final Set annotations, - @Nonnull final Moshi moshi) { - if (!annotations.isEmpty() || !Types.equals(type, Allocation.class)) { - return null; - } - return new AllocationAdapter(moshi.adapter(AllocationJson.class)); - } - }; + static final Factory FACTORY = new Factory() { + @Nullable + @Override + public JsonAdapter create( + @Nonnull final Type type, + @Nonnull final Set annotations, + @Nonnull final Moshi moshi) { + if (!annotations.isEmpty() || !Types.equals(type, Allocation.class)) { + return null; + } + return new AllocationAdapter(moshi.adapter(AllocationJson.class)); + } + }; private final JsonAdapter delegate; diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessConfigurationSourceTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessConfigurationSourceTest.java index b02bd05642b..52e5955450d 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessConfigurationSourceTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessConfigurationSourceTest.java @@ -60,7 +60,8 @@ class AgentlessConfigurationSourceTest { private static final String CONFIG_PATH = "/api/v2/feature-flagging/config/rules-based/server"; - @Mock private FeatureFlaggingGateway.ConfigListener listener; + @Mock + private FeatureFlaggingGateway.ConfigListener listener; @AfterEach void cleanup() { @@ -139,17 +140,8 @@ void defaultConstructorBuildsHttpClientFromConfig() { @Test void realHttpClientDoesNotSendApiKeyOverHttp() throws Exception { - try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.get( - CONFIG_PATH, - api -> - api.getResponse() - .addHeader("ETag", "etag-b") - .send(emptyConfig()))))) { + try (JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.get( + CONFIG_PATH, api -> api.getResponse().addHeader("ETag", "etag-b").send(emptyConfig()))))) { final OkHttpClient httpClient = new OkHttpClient.Builder().build(); final AgentlessConfigurationSource.OkHttpUfcHttpClient client = new AgentlessConfigurationSource.OkHttpUfcHttpClient(httpClient); @@ -218,31 +210,23 @@ void handlesGzipAndKeepsLastKnownGoodWhenNextResponseIsTruncated() throws Except final byte[] truncatedConfig = Arrays.copyOf(compressedConfig, compressedConfig.length - 8); final AtomicInteger responses = new AtomicInteger(); try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.get( - CONFIG_PATH, - api -> { - final boolean firstResponse = responses.getAndIncrement() == 0; - final byte[] body = - firstResponse ? compressedConfig : truncatedConfig; - api.getResponse() - .addHeader("Content-Encoding", "gzip") - .addHeader("ETag", firstResponse ? "etag-good" : "etag-bad") - .sendWithType("application/json", body); - })))) { + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.get(CONFIG_PATH, api -> { + final boolean firstResponse = responses.getAndIncrement() == 0; + final byte[] body = firstResponse ? compressedConfig : truncatedConfig; + api.getResponse() + .addHeader("Content-Encoding", "gzip") + .addHeader("ETag", firstResponse ? "etag-good" : "etag-bad") + .sendWithType("application/json", body); + })))) { final HttpUrl endpoint = HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)); final OkHttpClient httpClient = new OkHttpClient.Builder().build(); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - endpoint, - config(), - 30_000, - new AgentlessConfigurationSource.OkHttpUfcHttpClient( - httpClient, 30_000, delay -> {}, () -> 1.0), - Executors.newSingleThreadScheduledExecutor()); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + endpoint, + config(), + 30_000, + new AgentlessConfigurationSource.OkHttpUfcHttpClient( + httpClient, 30_000, delay -> {}, () -> 1.0), + Executors.newSingleThreadScheduledExecutor()); final ArgumentCaptor configuration = ArgumentCaptor.forClass(ServerConfiguration.class); FeatureFlaggingGateway.addConfigListener(listener); @@ -270,18 +254,16 @@ void downloadsAndAppliesLargeUfcWithoutPayloadLimit() throws Exception { final String largeConfig = largeConfig(flagCount); assertTrue(largeConfig.getBytes(UTF_8).length > 500_000); - try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> s.handlers(h -> h.get(CONFIG_PATH, api -> api.getResponse().send(largeConfig))))) { + try (JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> + s.handlers(h -> h.get(CONFIG_PATH, api -> api.getResponse().send(largeConfig))))) { final HttpUrl endpoint = HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)); final OkHttpClient httpClient = new OkHttpClient.Builder().build(); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - endpoint, - config(), - 30_000, - new AgentlessConfigurationSource.OkHttpUfcHttpClient(httpClient), - Executors.newSingleThreadScheduledExecutor()); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + endpoint, + config(), + 30_000, + new AgentlessConfigurationSource.OkHttpUfcHttpClient(httpClient), + Executors.newSingleThreadScheduledExecutor()); final ArgumentCaptor configuration = ArgumentCaptor.forClass(ServerConfiguration.class); FeatureFlaggingGateway.addConfigListener(listener); @@ -301,17 +283,9 @@ void downloadsAndAppliesLargeUfcWithoutPayloadLimit() throws Exception { @Test void realHttpClientAllowsMissingEtagAndEmptyResponseBody() throws Exception { - try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.get( - CONFIG_PATH, - api -> - api.getResponse() - .status(HttpURLConnection.HTTP_NO_CONTENT) - .send())))) { + try (JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.get( + CONFIG_PATH, + api -> api.getResponse().status(HttpURLConnection.HTTP_NO_CONTENT).send())))) { final OkHttpClient httpClient = new OkHttpClient.Builder().build(); final AgentlessConfigurationSource.OkHttpUfcHttpClient client = new AgentlessConfigurationSource.OkHttpUfcHttpClient(httpClient); @@ -337,13 +311,12 @@ void httpClientAdapterPreservesMissingResponseBody() throws Exception { final Call call = mock(Call.class); final HttpUrl endpoint = HttpUrl.get("http://localhost"); final okhttp3.Request request = new okhttp3.Request.Builder().url(endpoint).build(); - final Response okHttpResponse = - new Response.Builder() - .request(request) - .protocol(Protocol.HTTP_1_1) - .code(HttpURLConnection.HTTP_OK) - .message("OK") - .build(); + final Response okHttpResponse = new Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .code(HttpURLConnection.HTTP_OK) + .message("OK") + .build(); when(httpClient.newCall(any())).thenReturn(call); when(call.execute()).thenReturn(okHttpResponse); final AgentlessConfigurationSource.OkHttpUfcHttpClient client = @@ -362,34 +335,24 @@ void realHttpClientCancellationInterruptsInFlightRequest() throws Exception { final CountDownLatch requestStarted = new CountDownLatch(1); final CountDownLatch releaseRequest = new CountDownLatch(1); try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.get( - CONFIG_PATH, - api -> { - requestStarted.countDown(); - assertTrue(releaseRequest.await(1, TimeUnit.SECONDS)); - api.getResponse().send(emptyConfig()); - })))) { + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.get(CONFIG_PATH, api -> { + requestStarted.countDown(); + assertTrue(releaseRequest.await(1, TimeUnit.SECONDS)); + api.getResponse().send(emptyConfig()); + })))) { final OkHttpClient httpClient = new OkHttpClient.Builder().build(); final AgentlessConfigurationSource.OkHttpUfcHttpClient client = new AgentlessConfigurationSource.OkHttpUfcHttpClient(httpClient); final ExecutorService runner = Executors.newSingleThreadExecutor(); try { - final Future response = - runner.submit( - () -> - client.fetch( - HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)), config(), null)); + final Future response = runner.submit(() -> + client.fetch(HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)), config(), null)); assertTrue(requestStarted.await(1, TimeUnit.SECONDS)); assertThrows( IllegalStateException.class, - () -> - client.fetch( - HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)), config(), null)); + () -> client.fetch( + HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)), config(), null)); client.cancel(); @@ -407,11 +370,8 @@ void realHttpClientCancellationInterruptsInFlightRequest() throws Exception { @Test void realHttpClientCancellationBeforeFetchPreventsRequest() throws Exception { - try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> h.get(CONFIG_PATH, api -> api.getResponse().send(emptyConfig()))))) { + try (JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> + s.handlers(h -> h.get(CONFIG_PATH, api -> api.getResponse().send(emptyConfig()))))) { final OkHttpClient httpClient = new OkHttpClient.Builder().build(); final AgentlessConfigurationSource.OkHttpUfcHttpClient client = new AgentlessConfigurationSource.OkHttpUfcHttpClient(httpClient); @@ -421,9 +381,8 @@ void realHttpClientCancellationBeforeFetchPreventsRequest() throws Exception { assertThrows( IOException.class, - () -> - client.fetch( - HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)), config(), null)); + () -> client.fetch( + HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)), config(), null)); } finally { httpClient.dispatcher().executorService().shutdownNow(); httpClient.connectionPool().evictAll(); @@ -434,16 +393,10 @@ void realHttpClientCancellationBeforeFetchPreventsRequest() throws Exception { @Test void realHttpClientTimesOutDelayedResponse() throws Exception { try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.get( - CONFIG_PATH, - api -> { - TimeUnit.MILLISECONDS.sleep(500); - api.getResponse().send(emptyConfig()); - })))) { + JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.get(CONFIG_PATH, api -> { + TimeUnit.MILLISECONDS.sleep(500); + api.getResponse().send(emptyConfig()); + })))) { final HttpUrl endpoint = HttpUrl.get(server.getAddress().resolve(CONFIG_PATH)); final OkHttpClient httpClient = OkHttpUtils.buildHttpClient(endpoint, 50); final AgentlessConfigurationSource.OkHttpUfcHttpClient client = @@ -479,10 +432,9 @@ void appliesAcceptedJsonApiUfcThroughGateway() throws Exception { @Test void customEndpointRequiresJsonApiAndKeepsLastKnownGoodOnRawUfc() throws Exception { - final FakeClient client = - new FakeClient( - response(200, "etag-good", emptyConfig()), - response(200, "etag-raw", emptyConfigAttributes())); + final FakeClient client = new FakeClient( + response(200, "etag-good", emptyConfig()), + response(200, "etag-raw", emptyConfigAttributes())); final Config config = config(); lenient() .when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl()) @@ -517,11 +469,10 @@ void ignoresBlankEtag() throws Exception { @Test void successfulResponseWithoutEtagClearsPreviousEtag() throws Exception { - final FakeClient client = - new FakeClient( - response(200, "etag-a", emptyConfig()), - response(200, null, emptyConfig()), - response(304, null, null)); + final FakeClient client = new FakeClient( + response(200, "etag-a", emptyConfig()), + response(200, null, emptyConfig()), + response(304, null, null)); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -564,14 +515,12 @@ void coldNotModifiedDoesNotEstablishEtag() throws Exception { @Test void failedGatewayDispatchDoesNotAdvanceEtag() throws Exception { - final FakeClient client = - new FakeClient( - response(200, "etag-a", emptyConfig()), response(200, "etag-b", emptyConfig())); + final FakeClient client = new FakeClient( + response(200, "etag-a", emptyConfig()), response(200, "etag-b", emptyConfig())); final AgentlessConfigurationSource service = service(client); - final FeatureFlaggingGateway.ConfigListener failingListener = - configuration -> { - throw new IllegalStateException("listener rejected configuration"); - }; + final FeatureFlaggingGateway.ConfigListener failingListener = configuration -> { + throw new IllegalStateException("listener rejected configuration"); + }; FeatureFlaggingGateway.addConfigListener(failingListener); try { @@ -588,12 +537,11 @@ void failedGatewayDispatchDoesNotAdvanceEtag() throws Exception { @Test void keepsLastKnownGoodOnAuthFailureAndMalformedPayload() throws Exception { - final FakeClient client = - new FakeClient( - response(200, "etag-good", emptyConfig()), - response(401, null, null), - response(200, null, "{not-json}"), - response(200, null, "{\"flags\":[]}")); + final FakeClient client = new FakeClient( + response(200, "etag-good", emptyConfig()), + response(401, null, null), + response(200, null, "{not-json}"), + response(200, null, "{\"flags\":[]}")); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -610,18 +558,16 @@ void keepsLastKnownGoodOnAuthFailureAndMalformedPayload() throws Exception { @Test void rejectsForbiddenNonOkMissingBodyAndNullConfiguration() throws Exception { - final FakeClient client = - new FakeClient( - response(403, null, null), - response(404, null, null), - response(600, null, null), - response(200, null, null), - response(200, null, "null"), - response(200, null, jsonApiResponse("other-configuration", emptyConfigAttributes())), - response(200, null, "{\"data\":null}"), - response( - 200, null, "{\"data\":{\"id\":\"1\",\"type\":\"universal-flag-configuration\"}}"), - response(200, null, emptyConfigAttributes())); + final FakeClient client = new FakeClient( + response(403, null, null), + response(404, null, null), + response(600, null, null), + response(200, null, null), + response(200, null, "null"), + response(200, null, jsonApiResponse("other-configuration", emptyConfigAttributes())), + response(200, null, "{\"data\":null}"), + response(200, null, "{\"data\":{\"id\":\"1\",\"type\":\"universal-flag-configuration\"}}"), + response(200, null, emptyConfigAttributes())); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -643,14 +589,13 @@ void warnsRateLimitedOnUnauthorizedAndForbidden() throws Exception { final RatelimitedLogger ratelimitedLogger = mock(RatelimitedLogger.class); final FakeClient client = new FakeClient(response(401, null, null), response(403, null, null)); final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - HttpUrl.get("http://localhost" + CONFIG_PATH), - config(), - 30_000, - client, - executor, - ratelimitedLogger); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + HttpUrl.get("http://localhost" + CONFIG_PATH), + config(), + 30_000, + client, + executor, + ratelimitedLogger); try { assertFalse(service.pollOnce()); @@ -672,14 +617,13 @@ void warnsRateLimitedOnUnauthorizedAndForbidden() throws Exception { @Test void retriesTimeoutBeforeApplyingConfig() throws Exception { final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delay -> {}, - () -> 1.0, - new SocketTimeoutException("slow HTTP configuration source"), - new SocketTimeoutException("slow HTTP configuration source"), - response(200, "etag-a", emptyConfig())); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delay -> {}, + () -> 1.0, + new SocketTimeoutException("slow HTTP configuration source"), + new SocketTimeoutException("slow HTTP configuration source"), + response(200, "etag-a", emptyConfig())); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -692,15 +636,14 @@ void retriesTimeoutBeforeApplyingConfig() throws Exception { @Test void retriesClientTimeoutAndRateLimitStatusBeforeApplyingConfig() throws Exception { final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delay -> {}, - () -> 1.0, - response(408, null, null), - response(200, "etag-a", emptyConfig()), - response(429, null, null), - response(200, "etag-b", emptyConfig())); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delay -> {}, + () -> 1.0, + response(408, null, null), + response(200, "etag-a", emptyConfig()), + response(429, null, null), + response(200, "etag-b", emptyConfig())); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -714,9 +657,8 @@ void retriesClientTimeoutAndRateLimitStatusBeforeApplyingConfig() throws Excepti @Test void retriesServerErrorThenKeepsColdStateOnNotModified() throws Exception { final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, delay -> {}, () -> 1.0, response(500, null, null), response(304, null, null)); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, delay -> {}, () -> 1.0, response(500, null, null), response(304, null, null)); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -730,23 +672,21 @@ void retriesServerErrorThenKeepsColdStateOnNotModified() throws Exception { void warnsRateLimitedAfterRetryableFailuresAreExhausted() throws Exception { final RatelimitedLogger ratelimitedLogger = mock(RatelimitedLogger.class); final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delay -> {}, - () -> 1.0, - response(503, null, null), - response(503, null, null), - response(503, null, null)); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delay -> {}, + () -> 1.0, + response(503, null, null), + response(503, null, null), + response(503, null, null)); final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - HttpUrl.get("http://localhost" + CONFIG_PATH), - config(), - 30_000, - client, - executor, - ratelimitedLogger); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + HttpUrl.get("http://localhost" + CONFIG_PATH), + config(), + 30_000, + client, + executor, + ratelimitedLogger); FeatureFlaggingGateway.addConfigListener(listener); try { @@ -768,23 +708,21 @@ void warnsRateLimitedAfterIoFailuresAreExhausted() throws Exception { final SocketTimeoutException finalFailure = new SocketTimeoutException("slow HTTP configuration source"); final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delay -> {}, - () -> 1.0, - new SocketTimeoutException("slow HTTP configuration source"), - new SocketTimeoutException("slow HTTP configuration source"), - finalFailure); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delay -> {}, + () -> 1.0, + new SocketTimeoutException("slow HTTP configuration source"), + new SocketTimeoutException("slow HTTP configuration source"), + finalFailure); final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - HttpUrl.get("http://localhost" + CONFIG_PATH), - config(), - 30_000, - client, - executor, - ratelimitedLogger); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + HttpUrl.get("http://localhost" + CONFIG_PATH), + config(), + 30_000, + client, + executor, + ratelimitedLogger); FeatureFlaggingGateway.addConfigListener(listener); try { @@ -806,14 +744,13 @@ void warnsRateLimitedAfterIoFailuresAreExhausted() throws Exception { void usesIntervalAwareRetryBackoff() throws Exception { final List delays = new ArrayList<>(); final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delays::add, - () -> 1.0, - response(503, null, null), - new SocketTimeoutException("slow HTTP configuration source"), - response(200, "etag-a", emptyConfig())); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delays::add, + () -> 1.0, + response(503, null, null), + new SocketTimeoutException("slow HTTP configuration source"), + response(200, "etag-a", emptyConfig())); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -894,13 +831,12 @@ void rejectsOverlappingPolls() throws Exception { @Test void initCompletesFirstPollAndCloseCancelsScheduledFuture() throws Exception { final FakeClient client = new FakeClient(response(200, "etag-a", emptyConfig())); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - HttpUrl.get("http://localhost" + CONFIG_PATH), - config(), - 60_000, - client, - Executors.newSingleThreadScheduledExecutor()); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + HttpUrl.get("http://localhost" + CONFIG_PATH), + config(), + 60_000, + client, + Executors.newSingleThreadScheduledExecutor()); FeatureFlaggingGateway.addConfigListener(listener); service.init(); @@ -913,20 +849,18 @@ void initCompletesFirstPollAndCloseCancelsScheduledFuture() throws Exception { @Test void initCompletesInitialRetryCycleBeforeReturning() throws Exception { final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delay -> {}, - () -> 1.0, - response(500, null, null), - response(200, "etag-a", emptyConfig())); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - HttpUrl.get("http://localhost" + CONFIG_PATH), - config(), - 60_000, - client, - Executors.newSingleThreadScheduledExecutor()); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delay -> {}, + () -> 1.0, + response(500, null, null), + response(200, "etag-a", emptyConfig())); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + HttpUrl.get("http://localhost" + CONFIG_PATH), + config(), + 60_000, + client, + Executors.newSingleThreadScheduledExecutor()); FeatureFlaggingGateway.addConfigListener(listener); try { @@ -954,28 +888,25 @@ void repeatedInitStartsOnlyOnePoller() throws Exception { @Test void scheduledPollContinuesAfterListenerRuntimeException() throws Exception { - final FakeClient client = - new FakeClient( - response(200, "etag-a", emptyConfig()), response(200, "etag-b", emptyConfig())); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - HttpUrl.get("http://localhost" + CONFIG_PATH), - config(), - 10, - client, - Executors.newSingleThreadScheduledExecutor()); + final FakeClient client = new FakeClient( + response(200, "etag-a", emptyConfig()), response(200, "etag-b", emptyConfig())); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + HttpUrl.get("http://localhost" + CONFIG_PATH), + config(), + 10, + client, + Executors.newSingleThreadScheduledExecutor()); final AtomicInteger listenerCalls = new AtomicInteger(); // Wait on the listener rather than on FakeClient.calls: the call counter is incremented when // a request starts, so it reaches 2 before the second configuration has been applied. final CountDownLatch listenerNotified = new CountDownLatch(2); - final FeatureFlaggingGateway.ConfigListener flakyListener = - configuration -> { - final int call = listenerCalls.incrementAndGet(); - listenerNotified.countDown(); - if (call == 1) { - throw new IllegalStateException("listener rejected first configuration"); - } - }; + final FeatureFlaggingGateway.ConfigListener flakyListener = configuration -> { + final int call = listenerCalls.incrementAndGet(); + listenerNotified.countDown(); + if (call == 1) { + throw new IllegalStateException("listener rejected first configuration"); + } + }; FeatureFlaggingGateway.addConfigListener(flakyListener); try { @@ -1045,19 +976,17 @@ void closeInterruptsRetryBackoff() throws Exception { final CountDownLatch backoffStarted = new CountDownLatch(1); final List requests = new ArrayList<>(); final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delay -> { - backoffStarted.countDown(); - TimeUnit.MINUTES.sleep(1); - }, - () -> 1.0, - new SocketTimeoutException("slow HTTP configuration source"), - response(200, "etag-a", emptyConfig())); - final AgentlessConfigurationSource service = - new AgentlessConfigurationSource( - HttpUrl.get("http://localhost" + CONFIG_PATH), config(), 30_000, client, executor); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delay -> { + backoffStarted.countDown(); + TimeUnit.MINUTES.sleep(1); + }, + () -> 1.0, + new SocketTimeoutException("slow HTTP configuration source"), + response(200, "etag-a", emptyConfig())); + final AgentlessConfigurationSource service = new AgentlessConfigurationSource( + HttpUrl.get("http://localhost" + CONFIG_PATH), config(), 30_000, client, executor); final ExecutorService runner = Executors.newSingleThreadExecutor(); try { @@ -1101,17 +1030,16 @@ class SystemTestParity { @Test void preservesSystemTestSourceTransitionsAndLastKnownGoodState() throws Exception { final List requests = new ArrayList<>(); - final AgentlessConfigurationSource.OkHttpUfcHttpClient client = - scriptedClient( - requests, - delay -> {}, - () -> 1.0, - response(200, "etag-a", emptyConfig()), - response(304, "etag-must-not-replace-a", null), - response(509, null, null), - response(200, "etag-b", emptyConfig()), - response(200, "etag-c", "{not-json}"), - response(401, null, null)); + final AgentlessConfigurationSource.OkHttpUfcHttpClient client = scriptedClient( + requests, + delay -> {}, + () -> 1.0, + response(200, "etag-a", emptyConfig()), + response(304, "etag-must-not-replace-a", null), + response(509, null, null), + response(200, "etag-b", emptyConfig()), + response(200, "etag-c", "{not-json}"), + response(401, null, null)); final AgentlessConfigurationSource service = service(client); FeatureFlaggingGateway.addConfigListener(listener); @@ -1159,24 +1087,19 @@ private static AgentlessConfigurationSource.OkHttpUfcHttpClient scriptedClient( final BlockingQueue scriptedOutcomes = new LinkedBlockingQueue<>(); scriptedOutcomes.addAll(Arrays.asList(outcomes)); final OkHttpClient httpClient = mock(OkHttpClient.class); - when(httpClient.newCall(any())) - .thenAnswer( - invocation -> { - final okhttp3.Request request = invocation.getArgument(0); - requests.add(request); - final Object outcome = scriptedOutcomes.remove(); - final Call call = mock(Call.class); - when(call.execute()) - .thenAnswer( - ignored -> { - if (outcome instanceof IOException) { - throw (IOException) outcome; - } - return okHttpResponse( - request, (AgentlessConfigurationSource.UfcHttpResponse) outcome); - }); - return call; - }); + when(httpClient.newCall(any())).thenAnswer(invocation -> { + final okhttp3.Request request = invocation.getArgument(0); + requests.add(request); + final Object outcome = scriptedOutcomes.remove(); + final Call call = mock(Call.class); + when(call.execute()).thenAnswer(ignored -> { + if (outcome instanceof IOException) { + throw (IOException) outcome; + } + return okHttpResponse(request, (AgentlessConfigurationSource.UfcHttpResponse) outcome); + }); + return call; + }); return new AgentlessConfigurationSource.OkHttpUfcHttpClient( httpClient, 30_000, retrySleeper, jitter); } @@ -1189,12 +1112,11 @@ private static AgentlessConfigurationSource.AgentlessRetryPolicy retryPolicy( private static Response okHttpResponse( final okhttp3.Request request, final AgentlessConfigurationSource.UfcHttpResponse response) { - final Response.Builder builder = - new Response.Builder() - .request(request) - .protocol(Protocol.HTTP_1_1) - .code(response.status) - .message(Integer.toString(response.status)); + final Response.Builder builder = new Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .code(response.status) + .message(Integer.toString(response.status)); if (response.etag != null) { builder.header("ETag", response.etag); } @@ -1216,7 +1138,9 @@ private static Config config(final String site, final String env) { lenient() .when(config.getFeatureFlaggingConfigurationSourceRequestTimeoutSeconds()) .thenReturn(5); - lenient().when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl()).thenReturn(null); + lenient() + .when(config.getFeatureFlaggingConfigurationSourceAgentlessBaseUrl()) + .thenReturn(null); lenient().when(config.getApiKey()).thenReturn("test-api-key"); lenient().when(config.getSite()).thenReturn(site); lenient().when(config.getEnv()).thenReturn(env); @@ -1242,22 +1166,15 @@ private static String emptyConfigAttributes() { } private static String jsonApiResponse(final String type, final String attributes) { - return "{\"data\":{" - + "\"id\":\"1\"," - + "\"type\":\"" - + type - + "\"," - + "\"attributes\":" - + attributes - + "}}"; + return "{\"data\":{" + "\"id\":\"1\"," + "\"type\":\"" + type + "\"," + "\"attributes\":" + + attributes + "}}"; } private static String largeConfig(final int flagCount) { final StringBuilder json = - new StringBuilder( - "{\"createdAt\":\"2026-07-15T19:57:07.219869778Z\"," - + "\"environment\":{\"name\":\"Large Test\"}," - + "\"flags\":{"); + new StringBuilder("{\"createdAt\":\"2026-07-15T19:57:07.219869778Z\"," + + "\"environment\":{\"name\":\"Large Test\"}," + + "\"flags\":{"); for (int index = 0; index < flagCount; index++) { if (index > 0) { json.append(','); @@ -1267,10 +1184,9 @@ private static String largeConfig(final int flagCount) { .append(flagKey) .append("\":{\"key\":\"") .append(flagKey) - .append( - "\",\"enabled\":true,\"variationType\":\"STRING\"," - + "\"variations\":{\"on\":{\"key\":\"on\",\"value\":\"on\"}}," - + "\"allocations\":[]}"); + .append("\",\"enabled\":true,\"variationType\":\"STRING\"," + + "\"variations\":{\"on\":{\"key\":\"on\",\"value\":\"on\"}}," + + "\"allocations\":[]}"); } return jsonApiResponse("universal-flag-configuration", json.append("}}").toString()); } diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessFeatureFlagBackendApiTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessFeatureFlagBackendApiTest.java index 117c72ba2a1..095696a7989 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessFeatureFlagBackendApiTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/AgentlessFeatureFlagBackendApiTest.java @@ -35,14 +35,13 @@ void replaysRejectedBatchDirectlyAndKeepsDirectRoute(final int statusCode) throw new RecordingBackendApi(new HttpResponseException(statusCode, "rejected")); final RecordingBackendApi direct = new RecordingBackendApi(); final AtomicInteger directApiCreations = new AtomicInteger(); - final AgentlessFeatureFlagBackendApi api = - new AgentlessFeatureFlagBackendApi( - local, - () -> { - directApiCreations.incrementAndGet(); - return direct; - }, - "flag evaluation"); + final AgentlessFeatureFlagBackendApi api = new AgentlessFeatureFlagBackendApi( + local, + () -> { + directApiCreations.incrementAndGet(); + return direct; + }, + "flag evaluation"); final RequestBody firstBody = requestBody("first"); final RequestBody secondBody = requestBody("second"); @@ -113,14 +112,13 @@ void doesNotRetryDirectApiCreationWhenFallbackIsUnavailable() { final RecordingBackendApi local = new RecordingBackendApi(new HttpResponseException(404, "rejected")); final AtomicInteger directApiCreations = new AtomicInteger(); - final AgentlessFeatureFlagBackendApi api = - new AgentlessFeatureFlagBackendApi( - local, - () -> { - directApiCreations.incrementAndGet(); - return null; - }, - "exposure"); + final AgentlessFeatureFlagBackendApi api = new AgentlessFeatureFlagBackendApi( + local, + () -> { + directApiCreations.incrementAndGet(); + return null; + }, + "exposure"); assertThrows( HttpResponseException.class, @@ -137,14 +135,13 @@ private static void assertNoDirectReplay(final IOException failure) { final RecordingBackendApi local = new RecordingBackendApi(failure); final RecordingBackendApi direct = new RecordingBackendApi(); final AtomicInteger directApiCreations = new AtomicInteger(); - final AgentlessFeatureFlagBackendApi api = - new AgentlessFeatureFlagBackendApi( - local, - () -> { - directApiCreations.incrementAndGet(); - return direct; - }, - "flag evaluation"); + final AgentlessFeatureFlagBackendApi api = new AgentlessFeatureFlagBackendApi( + local, + () -> { + directApiCreations.incrementAndGet(); + return direct; + }, + "flag evaluation"); assertThrows( IOException.class, diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java index daaf213ebfb..bf571d82fe3 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java @@ -89,15 +89,10 @@ void setUp() { failed = Collections.newSetFromMap(new ConcurrentHashMap()); JsonAdapter adapter = new Moshi.Builder().build().adapter(ExposuresRequest.class); - server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> { - h.prefix(EXPOSURES_ENDPOINT, api -> handleExposureRequest(api, adapter)); - h.prefix( - DIRECT_EXPOSURES_ENDPOINT, api -> handleExposureRequest(api, adapter)); - })); + server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> { + h.prefix(EXPOSURES_ENDPOINT, api -> handleExposureRequest(api, adapter)); + h.prefix(DIRECT_EXPOSURES_ENDPOINT, api -> handleExposureRequest(api, adapter)); + })); sharedCommunicationObjects = sharedCommunicationObjects(true); } @@ -110,9 +105,8 @@ void cleanup() { private void handleExposureRequest(HandlerApi api, JsonAdapter adapter) throws Exception { - ExposuresRequest exposuresRequest = - adapter.fromJson( - Okio.buffer(Okio.source(new ByteArrayInputStream(api.getRequest().getBody())))); + ExposuresRequest exposuresRequest = adapter.fromJson( + Okio.buffer(Okio.source(new ByteArrayInputStream(api.getRequest().getBody())))); String serviceName = exposuresRequest.context.get("service"); boolean failForever = "fail-forever".equals(serviceName); boolean fail = serviceName.startsWith("fail") && (failed.add(serviceName) || failForever); @@ -142,14 +136,13 @@ void testExposureEventWrites(String service, String env, String version) throws writer.accept(exposure); } - poll.eventually( - () -> { - assertFalse(requests.isEmpty()); - for (ExposuresRequest request : requests) { - assertContext(request.context, service, env, version); - } - assertExposures(allExposures(), exposures); - }); + poll.eventually(() -> { + assertFalse(requests.isEmpty()); + for (ExposuresRequest request : requests) { + assertContext(request.context, service, env, version); + } + assertExposures(allExposures(), exposures); + }); } } @@ -159,14 +152,13 @@ void testAgentlessExposureEventWritesDirectlyWithApiKey() throws Exception { when(config.getFeatureFlaggingConfigurationSource()).thenReturn(CONFIGURATION_SOURCE_AGENTLESS); when(config.getApiKey()).thenReturn(API_KEY); BackendApiFactory backendApiFactory = mock(BackendApiFactory.class); - IntakeApi directApi = - new IntakeApi( - HttpUrl.get(server.getAddress()).resolve("/api/v2/"), - API_KEY, - "123", - HttpRetryPolicy.Factory.NEVER_RETRY, - new OkHttpClient.Builder().build(), - false); + IntakeApi directApi = new IntakeApi( + HttpUrl.get(server.getAddress()).resolve("/api/v2/"), + API_KEY, + "123", + HttpRetryPolicy.Factory.NEVER_RETRY, + new OkHttpClient.Builder().build(), + false); when(backendApiFactory.createDirectIntakeApi( datadog.trace.api.intake.Intake.EVENT_PLATFORM, true)) .thenReturn(directApi); @@ -181,13 +173,12 @@ void testAgentlessExposureEventWritesDirectlyWithApiKey() throws Exception { writer.accept(exposure); } - poll.eventually( - () -> { - assertEquals(DIRECT_EXPOSURES_ENDPOINT, server.getLastRequest().getPath()); - assertEquals(API_KEY, server.getLastRequest().getHeader("dd-api-key")); - assertNull(server.getLastRequest().getHeader("X-Datadog-EVP-Subdomain")); - assertExposures(allExposures(), exposures); - }); + poll.eventually(() -> { + assertEquals(DIRECT_EXPOSURES_ENDPOINT, server.getLastRequest().getPath()); + assertEquals(API_KEY, server.getLastRequest().getHeader("dd-api-key")); + assertNull(server.getLastRequest().getHeader("X-Datadog-EVP-Subdomain")); + assertExposures(allExposures(), exposures); + }); } } @@ -240,16 +231,14 @@ void testHighLoadScenario() throws Exception { for (int index = 0; index < exposures.size(); index += exposuresPerThread) { List partition = exposures.subList(index, Math.min(index + exposuresPerThread, exposures.size())); - futures.add( - executor.submit( - () -> { - latch.await(); - for (ExposureEvent exposure : partition) { - MILLISECONDS.sleep(random.nextInt(2)); - writer.accept(exposure); - } - return true; - })); + futures.add(executor.submit(() -> { + latch.await(); + for (ExposureEvent exposure : partition) { + MILLISECONDS.sleep(random.nextInt(2)); + writer.accept(exposure); + } + return true; + })); } latch.countDown(); // start threads @@ -325,10 +314,8 @@ void testAmbiguousExposureBatchIsNotRetriedOrReplayedDirectly() throws Exception writer.init(); writer.accept(exposures.get(0)); - poll.eventually( - () -> - verify(proxyApi) - .post(eq("exposures"), any(RequestBody.class), any(), any(), eq(false))); + poll.eventually(() -> + verify(proxyApi).post(eq("exposures"), any(RequestBody.class), any(), any(), eq(false))); MILLISECONDS.sleep(300); verify(proxyApi, times(1)) .post(eq("exposures"), any(RequestBody.class), any(), any(), eq(false)); @@ -336,10 +323,8 @@ void testAmbiguousExposureBatchIsNotRetriedOrReplayedDirectly() throws Exception .post(eq("exposures"), any(RequestBody.class), any(), any(), eq(false)); writer.accept(exposures.get(1)); - poll.eventually( - () -> - verify(directApi) - .post(eq("exposures"), any(RequestBody.class), any(), any(), eq(false))); + poll.eventually(() -> + verify(directApi).post(eq("exposures"), any(RequestBody.class), any(), any(), eq(false))); final ArgumentCaptor directBody = ArgumentCaptor.forClass(RequestBody.class); verify(directApi).post(eq("exposures"), directBody.capture(), any(), any(), eq(false)); @@ -462,9 +447,8 @@ private static int compare(ExposureEvent first, ExposureEvent second) { return result; } - result = - compareNullableString( - first.allocation == null ? null : first.allocation.key, second.allocation); + result = compareNullableString( + first.allocation == null ? null : first.allocation.key, second.allocation); if (result != 0) { return result; } @@ -476,10 +460,9 @@ private static int compare(ExposureEvent first, ExposureEvent second) { Map.Entry firstEntry = firstEntry(first.subject); Map.Entry secondEntry = firstEntry(second.subject); - result = - compareNullableString( - firstEntry == null ? null : firstEntry.getKey(), - secondEntry == null ? null : secondEntry.getKey()); + result = compareNullableString( + firstEntry == null ? null : firstEntry.getKey(), + secondEntry == null ? null : secondEntry.getKey()); if (result != 0) { return result; } diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationAggregatorTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationAggregatorTest.java index 06faeadefea..61a1d6a3aea 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationAggregatorTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationAggregatorTest.java @@ -23,7 +23,8 @@ void identicalEventsAggregateIntoOneBucketWithCount2() { final FlagEvaluationAggregator.AggregatedState state = aggregator.snapshot(); assertEquals(1, state.fullTier.size()); - final FlagEvaluationAggregator.EvalBucket bucket = state.fullTier.values().iterator().next(); + final FlagEvaluationAggregator.EvalBucket bucket = + state.fullTier.values().iterator().next(); assertEquals(2, bucket.count); assertEquals(1000L, bucket.firstEvalMs); assertEquals(2000L, bucket.lastEvalMs); @@ -130,7 +131,8 @@ void absentVariantSetsRuntimeDefaultUsed() { final FlagEvaluationAggregator.AggregatedState state = aggregator.snapshot(); assertEquals(1, state.fullTier.size()); - final FlagEvaluationAggregator.EvalBucket bucket = state.fullTier.values().iterator().next(); + final FlagEvaluationAggregator.EvalBucket bucket = + state.fullTier.values().iterator().next(); assertTrue(bucket.runtimeDefaultUsed); } @@ -147,7 +149,8 @@ void aggregatorStoresPrunedAttrsVerbatim() { aggregator.aggregate(event("flag-d", "on", "alloc1", "user-1", 1000L, true, preprunedAttrs)); final FlagEvaluationAggregator.AggregatedState state = aggregator.snapshot(); - final FlagEvaluationAggregator.EvalBucket bucket = state.fullTier.values().iterator().next(); + final FlagEvaluationAggregator.EvalBucket bucket = + state.fullTier.values().iterator().next(); assertEquals(100, bucket.prunedContextFieldCount()); assertEquals(100, bucket.prunedAttrs.size()); } @@ -189,7 +192,8 @@ void aggregatorStoresPrePrunedAttrsWithoutRePruning() { aggregator.aggregate(event("flag-e", "on", "alloc1", "user-1", 1000L, true, preprunedAttrs)); final FlagEvaluationAggregator.AggregatedState state = aggregator.snapshot(); - final FlagEvaluationAggregator.EvalBucket bucket = state.fullTier.values().iterator().next(); + final FlagEvaluationAggregator.EvalBucket bucket = + state.fullTier.values().iterator().next(); assertTrue(bucket.prunedAttrs.containsKey("short-val")); } @@ -205,20 +209,17 @@ void capSizingUsesNamedScaleConstants() { @Test void flagEvalEventDoesNotCarryReason() { - final boolean hasReasonField = - Arrays.stream( - datadog.trace.api.featureflag.flagevaluation.FlagEvalEvent.class - .getDeclaredFields()) - .anyMatch(field -> field.getName().equals("reason")); + final boolean hasReasonField = Arrays.stream( + datadog.trace.api.featureflag.flagevaluation.FlagEvalEvent.class.getDeclaredFields()) + .anyMatch(field -> field.getName().equals("reason")); assertFalse(hasReasonField); } @Test void evalBucketTracksBoundsDefaultStateAndNullContextFieldCount() { - final FlagEvaluationAggregator.EvalBucket bucket = - new FlagEvaluationAggregator.EvalBucket( - "bucket-flag", "on", "alloc1", "user-1", null, 1000L, false, null, false); + final FlagEvaluationAggregator.EvalBucket bucket = new FlagEvaluationAggregator.EvalBucket( + "bucket-flag", "on", "alloc1", "user-1", null, 1000L, false, null, false); assertEquals(0, bucket.prunedContextFieldCount()); diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationPayloadsTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationPayloadsTest.java index d4ca517fffd..796f8ad9183 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationPayloadsTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationPayloadsTest.java @@ -34,13 +34,10 @@ void fullTierPayloadUsesWorkerWireShape() throws Exception { final Map attrs = new HashMap<>(); attrs.put("region", "us-east-1"); - final Map json = - firstPayload( - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - event("my-flag", "on", "alloc-x", "user-1", 1, attrs)), - CONTEXT, - 1_000_000)); + final Map json = firstPayload(FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList(event("my-flag", "on", "alloc-x", "user-1", 1, attrs)), + CONTEXT, + 1_000_000)); final Map ev = firstEvent(json); assertObjectWithKey(ev.get("variant"), "on"); @@ -56,20 +53,16 @@ void fullTierPayloadUsesWorkerWireShape() throws Exception { @Test void eventFromFullBucketUsesFlushTimeAndEvaluationBounds() throws Exception { - final FlagEvaluationAggregator.EvalBucket bucket = - new FlagEvaluationAggregator.EvalBucket( - "ts-flag", "on", "alloc1", "user-1", null, EVAL_MS, false, emptyMap(), true); + final FlagEvaluationAggregator.EvalBucket bucket = new FlagEvaluationAggregator.EvalBucket( + "ts-flag", "on", "alloc1", "user-1", null, EVAL_MS, false, emptyMap(), true); bucket.merge(EVAL_MS + 10, false); final long flushTimeMs = EVAL_MS + 5_000; - final Map json = - firstPayload( - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( - bucket, true, true, flushTimeMs)), - CONTEXT, - 1_000_000)); + final Map json = firstPayload(FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList( + FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket(bucket, true, true, flushTimeMs)), + CONTEXT, + 1_000_000)); final Map ev = firstEvent(json); assertEquals((double) flushTimeMs, ((Number) ev.get("timestamp")).doubleValue()); @@ -80,18 +73,14 @@ void eventFromFullBucketUsesFlushTimeAndEvaluationBounds() throws Exception { @Test void degradedTierEventOmitsTargetingKeyAndContext() throws Exception { - final FlagEvaluationAggregator.EvalBucket bucket = - new FlagEvaluationAggregator.EvalBucket( - "dg-flag", "on", "alloc1", null, null, EVAL_MS, false, null, false); - - final Map json = - firstPayload( - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( - bucket, false, true, EVAL_MS)), - CONTEXT, - 1_000_000)); + final FlagEvaluationAggregator.EvalBucket bucket = new FlagEvaluationAggregator.EvalBucket( + "dg-flag", "on", "alloc1", null, null, EVAL_MS, false, null, false); + + final Map json = firstPayload(FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList( + FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket(bucket, false, true, EVAL_MS)), + CONTEXT, + 1_000_000)); final Map ev = firstEvent(json); assertNull(ev.get("targeting_key")); @@ -102,26 +91,14 @@ void degradedTierEventOmitsTargetingKeyAndContext() throws Exception { void fullTierWithObserveFullEvaluationDataTrueEmitsRawTargetingKeyAndContext() throws Exception { final Map attrs = new HashMap<>(); attrs.put("region", "us-east-1"); - final FlagEvaluationAggregator.EvalBucket bucket = - new FlagEvaluationAggregator.EvalBucket( - "pii-flag", - "on", - "alloc1", - "jane.doe@datadoghq.com", - null, - EVAL_MS, - false, - attrs, - true); - - final Map json = - firstPayload( - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( - bucket, true, true, EVAL_MS)), - CONTEXT, - 1_000_000)); + final FlagEvaluationAggregator.EvalBucket bucket = new FlagEvaluationAggregator.EvalBucket( + "pii-flag", "on", "alloc1", "jane.doe@datadoghq.com", null, EVAL_MS, false, attrs, true); + + final Map json = firstPayload(FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList( + FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket(bucket, true, true, EVAL_MS)), + CONTEXT, + 1_000_000)); final Map ev = firstEvent(json); assertEquals("jane.doe@datadoghq.com", ev.get("targeting_key")); @@ -137,25 +114,14 @@ void fullTierWithObserveFullEvaluationDataFalseHashesTargetingKeyAndOmitsContext throws Exception { final Map attrs = new HashMap<>(); attrs.put("region", "us-east-1"); - final FlagEvaluationAggregator.EvalBucket bucket = - new FlagEvaluationAggregator.EvalBucket( - "pii-flag", - "on", - "alloc1", - "jane.doe@datadoghq.com", - null, - EVAL_MS, - false, - attrs, - false); + final FlagEvaluationAggregator.EvalBucket bucket = new FlagEvaluationAggregator.EvalBucket( + "pii-flag", "on", "alloc1", "jane.doe@datadoghq.com", null, EVAL_MS, false, attrs, false); - final FlagEvaluationPayloads.EncodedPayloads payloads = - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket( - bucket, true, false, EVAL_MS)), - CONTEXT, - 1_000_000); + final FlagEvaluationPayloads.EncodedPayloads payloads = FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList( + FlagEvaluationPayloads.FlagEvaluationEvent.fromBucket(bucket, true, false, EVAL_MS)), + CONTEXT, + 1_000_000); final String rawJson = new String(payloads.bodies.get(0), java.nio.charset.StandardCharsets.UTF_8); @@ -163,9 +129,8 @@ void fullTierWithObserveFullEvaluationDataFalseHashesTargetingKeyAndOmitsContext // per-event evaluation context — these are the exact properties system-tests asserts over the // wire. (The batch envelope has its own top-level "context" field, so we guard on the nested // "evaluation" key instead, which only appears inside a per-event context object.) - assertTrue( - rawJson.contains( - "sha256_b4698f9b6d186781fa8dc59e533578fa2d8379a46b1cf6db85cda6aa9c99e51b")); + assertTrue(rawJson.contains( + "sha256_b4698f9b6d186781fa8dc59e533578fa2d8379a46b1cf6db85cda6aa9c99e51b")); assertFalse(rawJson.contains("jane.doe@datadoghq.com")); assertFalse(rawJson.contains("\"evaluation\":")); @@ -207,12 +172,11 @@ void oversizedFullPayloadRowIsDegradedBeforeDrop() throws Exception { attrs.put("payload-" + i, repeat('x', 200)); } - final FlagEvaluationPayloads.EncodedPayloads payloads = - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - event("oversized-full", "on", "alloc1", "user-1", 2, attrs)), - CONTEXT, - 512); + final FlagEvaluationPayloads.EncodedPayloads payloads = FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList( + event("oversized-full", "on", "alloc1", "user-1", 2, attrs)), + CONTEXT, + 512); assertEquals(1, payloads.bodies.size()); assertTrue(payloads.bodies.get(0).length <= 512); @@ -236,18 +200,16 @@ void oversizedFullPayloadRowStartsNewPayloadWhenDegradedRowFitsByItself() throws second.withoutTargetingKeyAndContext(); assertNotNull(degradedSecond); - final int firstPayloadSize = - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList(first), CONTEXT, 1_000_000) - .bodies - .get(0) - .length; - final int degradedPayloadSize = - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList(degradedSecond), CONTEXT, 1_000_000) - .bodies - .get(0) - .length; + final int firstPayloadSize = FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList(first), CONTEXT, 1_000_000) + .bodies + .get(0) + .length; + final int degradedPayloadSize = FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList(degradedSecond), CONTEXT, 1_000_000) + .bodies + .get(0) + .length; final int limit = Math.max(firstPayloadSize, degradedPayloadSize); final FlagEvaluationPayloads.EncodedPayloads payloads = @@ -265,12 +227,11 @@ void oversizedFullPayloadRowStartsNewPayloadWhenDegradedRowFitsByItself() throws @Test void oversizedDegradedPayloadRowIsDropped() { - final FlagEvaluationPayloads.EncodedPayloads payloads = - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - event(repeat('f', 512), "on", "alloc1", null, 2, emptyMap())), - CONTEXT, - 128); + final FlagEvaluationPayloads.EncodedPayloads payloads = FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList( + event(repeat('f', 512), "on", "alloc1", null, 2, emptyMap())), + CONTEXT, + 128); assertTrue(payloads.bodies.isEmpty()); assertEquals(2, payloads.droppedPayloadLimit); @@ -279,12 +240,11 @@ void oversizedDegradedPayloadRowIsDropped() { @Test void oversizedFullPayloadRowIsDroppedWhenDegradedRowStillExceedsLimit() { - final FlagEvaluationPayloads.EncodedPayloads payloads = - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - event(repeat('f', 512), "on", "alloc1", "user-1", 2, emptyMap())), - CONTEXT, - 128); + final FlagEvaluationPayloads.EncodedPayloads payloads = FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList( + event(repeat('f', 512), "on", "alloc1", "user-1", 2, emptyMap())), + CONTEXT, + 128); assertTrue(payloads.bodies.isEmpty()); assertEquals(2, payloads.droppedPayloadLimit); @@ -293,24 +253,21 @@ void oversizedFullPayloadRowIsDroppedWhenDegradedRowStillExceedsLimit() { @Test void errorPayloadSerializesErrorObject() throws Exception { - final Map json = - firstPayload( - FlagEvaluationPayloads.buildPayloads( - java.util.Collections.singletonList( - new FlagEvaluationPayloads.FlagEvaluationEvent( - EVAL_MS, - "err-flag", - EVAL_MS, - EVAL_MS, - 1, - null, - null, - null, - true, - "type mismatch", - null)), - CONTEXT, - 1_000_000)); + final Map json = firstPayload(FlagEvaluationPayloads.buildPayloads( + java.util.Collections.singletonList(new FlagEvaluationPayloads.FlagEvaluationEvent( + EVAL_MS, + "err-flag", + EVAL_MS, + EVAL_MS, + 1, + null, + null, + null, + true, + "type mismatch", + null)), + CONTEXT, + 1_000_000)); final Map ev = firstEvent(json); final Map error = (Map) ev.get("error"); diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationTestSupport.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationTestSupport.java index 502f0e76c69..7f33a81b48d 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationTestSupport.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationTestSupport.java @@ -133,11 +133,10 @@ static CapturedJson flushAndCapture(final TestWriterSetup setup) throws Exceptio static List flushAndCaptureAll(final TestWriterSetup setup) throws Exception { final List captured = new ArrayList<>(); when(setup.mockEvp.post(eq("flagevaluation"), any(RequestBody.class), any(), any(), eq(false))) - .thenAnswer( - inv -> { - captured.add(inv.getArgument(1)); - return null; - }); + .thenAnswer(inv -> { + captured.add(inv.getArgument(1)); + return null; + }); setup.handler.drainAndAggregate(); setup.handler.flush(); final List json = new ArrayList<>(); diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationWriterImplTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationWriterImplTest.java index ba3d03ec6d5..96395a878ab 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationWriterImplTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/FlagEvaluationWriterImplTest.java @@ -105,9 +105,8 @@ void startRegistersWriterAndCloseDeregistersIt() { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); writer.start(); assertEquals(writer, FeatureFlaggingGateway.getFlagEvalWriter()); @@ -149,9 +148,8 @@ void enqueueAfterCloseIsDroppedAndCounted() { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); writer.close(); writer.enqueue(simpleEvent("closed-flag", "on")); @@ -174,9 +172,8 @@ void enqueueDisabledDropsAndCountsAsClosedDrop() { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); FeatureFlaggingGateway.setFlagEvaluationEnqueueEnabled(false); writer.enqueue(simpleEvent("disabled-flag", "on")); @@ -197,9 +194,8 @@ void closeSweepsAndCountsEventsLeftInTheQueue() { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); // The worker is never started, so nothing drains these; close() must account for them rather // than leave them silently stranded. Stands in for the narrow window where a lock-free @@ -224,9 +220,8 @@ void enqueueIgnoresNullEvent() { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); writer.enqueue(null); @@ -239,9 +234,8 @@ void enqueueDoesNotAggregateOnTheCallingThread() { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); writer.enqueue(simpleEvent("g2-flag", "on")); writer.enqueue(simpleEvent("g2-flag", "on")); @@ -300,12 +294,10 @@ void workerHandlesEmptyPolls() throws Exception { when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); final MessagePassingBlockingQueue queue = mock(MessagePassingBlockingQueue.class); - when(queue.poll(100, TimeUnit.MILLISECONDS)) - .thenAnswer( - invocation -> { - Thread.currentThread().interrupt(); - return null; - }); + when(queue.poll(100, TimeUnit.MILLISECONDS)).thenAnswer(invocation -> { + Thread.currentThread().interrupt(); + return null; + }); final FlagEvaluationWriterImpl.FlagEvaluationSerializingHandler handler = new FlagEvaluationWriterImpl.FlagEvaluationSerializingHandler( backendApiSupplier(factory), @@ -378,17 +370,15 @@ void finalFlushRunsWithoutTheInterruptFlagSet() throws Exception { final boolean[] interruptedDuringPost = {true}; final BackendApi mockEvp = mock(BackendApi.class); when(mockEvp.post(eq("flagevaluation"), any(RequestBody.class), any(), any(), eq(false))) - .thenAnswer( - inv -> { - interruptedDuringPost[0] = Thread.currentThread().isInterrupted(); - posted.countDown(); - return null; - }); + .thenAnswer(inv -> { + interruptedDuringPost[0] = Thread.currentThread().isInterrupted(); + posted.countDown(); + return null; + }); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 64, TimeUnit.DAYS.toSeconds(1), TimeUnit.SECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 64, TimeUnit.DAYS.toSeconds(1), TimeUnit.SECONDS, backendApiSupplier(factory), cfg()); writer.startForTest(); writer.enqueue(simpleEvent("interrupt-flag", "on")); @@ -407,17 +397,15 @@ void closeDrainsAndFinalFlushesQueuedEvents() throws Exception { final RequestBody[] captured = {null}; final BackendApi mockEvp = mock(BackendApi.class); when(mockEvp.post(eq("flagevaluation"), any(RequestBody.class), any(), any(), eq(false))) - .thenAnswer( - inv -> { - captured[0] = inv.getArgument(1); - posted.countDown(); - return null; - }); + .thenAnswer(inv -> { + captured[0] = inv.getArgument(1); + posted.countDown(); + return null; + }); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 64, TimeUnit.DAYS.toSeconds(1), TimeUnit.SECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 64, TimeUnit.DAYS.toSeconds(1), TimeUnit.SECONDS, backendApiSupplier(factory), cfg()); writer.startForTest(); writer.enqueue(simpleEvent("shutdown-flag", "on")); @@ -436,9 +424,8 @@ void continuousTrafficFlushesWithoutWaitingForIdle() throws Exception { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 1 << 12, 1, TimeUnit.MILLISECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 1 << 12, 1, TimeUnit.MILLISECONDS, backendApiSupplier(factory), cfg()); writer.startForTest(); boolean posted = false; @@ -481,13 +468,12 @@ void splitPostFailureDoesNotRetryAlreadySentPayloads() throws Exception { final BackendApi mockEvp = mock(BackendApi.class); final FlagEvaluationTestSupport.TestWriterSetup setup = buildTestWriter(mockEvp, limit); final AtomicInteger posts = new AtomicInteger(); - doAnswer( - invocation -> { - if (posts.incrementAndGet() == 2) { - throw new IOException("boom"); - } - return null; - }) + doAnswer(invocation -> { + if (posts.incrementAndGet() == 2) { + throw new IOException("boom"); + } + return null; + }) .when(mockEvp) .post(eq("flagevaluation"), any(RequestBody.class), any(), any(), eq(false)); @@ -556,11 +542,10 @@ void eventConsentFalseStaysHashedEvenWhenGatewayLaterReportsTrue() throws Except final java.util.List captured = new java.util.ArrayList<>(); when(mockEvp.post(eq("flagevaluation"), any(RequestBody.class), any(), any(), eq(false))) - .thenAnswer( - inv -> { - captured.add(inv.getArgument(1)); - return null; - }); + .thenAnswer(inv -> { + captured.add(inv.getArgument(1)); + return null; + }); setup.handler.flush(); assertEquals(1, captured.size()); @@ -589,11 +574,10 @@ void eventConsentTrueStaysRawEvenWhenGatewayLaterReportsFalse() throws Exception final java.util.List captured = new java.util.ArrayList<>(); when(mockEvp.post(eq("flagevaluation"), any(RequestBody.class), any(), any(), eq(false))) - .thenAnswer( - inv -> { - captured.add(inv.getArgument(1)); - return null; - }); + .thenAnswer(inv -> { + captured.add(inv.getArgument(1)); + return null; + }); setup.handler.flush(); assertEquals(1, captured.size()); @@ -616,16 +600,15 @@ void consentOffPreservesErrorCodeSignalAndNeverLeaksPiiInErrorMessage() throws E // wire. Mirrors the existing PII guards on the targeting_key axis. final BackendApi mockEvp = mock(BackendApi.class); final FlagEvaluationTestSupport.TestWriterSetup setup = buildTestWriter(mockEvp); - setup.handler.add( - new FlagEvalEvent( - "err-flag", - null, - "alloc1", - "jane.doe@datadoghq.com", - "TYPE_MISMATCH", - 1000L, - false, - emptyMap())); + setup.handler.add(new FlagEvalEvent( + "err-flag", + null, + "alloc1", + "jane.doe@datadoghq.com", + "TYPE_MISMATCH", + 1000L, + false, + emptyMap())); final FlagEvaluationTestSupport.CapturedJson captured = flushAndCapture(setup); @@ -674,14 +657,8 @@ void scoConstructorCreatesUsableWriter() { @Test void agentlessWritesFlagEvaluationsDirectlyWhenLocalProxyIsUnavailable() throws Exception { - try (JavaTestHttpServer server = - JavaTestHttpServer.httpServer( - s -> - s.handlers( - h -> - h.prefix( - DIRECT_FLAG_EVALUATION_ENDPOINT, - api -> api.getResponse().status(200).send("OK"))))) { + try (JavaTestHttpServer server = JavaTestHttpServer.httpServer(s -> s.handlers(h -> h.prefix( + DIRECT_FLAG_EVALUATION_ENDPOINT, api -> api.getResponse().status(200).send("OK"))))) { final Config config = cfg(); when(config.getFeatureFlaggingConfigurationSource()) .thenReturn(CONFIGURATION_SOURCE_AGENTLESS); @@ -689,14 +666,13 @@ void agentlessWritesFlagEvaluationsDirectlyWhenLocalProxyIsUnavailable() throws final BackendApiFactory backendApiFactory = mock(BackendApiFactory.class); final OkHttpClient client = new OkHttpClient.Builder().build(); try { - final IntakeApi directApi = - new IntakeApi( - HttpUrl.get(server.getAddress()).resolve("/api/v2/"), - API_KEY, - "123", - HttpRetryPolicy.Factory.NEVER_RETRY, - client, - false); + final IntakeApi directApi = new IntakeApi( + HttpUrl.get(server.getAddress()).resolve("/api/v2/"), + API_KEY, + "123", + HttpRetryPolicy.Factory.NEVER_RETRY, + client, + false); when(backendApiFactory.createDirectIntakeApi(Intake.EVENT_PLATFORM, false)) .thenReturn(directApi); final FeatureFlagBackendApiFactory featureFlagBackendApiFactory = @@ -704,20 +680,19 @@ void agentlessWritesFlagEvaluationsDirectlyWhenLocalProxyIsUnavailable() throws config, backendApiFactory, FeatureFlagEventType.FLAG_EVALUATION); final PollingConditions poll = new PollingConditions(TIMEOUT_SECONDS); - try (FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, 1, TimeUnit.MILLISECONDS, featureFlagBackendApiFactory::create, config)) { + try (FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, 1, TimeUnit.MILLISECONDS, featureFlagBackendApiFactory::create, config)) { writer.startForTest(); writer.enqueue(simpleEvent("direct-flag", "on")); - poll.eventually( - () -> { - assertNotNull(server.getLastRequest()); - assertEquals(DIRECT_FLAG_EVALUATION_ENDPOINT, server.getLastRequest().getPath()); - assertEquals(API_KEY, server.getLastRequest().getHeader("dd-api-key")); - assertNull(server.getLastRequest().getHeader("X-Datadog-EVP-Subdomain")); - assertTrue(server.getLastRequest().getBody().length > 0); - }); + poll.eventually(() -> { + assertNotNull(server.getLastRequest()); + assertEquals( + DIRECT_FLAG_EVALUATION_ENDPOINT, server.getLastRequest().getPath()); + assertEquals(API_KEY, server.getLastRequest().getHeader("dd-api-key")); + assertNull(server.getLastRequest().getHeader("X-Datadog-EVP-Subdomain")); + assertTrue(server.getLastRequest().getBody().length > 0); + }); } } finally { client.dispatcher().executorService().shutdownNow(); @@ -731,9 +706,8 @@ void countContextTruncatedAccumulatesPerReason() { final BackendApi mockEvp = mock(BackendApi.class); final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + 16, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); writer.countContextTruncated("field_count"); writer.countContextTruncated("field_count"); @@ -762,9 +736,8 @@ void hasCapacityForEnqueueReflectsQueueSaturationAndCountsPreQueueOverflow() { final BackendApiFactory factory = mock(BackendApiFactory.class); when(factory.createBackendApi(any(), anyBoolean())).thenReturn(mockEvp); final int capacity = 2; - final FlagEvaluationWriterImpl writer = - new FlagEvaluationWriterImpl( - capacity, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); + final FlagEvaluationWriterImpl writer = new FlagEvaluationWriterImpl( + capacity, Long.MAX_VALUE, TimeUnit.NANOSECONDS, backendApiSupplier(factory), cfg()); assertTrue(writer.hasCapacityForEnqueue()); @@ -832,9 +805,8 @@ private static Map piiAttrs() { } private static void dispatchObserveFullEvaluationData(final boolean value) { - FeatureFlaggingGateway.dispatch( - new ServerConfiguration( - "2024-04-17T19:40:53.716Z", "SERVER", value, null, java.util.Collections.emptyMap())); + FeatureFlaggingGateway.dispatch(new ServerConfiguration( + "2024-04-17T19:40:53.716Z", "SERVER", value, null, java.util.Collections.emptyMap())); } private static Object lifecycleLock(final FlagEvaluationWriterImpl writer) throws Exception { diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/JsonApiUfcResponseParserTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/JsonApiUfcResponseParserTest.java index fae2631ce2f..88e41e98cd7 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/JsonApiUfcResponseParserTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/JsonApiUfcResponseParserTest.java @@ -26,17 +26,15 @@ class JsonApiUfcResponseParserTest { @Test void parsesJsonApiMembersInAnyOrder() throws Exception { - final ServerConfiguration configuration = - parse( - "{" - + "\"meta\":{\"ignored\":true}," - + "\"data\":{" - + "\"attributes\":" - + emptyConfig() - + ",\"ignored\":true," - + "\"type\":\"universal-flag-configuration\"" - + "}" - + "}"); + final ServerConfiguration configuration = parse("{" + + "\"meta\":{\"ignored\":true}," + + "\"data\":{" + + "\"attributes\":" + + emptyConfig() + + ",\"ignored\":true," + + "\"type\":\"universal-flag-configuration\"" + + "}" + + "}"); assertNotNull(configuration); assertEquals("Test", configuration.environment.name); @@ -60,12 +58,10 @@ void rejectsNonStringJsonApiType() throws Exception { @Test void rejectsConfigurationWithoutFlags() throws Exception { - assertNull( - parse( - "{\"data\":{" - + "\"type\":\"universal-flag-configuration\"," - + "\"attributes\":{\"environment\":{\"name\":\"Test\"}}" - + "}}")); + assertNull(parse("{\"data\":{" + + "\"type\":\"universal-flag-configuration\"," + + "\"attributes\":{\"environment\":{\"name\":\"Test\"}}" + + "}}")); } @Test @@ -77,50 +73,43 @@ void rejectsNonObjectData() throws Exception { void rejectsTrailingJson() { assertThrows( IOException.class, - () -> - parse( - "{\"data\":{\"type\":\"universal-flag-configuration\",\"attributes\":" - + emptyConfig() - + "}}{}")); + () -> parse("{\"data\":{\"type\":\"universal-flag-configuration\",\"attributes\":" + + emptyConfig() + + "}}{}")); } @Test void preprocessesSemverComparandsAndDropsMalformedFlags() throws Exception { - final ServerConfiguration configuration = - parse( - wrap( - configWithFlags( - booleanFlag("no-allocations", ""), - booleanFlag( - "no-splits", ",\"allocations\":[{\"key\":\"no-splits\",\"rules\":[]}]"), - booleanFlag( - "null-split", - ",\"allocations\":[{\"key\":\"null-split\",\"rules\":[],\"splits\":[null]}]"), - booleanFlag("no-rules", allocation("no-rules", "")), - booleanFlag("no-conditions", allocation("no-conditions", "[{}]")), - booleanFlag( - "no-operator", allocation("no-operator", "[{\"conditions\":[{}]}]")), - booleanFlag( - "non-semver", - allocation( - "non-semver", - "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"MATCHES\",\"value\":\"1\"}]}]")), - booleanFlag( - "valid-semver", - allocation( - "valid-semver", - "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"SEMVER_EQ\",\"value\":\"1.2\"}]}]")), - booleanFlag( - "invalid-semver", - allocation( - "invalid-semver", - "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"SEMVER_EQ\",\"value\":\"1.02\"}]}]")), - booleanFlag( - "non-string-semver", - allocation( - "non-string-semver", - "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"SEMVER_EQ\",\"value\":1}]}]")), - "\"null-flag\":null"))); + final ServerConfiguration configuration = parse(wrap(configWithFlags( + booleanFlag("no-allocations", ""), + booleanFlag("no-splits", ",\"allocations\":[{\"key\":\"no-splits\",\"rules\":[]}]"), + booleanFlag( + "null-split", + ",\"allocations\":[{\"key\":\"null-split\",\"rules\":[],\"splits\":[null]}]"), + booleanFlag("no-rules", allocation("no-rules", "")), + booleanFlag("no-conditions", allocation("no-conditions", "[{}]")), + booleanFlag("no-operator", allocation("no-operator", "[{\"conditions\":[{}]}]")), + booleanFlag( + "non-semver", + allocation( + "non-semver", + "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"MATCHES\",\"value\":\"1\"}]}]")), + booleanFlag( + "valid-semver", + allocation( + "valid-semver", + "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"SEMVER_EQ\",\"value\":\"1.2\"}]}]")), + booleanFlag( + "invalid-semver", + allocation( + "invalid-semver", + "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"SEMVER_EQ\",\"value\":\"1.02\"}]}]")), + booleanFlag( + "non-string-semver", + allocation( + "non-string-semver", + "[{\"conditions\":[{\"attribute\":\"version\",\"operator\":\"SEMVER_EQ\",\"value\":1}]}]")), + "\"null-flag\":null"))); assertNotNull(configuration); assertTrue(configuration.flags.containsKey("no-allocations")); @@ -138,27 +127,23 @@ void preprocessesSemverComparandsAndDropsMalformedFlags() throws Exception { assertEquals("invalid_semver_comparand", configuration.invalidFlags.get("invalid-semver")); assertEquals("invalid_semver_comparand", configuration.invalidFlags.get("non-string-semver")); - assertNotNull( - configuration - .flags - .get("valid-semver") - .allocations - .get(0) - .rules - .get(0) - .conditions - .get(0) - .semverComparand); + assertNotNull(configuration + .flags + .get("valid-semver") + .allocations + .get(0) + .rules + .get(0) + .conditions + .get(0) + .semverComparand); } @Test void dropsFlagWithMalformedAllocationsWithoutRejectingConfig() throws Exception { - final ServerConfiguration configuration = - parse( - wrap( - configWithFlags( - booleanFlag("malformed-allocations", ",\"allocations\":\"not-a-list\""), - booleanFlag("valid-sibling", "")))); + final ServerConfiguration configuration = parse(wrap(configWithFlags( + booleanFlag("malformed-allocations", ",\"allocations\":\"not-a-list\""), + booleanFlag("valid-sibling", "")))); assertNotNull(configuration); assertFalse(configuration.flags.containsKey("malformed-allocations")); @@ -168,14 +153,11 @@ void dropsFlagWithMalformedAllocationsWithoutRejectingConfig() throws Exception @Test void dropsFlagWithMissingSplitShards() throws Exception { - final ServerConfiguration configuration = - parse( - wrap( - configWithFlags( - booleanFlag( - "missing-shards", - ",\"allocations\":[{\"key\":\"missing-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\"}]}]"), - booleanFlag("valid-sibling", "")))); + final ServerConfiguration configuration = parse(wrap(configWithFlags( + booleanFlag( + "missing-shards", + ",\"allocations\":[{\"key\":\"missing-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\"}]}]"), + booleanFlag("valid-sibling", "")))); assertNotNull(configuration); assertFalse(configuration.flags.containsKey("missing-shards")); @@ -185,24 +167,21 @@ void dropsFlagWithMissingSplitShards() throws Exception { @Test void dropsFlagsWithInvalidConditionOperandsAndShardBounds() throws Exception { - final ServerConfiguration configuration = - parse( - wrap( - configWithFlags( - booleanFlag( - "non-numeric-gt", - allocation( - "non-numeric-gt", - "[{\"conditions\":[{\"attribute\":\"age\",\"operator\":\"GT\",\"value\":\"bad\"}]}]")), - booleanFlag( - "non-list-one-of", - allocation( - "non-list-one-of", - "[{\"conditions\":[{\"attribute\":\"role\",\"operator\":\"ONE_OF\",\"value\":\"admin\"}]}]")), - booleanFlag( - "negative-shard-range", - ",\"allocations\":[{\"key\":\"negative-shard-range\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":100,\"ranges\":[{\"start\":-1,\"end\":1}]}]}]}]"), - booleanFlag("valid-sibling", "")))); + final ServerConfiguration configuration = parse(wrap(configWithFlags( + booleanFlag( + "non-numeric-gt", + allocation( + "non-numeric-gt", + "[{\"conditions\":[{\"attribute\":\"age\",\"operator\":\"GT\",\"value\":\"bad\"}]}]")), + booleanFlag( + "non-list-one-of", + allocation( + "non-list-one-of", + "[{\"conditions\":[{\"attribute\":\"role\",\"operator\":\"ONE_OF\",\"value\":\"admin\"}]}]")), + booleanFlag( + "negative-shard-range", + ",\"allocations\":[{\"key\":\"negative-shard-range\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":100,\"ranges\":[{\"start\":-1,\"end\":1}]}]}]}]"), + booleanFlag("valid-sibling", "")))); assertNotNull(configuration); assertFalse(configuration.flags.containsKey("non-numeric-gt")); @@ -216,88 +195,84 @@ void dropsFlagsWithInvalidConditionOperandsAndShardBounds() throws Exception { @Test void dropsFlagsWithInvalidShardBoundsAndConditionOperands() throws Exception { - final ServerConfiguration configuration = - parse( - wrap( - configWithFlags( - booleanFlag( - "zero-total-shards", - ",\"allocations\":[{\"key\":\"zero-total-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":0,\"ranges\":[]}]}]}]"), - booleanFlag( - "unsigned-total-shards", - ",\"allocations\":[{\"key\":\"unsigned-total-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":2147483648,\"ranges\":[{\"start\":2147483648,\"end\":2147483649}]}]}]}]"), - booleanFlag( - "too-many-shards", - ",\"allocations\":[{\"key\":\"too-many-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":4294967296,\"ranges\":[]}]}]}]"), - booleanFlag( - "missing-ranges", - ",\"allocations\":[{\"key\":\"missing-ranges\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":1}]}]}]"), - booleanFlag( - "null-shard", - ",\"allocations\":[{\"key\":\"null-shard\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[null]}]}]"), - booleanFlag( - "null-range", - ",\"allocations\":[{\"key\":\"null-range\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":1,\"ranges\":[null]}]}]}]"), - booleanFlag( - "negative-range-end", - ",\"allocations\":[{\"key\":\"negative-range-end\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":1,\"ranges\":[{\"start\":0,\"end\":-1}]}]}]}]"), - booleanFlag( + final ServerConfiguration configuration = parse( + wrap( + configWithFlags( + booleanFlag( + "zero-total-shards", + ",\"allocations\":[{\"key\":\"zero-total-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":0,\"ranges\":[]}]}]}]"), + booleanFlag( + "unsigned-total-shards", + ",\"allocations\":[{\"key\":\"unsigned-total-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":2147483648,\"ranges\":[{\"start\":2147483648,\"end\":2147483649}]}]}]}]"), + booleanFlag( + "too-many-shards", + ",\"allocations\":[{\"key\":\"too-many-shards\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":4294967296,\"ranges\":[]}]}]}]"), + booleanFlag( + "missing-ranges", + ",\"allocations\":[{\"key\":\"missing-ranges\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":1}]}]}]"), + booleanFlag( + "null-shard", + ",\"allocations\":[{\"key\":\"null-shard\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[null]}]}]"), + booleanFlag( + "null-range", + ",\"allocations\":[{\"key\":\"null-range\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":1,\"ranges\":[null]}]}]}]"), + booleanFlag( + "negative-range-end", + ",\"allocations\":[{\"key\":\"negative-range-end\",\"rules\":[],\"splits\":[{\"variationKey\":\"on\",\"shards\":[{\"salt\":\"salt\",\"totalShards\":1,\"ranges\":[{\"start\":0,\"end\":-1}]}]}]}]"), + booleanFlag( + "non-boolean-is-null", + allocation( "non-boolean-is-null", - allocation( - "non-boolean-is-null", - "[{\"conditions\":[{\"attribute\":\"enabled\",\"operator\":\"IS_NULL\",\"value\":\"false\"}]}]")), - booleanFlag( + "[{\"conditions\":[{\"attribute\":\"enabled\",\"operator\":\"IS_NULL\",\"value\":\"false\"}]}]")), + booleanFlag( + "valid-condition-operands", + allocation( "valid-condition-operands", - allocation( - "valid-condition-operands", - "[{\"conditions\":[{\"attribute\":\"age\",\"operator\":\"LT\",\"value\":1},{\"attribute\":\"role\",\"operator\":\"ONE_OF\",\"value\":[\"admin\"]},{\"attribute\":\"enabled\",\"operator\":\"IS_NULL\",\"value\":true}]}]"))))); + "[{\"conditions\":[{\"attribute\":\"age\",\"operator\":\"LT\",\"value\":1},{\"attribute\":\"role\",\"operator\":\"ONE_OF\",\"value\":[\"admin\"]},{\"attribute\":\"enabled\",\"operator\":\"IS_NULL\",\"value\":true}]}]"))))); assertNotNull(configuration); assertFalse(configuration.flags.containsKey("zero-total-shards")); assertTrue(configuration.flags.containsKey("unsigned-total-shards")); assertEquals( 2_147_483_648L, - Integer.toUnsignedLong( - configuration - .flags - .get("unsigned-total-shards") - .allocations - .get(0) - .splits - .get(0) - .shards - .get(0) - .totalShards)); + Integer.toUnsignedLong(configuration + .flags + .get("unsigned-total-shards") + .allocations + .get(0) + .splits + .get(0) + .shards + .get(0) + .totalShards)); assertEquals( 2_147_483_648L, - Integer.toUnsignedLong( - configuration - .flags - .get("unsigned-total-shards") - .allocations - .get(0) - .splits - .get(0) - .shards - .get(0) - .ranges - .get(0) - .start)); + Integer.toUnsignedLong(configuration + .flags + .get("unsigned-total-shards") + .allocations + .get(0) + .splits + .get(0) + .shards + .get(0) + .ranges + .get(0) + .start)); assertEquals( 2_147_483_649L, - Integer.toUnsignedLong( - configuration - .flags - .get("unsigned-total-shards") - .allocations - .get(0) - .splits - .get(0) - .shards - .get(0) - .ranges - .get(0) - .end)); + Integer.toUnsignedLong(configuration + .flags + .get("unsigned-total-shards") + .allocations + .get(0) + .splits + .get(0) + .shards + .get(0) + .ranges + .get(0) + .end)); assertFalse(configuration.flags.containsKey("too-many-shards")); assertFalse(configuration.flags.containsKey("missing-ranges")); assertFalse(configuration.flags.containsKey("null-shard")); @@ -309,11 +284,10 @@ void dropsFlagsWithInvalidShardBoundsAndConditionOperands() throws Exception { @Test void shardAdapterFactoryRejectsQualifiedShard() { - assertNull( - UniversalFlagConfigParser.ShardAdapter.FACTORY.create( - Shard.class, - Collections.singleton(QualifiedShard.class.getAnnotation(ShardQualifier.class)), - new Moshi.Builder().build())); + assertNull(UniversalFlagConfigParser.ShardAdapter.FACTORY.create( + Shard.class, + Collections.singleton(QualifiedShard.class.getAnnotation(ShardQualifier.class)), + new Moshi.Builder().build())); } @JsonQualifier @@ -394,8 +368,7 @@ private static ServerConfiguration parse(final String json) throws Exception { } private static String wrap(final String attributes) { - return "{\"data\":{\"type\":\"universal-flag-configuration\",\"attributes\":" - + attributes + return "{\"data\":{\"type\":\"universal-flag-configuration\",\"attributes\":" + attributes + "}}"; } diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/LRUExposureCacheTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/LRUExposureCacheTest.java index 43c4c2d40f0..3a83763b51f 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/LRUExposureCacheTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/LRUExposureCacheTest.java @@ -142,20 +142,18 @@ void testMultipleAdditionsWithSameSubjectDifferentFlags() { @Test void testKeyEqualityWithNullValues() { LRUExposureCache cache = new LRUExposureCache(5); - ExposureEvent event1 = - new ExposureEvent( - System.currentTimeMillis(), - new Allocation("allocation"), - new Flag(null), - new Variant("variant"), - new Subject(null, emptyMap())); - ExposureEvent event2 = - new ExposureEvent( - System.currentTimeMillis(), - new Allocation("allocation"), - new Flag(null), - new Variant("variant"), - new Subject(null, emptyMap())); + ExposureEvent event1 = new ExposureEvent( + System.currentTimeMillis(), + new Allocation("allocation"), + new Flag(null), + new Variant("variant"), + new Subject(null, emptyMap())); + ExposureEvent event2 = new ExposureEvent( + System.currentTimeMillis(), + new Allocation("allocation"), + new Flag(null), + new Variant("variant"), + new Subject(null, emptyMap())); cache.add(event1); boolean duplicateAdded = cache.add(event2); diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/RemoteConfigServiceImplTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/RemoteConfigServiceImplTest.java index c1da0a11dcc..5f4830ce0cd 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/RemoteConfigServiceImplTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/RemoteConfigServiceImplTest.java @@ -50,8 +50,11 @@ @ExtendWith(MockitoExtension.class) class RemoteConfigServiceImplTest { - @Mock private FeatureFlaggingGateway.ConfigListener listener; - @Captor private ArgumentCaptor deserializerCaptor; + @Mock + private FeatureFlaggingGateway.ConfigListener listener; + + @Captor + private ArgumentCaptor deserializerCaptor; @AfterEach void cleanup() { @@ -84,34 +87,32 @@ void testNewConfigReceived() throws Exception { @Test void skipsMalformedFlagAllocationsAndKeepsValidFlag() throws Exception { - final ServerConfiguration config = - deserialize( - "{" - + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," - + "\"format\":\"SERVER\"," - + "\"environment\":{\"name\":\"Test\"}," - + "\"flags\":{" - + "\"malformed-flag\":{" - + "\"key\":\"malformed-flag\"," - + "\"enabled\":true," - + "\"variationType\":\"STRING\"," - + "\"variations\":{\"on\":{\"key\":\"on\",\"value\":\"on\"}}," - + "\"allocations\":\"this-is-not-a-list\"" - + "}," - + "\"valid-flag\":{" - + "\"key\":\"valid-flag\"," - + "\"enabled\":true," - + "\"variationType\":\"STRING\"," - + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," - + "\"allocations\":[{" - + "\"key\":\"default-allocation\"," - + "\"rules\":[]," - + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," - + "\"doLog\":true" - + "}]" - + "}" - + "}" - + "}"); + final ServerConfiguration config = deserialize("{" + + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," + + "\"format\":\"SERVER\"," + + "\"environment\":{\"name\":\"Test\"}," + + "\"flags\":{" + + "\"malformed-flag\":{" + + "\"key\":\"malformed-flag\"," + + "\"enabled\":true," + + "\"variationType\":\"STRING\"," + + "\"variations\":{\"on\":{\"key\":\"on\",\"value\":\"on\"}}," + + "\"allocations\":\"this-is-not-a-list\"" + + "}," + + "\"valid-flag\":{" + + "\"key\":\"valid-flag\"," + + "\"enabled\":true," + + "\"variationType\":\"STRING\"," + + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," + + "\"allocations\":[{" + + "\"key\":\"default-allocation\"," + + "\"rules\":[]," + + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," + + "\"doLog\":true" + + "}]" + + "}" + + "}" + + "}"); assertNotNull(config); assertFalse(config.flags.containsKey("malformed-flag")); @@ -121,15 +122,13 @@ void skipsMalformedFlagAllocationsAndKeepsValidFlag() throws Exception { @Test void ignoresUnknownTopLevelFields() throws Exception { - final ServerConfiguration config = - deserialize( - "{" - + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," - + "\"format\":\"SERVER\"," - + "\"environment\":{\"name\":\"Test\"}," - + "\"segments\":{\"new-schema-key\":{\"ignored\":true}}," - + "\"flags\":{}" - + "}"); + final ServerConfiguration config = deserialize("{" + + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," + + "\"format\":\"SERVER\"," + + "\"environment\":{\"name\":\"Test\"}," + + "\"segments\":{\"new-schema-key\":{\"ignored\":true}}," + + "\"flags\":{}" + + "}"); assertNotNull(config); assertEquals("2024-04-17T19:40:53.716Z", config.createdAt); @@ -141,29 +140,27 @@ void ignoresUnknownTopLevelFields() throws Exception { @Test void parsesAllocationWindowDatesAsDateFieldsWithInstantAccessors() throws Exception { - final ServerConfiguration config = - deserialize( - "{" - + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," - + "\"format\":\"SERVER\"," - + "\"environment\":{\"name\":\"Test\"}," - + "\"flags\":{" - + "\"dated-flag\":{" - + "\"key\":\"dated-flag\"," - + "\"enabled\":true," - + "\"variationType\":\"STRING\"," - + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," - + "\"allocations\":[{" - + "\"key\":\"dated-allocation\"," - + "\"rules\":[]," - + "\"startAt\":\"2023-01-01T01:00:00.123456+01:00\"," - + "\"endAt\":\"2023-01-02T00:00:00.987654Z\"," - + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," - + "\"doLog\":true" - + "}]" - + "}" - + "}" - + "}"); + final ServerConfiguration config = deserialize("{" + + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," + + "\"format\":\"SERVER\"," + + "\"environment\":{\"name\":\"Test\"}," + + "\"flags\":{" + + "\"dated-flag\":{" + + "\"key\":\"dated-flag\"," + + "\"enabled\":true," + + "\"variationType\":\"STRING\"," + + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," + + "\"allocations\":[{" + + "\"key\":\"dated-allocation\"," + + "\"rules\":[]," + + "\"startAt\":\"2023-01-01T01:00:00.123456+01:00\"," + + "\"endAt\":\"2023-01-02T00:00:00.987654Z\"," + + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," + + "\"doLog\":true" + + "}]" + + "}" + + "}" + + "}"); final Allocation allocation = config.flags.get("dated-flag").allocations.get(0); assertEquals(Date.class, Allocation.class.getField("startAt").getType()); @@ -181,43 +178,41 @@ void rejectsTrailingJson() { @Test void skipsUnknownOperatorFlagAndKeepsValidFlag() throws Exception { - final ServerConfiguration config = - deserialize( - "{" - + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," - + "\"format\":\"SERVER\"," - + "\"environment\":{\"name\":\"Test\"}," - + "\"flags\":{" - + "\"operator-grease-flag\":{" - + "\"key\":\"operator-grease-flag\"," - + "\"enabled\":true," - + "\"variationType\":\"STRING\"," - + "\"variations\":{\"trap\":{\"key\":\"trap\",\"value\":\"trap\"}}," - + "\"allocations\":[{" - + "\"key\":\"grease-allocation\"," - + "\"rules\":[{\"conditions\":[{" - + "\"attribute\":\"country\"," - + "\"operator\":\"not-a-real-operator\"," - + "\"value\":\"anything\"" - + "}]}]," - + "\"splits\":[{\"variationKey\":\"trap\",\"shards\":[]}]," - + "\"doLog\":true" - + "}]" - + "}," - + "\"valid-flag\":{" - + "\"key\":\"valid-flag\"," - + "\"enabled\":true," - + "\"variationType\":\"STRING\"," - + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," - + "\"allocations\":[{" - + "\"key\":\"default-allocation\"," - + "\"rules\":[]," - + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," - + "\"doLog\":true" - + "}]" - + "}" - + "}" - + "}"); + final ServerConfiguration config = deserialize("{" + + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," + + "\"format\":\"SERVER\"," + + "\"environment\":{\"name\":\"Test\"}," + + "\"flags\":{" + + "\"operator-grease-flag\":{" + + "\"key\":\"operator-grease-flag\"," + + "\"enabled\":true," + + "\"variationType\":\"STRING\"," + + "\"variations\":{\"trap\":{\"key\":\"trap\",\"value\":\"trap\"}}," + + "\"allocations\":[{" + + "\"key\":\"grease-allocation\"," + + "\"rules\":[{\"conditions\":[{" + + "\"attribute\":\"country\"," + + "\"operator\":\"not-a-real-operator\"," + + "\"value\":\"anything\"" + + "}]}]," + + "\"splits\":[{\"variationKey\":\"trap\",\"shards\":[]}]," + + "\"doLog\":true" + + "}]" + + "}," + + "\"valid-flag\":{" + + "\"key\":\"valid-flag\"," + + "\"enabled\":true," + + "\"variationType\":\"STRING\"," + + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," + + "\"allocations\":[{" + + "\"key\":\"default-allocation\"," + + "\"rules\":[]," + + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," + + "\"doLog\":true" + + "}]" + + "}" + + "}" + + "}"); assertNotNull(config); assertFalse(config.flags.containsKey("operator-grease-flag")); @@ -237,29 +232,25 @@ void flagMapAdapterFactoryOnlyCreatesFlagMapAdapterForFlagMapType() { assertTrue(adapter instanceof UniversalFlagConfigParser.FlagMapAdapter); assertNull( UniversalFlagConfigParser.FlagMapAdapter.FACTORY.create(String.class, emptySet(), moshi)); - assertNull( - UniversalFlagConfigParser.FlagMapAdapter.FACTORY.create( - flagsType, singleton(mock(Annotation.class)), moshi)); + assertNull(UniversalFlagConfigParser.FlagMapAdapter.FACTORY.create( + flagsType, singleton(mock(Annotation.class)), moshi)); } @Test void lenientBooleanAdapterFactoryOnlyCreatesAdapterForUnannotatedBoxedBoolean() { final Moshi moshi = moshi(); - final JsonAdapter adapter = - UniversalFlagConfigParser.LenientBooleanAdapter.FACTORY.create( - Boolean.class, emptySet(), moshi); + final JsonAdapter adapter = UniversalFlagConfigParser.LenientBooleanAdapter.FACTORY.create( + Boolean.class, emptySet(), moshi); assertNotNull(adapter); assertTrue(adapter instanceof UniversalFlagConfigParser.LenientBooleanAdapter); // Primitive boolean keeps Moshi's strict adapter so mandatory fields still reject bad values. - assertNull( - UniversalFlagConfigParser.LenientBooleanAdapter.FACTORY.create( - boolean.class, emptySet(), moshi)); + assertNull(UniversalFlagConfigParser.LenientBooleanAdapter.FACTORY.create( + boolean.class, emptySet(), moshi)); // A qualified Boolean belongs to whichever adapter declared the qualifier, not to this one. - assertNull( - UniversalFlagConfigParser.LenientBooleanAdapter.FACTORY.create( - Boolean.class, singleton(mock(Annotation.class)), moshi)); + assertNull(UniversalFlagConfigParser.LenientBooleanAdapter.FACTORY.create( + Boolean.class, singleton(mock(Annotation.class)), moshi)); } @Test @@ -273,14 +264,12 @@ void lenientBooleanAdapterIsReadOnly() { @Test void allowsNullFlagMap() throws Exception { - final ServerConfiguration config = - deserialize( - "{" - + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," - + "\"format\":\"SERVER\"," - + "\"environment\":{\"name\":\"Test\"}," - + "\"flags\":null" - + "}"); + final ServerConfiguration config = deserialize("{" + + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," + + "\"format\":\"SERVER\"," + + "\"environment\":{\"name\":\"Test\"}," + + "\"flags\":null" + + "}"); assertNotNull(config); assertNull(config.flags); @@ -288,28 +277,26 @@ void allowsNullFlagMap() throws Exception { @Test void skipsNullFlagAndKeepsValidFlag() throws Exception { - final ServerConfiguration config = - deserialize( - "{" - + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," - + "\"format\":\"SERVER\"," - + "\"environment\":{\"name\":\"Test\"}," - + "\"flags\":{" - + "\"null-flag\":null," - + "\"valid-flag\":{" - + "\"key\":\"valid-flag\"," - + "\"enabled\":true," - + "\"variationType\":\"STRING\"," - + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," - + "\"allocations\":[{" - + "\"key\":\"default-allocation\"," - + "\"rules\":[]," - + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," - + "\"doLog\":true" - + "}]" - + "}" - + "}" - + "}"); + final ServerConfiguration config = deserialize("{" + + "\"createdAt\":\"2024-04-17T19:40:53.716Z\"," + + "\"format\":\"SERVER\"," + + "\"environment\":{\"name\":\"Test\"}," + + "\"flags\":{" + + "\"null-flag\":null," + + "\"valid-flag\":{" + + "\"key\":\"valid-flag\"," + + "\"enabled\":true," + + "\"variationType\":\"STRING\"," + + "\"variations\":{\"expected\":{\"key\":\"expected\",\"value\":\"expected\"}}," + + "\"allocations\":[{" + + "\"key\":\"default-allocation\"," + + "\"rules\":[]," + + "\"splits\":[{\"variationKey\":\"expected\",\"shards\":[]}]," + + "\"doLog\":true" + + "}]" + + "}" + + "}" + + "}"); assertNotNull(config); assertFalse(config.flags.containsKey("null-flag")); @@ -331,18 +318,15 @@ void flagMapAdapterIsReadOnly() { void allocationAdapterFactoryOnlyCreatesAllocationAdapterForAllocationType() { final Moshi moshi = moshi(); - final JsonAdapter adapter = - UniversalFlagConfigParser.AllocationAdapter.FACTORY.create( - Allocation.class, emptySet(), moshi); + final JsonAdapter adapter = UniversalFlagConfigParser.AllocationAdapter.FACTORY.create( + Allocation.class, emptySet(), moshi); assertNotNull(adapter); assertTrue(adapter instanceof UniversalFlagConfigParser.AllocationAdapter); - assertNull( - UniversalFlagConfigParser.AllocationAdapter.FACTORY.create( - String.class, emptySet(), moshi)); - assertNull( - UniversalFlagConfigParser.AllocationAdapter.FACTORY.create( - Allocation.class, singleton(mock(Annotation.class)), moshi)); + assertNull(UniversalFlagConfigParser.AllocationAdapter.FACTORY.create( + String.class, emptySet(), moshi)); + assertNull(UniversalFlagConfigParser.AllocationAdapter.FACTORY.create( + Allocation.class, singleton(mock(Annotation.class)), moshi)); } @Test diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentAccumulatorTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentAccumulatorTest.java index ce6df50cfc0..1ffd94e6245 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentAccumulatorTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentAccumulatorTest.java @@ -92,12 +92,10 @@ void subjectAndPerSubjectExperimentCaps() { for (int i = 0; i < 25; i++) { acc.addSubject("subjectX", i); } - final SortedSet decoded = - decodeDeltaVarint( - acc.toSpanTags() - .get(SpanEnrichmentAccumulator.TAG_SUBJECTS_ENC) - .replaceAll("^\\{\"[a-f0-9]+\":\"", "") - .replaceAll("\"\\}$", "")); + final SortedSet decoded = decodeDeltaVarint(acc.toSpanTags() + .get(SpanEnrichmentAccumulator.TAG_SUBJECTS_ENC) + .replaceAll("^\\{\"[a-f0-9]+\":\"", "") + .replaceAll("\"\\}$", "")); assertEquals(SpanEnrichmentAccumulator.MAX_EXPERIMENTS_PER_SUBJECT, decoded.size()); // subject cap: 10 max distinct subjects @@ -207,9 +205,8 @@ void subjectNullKeyIgnoredAndPerSubjectDedupeAtCap() { void stringifyDefaultCoversAllNativeShapes() { // list containing Double, Long, Short, Byte, null, and a nested Map — exercises every // writeJsonValue branch (Number/double, Integer|Long|Short|Byte/long, null, Map, Iterable). - final Object nested = - java.util.Arrays.asList( - 1.5d, 3L, (short) 7, (byte) 2, null, Collections.singletonMap("k", "v")); + final Object nested = java.util.Arrays.asList( + 1.5d, 3L, (short) 7, (byte) 2, null, Collections.singletonMap("k", "v")); assertEquals( "[1.5,3,7,2,null,{\"k\":\"v\"}]", SpanEnrichmentAccumulator.stringifyDefault(nested)); diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentInterceptorTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentInterceptorTest.java index becbf4cd464..a037dcbc182 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentInterceptorTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentInterceptorTest.java @@ -88,7 +88,8 @@ void partialFlushExcludingRootPreservesState() { verify(root, never()).setTag(anyString(), anyString()); final SpanEnrichmentAccumulator surviving = states.peek(root); assertNotNull(surviving, "partial flush must NOT remove the accumulator"); - assertTrue(surviving.serialIdsView().contains(100) && surviving.serialIdsView().contains(108)); + assertTrue( + surviving.serialIdsView().contains(100) && surviving.serialIdsView().contains(108)); // more evaluations, then the FINAL flush with the root present states.getOrCreate(root).addSerialId(128); diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentWriterTest.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentWriterTest.java index 662fe928658..e1ac8c5c816 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentWriterTest.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/SpanEnrichmentWriterTest.java @@ -176,11 +176,9 @@ void runtimeDefaultWithNullFlagKeyIsIgnored() { @Test void acceptSwallowsResolverErrors() { - final SpanEnrichmentWriter writer = - new SpanEnrichmentWriter( - () -> { - throw new RuntimeException("resolver boom"); - }); + final SpanEnrichmentWriter writer = new SpanEnrichmentWriter(() -> { + throw new RuntimeException("resolver boom"); + }); // Must not propagate — enrichment can never break flag evaluation. writer.accept(SpanEnrichmentEvent.serialId(5, false, null)); assertTrue(writer.states().isEmpty()); @@ -189,12 +187,9 @@ void acceptSwallowsResolverErrors() { @Test void registrarErrorIsSwallowedAndNotLatched() { final AgentSpan root = rootSpan(); - final SpanEnrichmentWriter writer = - new SpanEnrichmentWriter( - () -> root, - interceptor -> { - throw new RuntimeException("register boom"); - }); + final SpanEnrichmentWriter writer = new SpanEnrichmentWriter(() -> root, interceptor -> { + throw new RuntimeException("register boom"); + }); // Registration throws → swallowed, not latched, and nothing accumulates (never flushable). writer.accept(SpanEnrichmentEvent.serialId(5, false, null)); assertTrue(writer.states().isEmpty()); diff --git a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/DDSketchHistograms.java b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/DDSketchHistograms.java index 8c68013474f..2012cb4b4a5 100644 --- a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/DDSketchHistograms.java +++ b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/DDSketchHistograms.java @@ -53,12 +53,11 @@ public HistogramWithSum newHistogramWithSum(double relativeAccuracy, int maxNumB @Override public HistogramWithSum newHistogramWithSum(List binBoundaries) { validateBoundaries(binBoundaries); - DDSketch sketch = - new DDSketch( - new ExplicitBoundaries(binBoundaries), - () -> new CollapsingLowestDenseStore(0), // negative store not used - () -> new CollapsingLowestDenseStore(binBoundaries.size() + 1), - Double.NEGATIVE_INFINITY); // assign all negative/zero values to first bin + DDSketch sketch = new DDSketch( + new ExplicitBoundaries(binBoundaries), + () -> new CollapsingLowestDenseStore(0), // negative store not used + () -> new CollapsingLowestDenseStore(binBoundaries.size() + 1), + Double.NEGATIVE_INFINITY); // assign all negative/zero values to first bin return new DDSketchHistogramWithSum(sketch); } @@ -75,11 +74,8 @@ static void validateBoundaries(List boundaries) { throw new IllegalArgumentException("invalid bucket boundary: NaN"); } if (previousBoundary != null && previousBoundary >= boundary) { - throw new IllegalArgumentException( - "Bucket boundaries must be in increasing order: " - + previousBoundary - + " >= " - + boundary); + throw new IllegalArgumentException("Bucket boundaries must be in increasing order: " + + previousBoundary + " >= " + boundary); } previousBoundary = boundary; } diff --git a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/MonitoringImpl.java b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/MonitoringImpl.java index 95dc6dee6e7..2025b01ff2e 100644 --- a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/MonitoringImpl.java +++ b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/MonitoringImpl.java @@ -27,9 +27,8 @@ public Recording newTimer(final String name, final String... tags) { @Override public Recording newThreadLocalTimer(final String name) { - return new ThreadLocalRecording( - ThreadLocal.withInitial( - () -> newTimer(name, "thread:" + Thread.currentThread().getName()))); + return new ThreadLocalRecording(ThreadLocal.withInitial( + () -> newTimer(name, "thread:" + Thread.currentThread().getName()))); } @Override diff --git a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClient.java b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClient.java index 8f319cdef91..afafe60d040 100644 --- a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClient.java +++ b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClient.java @@ -77,13 +77,12 @@ public void serviceCheck( final String message, final String... tags) { - ServiceCheck serviceCheck = - ServiceCheck.builder() - .withName(nameMapping.apply(serviceCheckName)) - .withStatus(serviceCheckStatus(status)) - .withMessage(message) - .withTags(tagMapping.apply(tags)) - .build(); + ServiceCheck serviceCheck = ServiceCheck.builder() + .withName(nameMapping.apply(serviceCheckName)) + .withStatus(serviceCheckStatus(status)) + .withMessage(message) + .withTags(tagMapping.apply(tags)) + .build(); connection.statsd.recordServiceCheckRun(serviceCheck); } @@ -92,13 +91,12 @@ public void serviceCheck( public void recordEvent( String type, String source, String eventName, String message, String... tags) { Event.AlertType alertType = Event.AlertType.valueOf(type.toUpperCase()); - Event.Builder eventBuilder = - Event.builder() - .withTitle(eventName) - .withText(message) - .withSourceTypeName(source) - .withDate(System.currentTimeMillis()) - .withAlertType(alertType); + Event.Builder eventBuilder = Event.builder() + .withTitle(eventName) + .withText(message) + .withSourceTypeName(source) + .withDate(System.currentTimeMillis()) + .withAlertType(alertType); connection.statsd.recordEvent(eventBuilder.build(), tagMapping.apply(tags)); } diff --git a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClientManager.java b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClientManager.java index 91407f1b7b8..8437f778ba6 100644 --- a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClientManager.java +++ b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDClientManager.java @@ -128,15 +128,14 @@ static final class NameResolver implements Function { private final Function namePrefixer; NameResolver(final String namespace) { - this.namePrefixer = - new Function() { - private final String prefix = namespace + '.'; - - @Override - public String apply(final String metricName) { - return prefix + metricName; - } - }; + this.namePrefixer = new Function() { + private final String prefix = namespace + '.'; + + @Override + public String apply(final String metricName) { + return prefix + metricName; + } + }; } @Override @@ -154,14 +153,13 @@ static final class TagCombiner implements Function { public TagCombiner(final String[] constantTags) { this.packedTags = pack(constantTags); - this.tagsInserter = - tags -> { - // extend per-call array by one to add the pre-packed constant tags - String[] result = new String[tags.length + 1]; - System.arraycopy(tags, 0, result, 1, tags.length); - result[0] = packedTags[0]; - return result; - }; + this.tagsInserter = tags -> { + // extend per-call array by one to add the pre-packed constant tags + String[] result = new String[tags.length + 1]; + System.arraycopy(tags, 0, result, 1, tags.length); + result[0] = packedTags[0]; + return result; + }; } @Override diff --git a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDConnection.java b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDConnection.java index f64fdbd285c..5cc4ac05c44 100644 --- a/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDConnection.java +++ b/products/metrics/metrics-lib/src/main/java/datadog/metrics/impl/statsd/DDAgentStatsDConnection.java @@ -78,10 +78,8 @@ public int getErrorCount() { } private void scheduleConnect() { - long remainingDelay = - Config.get().getDogStatsDStartDelay() - - MILLISECONDS.toSeconds( - System.currentTimeMillis() - Config.get().getStartTimeMillis()); + long remainingDelay = Config.get().getDogStatsDStartDelay() + - MILLISECONDS.toSeconds(System.currentTimeMillis() - Config.get().getStartTimeMillis()); if (remainingDelay > 0) { if (log.isDebugEnabled()) { @@ -103,15 +101,14 @@ private void doConnect() { log.debug("Creating StatsD client - {}", statsDAddress()); } - NonBlockingStatsDClientBuilder clientBuilder = - new NonBlockingStatsDClientBuilder() - .threadFactory(STATSD_CLIENT_THREAD_FACTORY) - .enableTelemetry(false) - .enableAggregation(useAggregation) - .hostname(host) - .port(port) - .namedPipe(namedPipe) - .errorHandler(this); + NonBlockingStatsDClientBuilder clientBuilder = new NonBlockingStatsDClientBuilder() + .threadFactory(STATSD_CLIENT_THREAD_FACTORY) + .enableTelemetry(false) + .enableAggregation(useAggregation) + .hostname(host) + .port(port) + .namedPipe(namedPipe) + .errorHandler(this); // when using UDS, set "entity-id" to "none" to avoid having the DogStatsD // server add origin tags (see https://github.com/DataDog/jmxfetch/pull/264) diff --git a/products/metrics/metrics-lib/src/test/java/datadog/metrics/impl/ThreadLocalRecordingTest.java b/products/metrics/metrics-lib/src/test/java/datadog/metrics/impl/ThreadLocalRecordingTest.java index f533355eb89..9c4bd8b4b7c 100644 --- a/products/metrics/metrics-lib/src/test/java/datadog/metrics/impl/ThreadLocalRecordingTest.java +++ b/products/metrics/metrics-lib/src/test/java/datadog/metrics/impl/ThreadLocalRecordingTest.java @@ -17,13 +17,11 @@ class ThreadLocalRecordingTest { void delegatesPerThread() throws Exception { Map> callsByThread = new ConcurrentHashMap<>(); - ThreadLocal sink = - ThreadLocal.withInitial( - () -> { - List calls = new ArrayList<>(); - callsByThread.put(Thread.currentThread(), calls); - return recordCalls(calls); - }); + ThreadLocal sink = ThreadLocal.withInitial(() -> { + List calls = new ArrayList<>(); + callsByThread.put(Thread.currentThread(), calls); + return recordCalls(calls); + }); Recording recording = new ThreadLocalRecording(sink); @@ -33,22 +31,20 @@ void delegatesPerThread() throws Exception { Thread[] threads = new Thread[threadCount]; for (int i = 0; i < threadCount; i++) { - threads[i] = - new Thread( - () -> { - ready.countDown(); - try { - ready.await(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - recording.start(); - recording.reset(); - recording.stop(); - recording.flush(); - done.countDown(); - }); + threads[i] = new Thread(() -> { + ready.countDown(); + try { + ready.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + recording.start(); + recording.reset(); + recording.stop(); + recording.flush(); + done.countDown(); + }); threads[i].start(); } done.await(); diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/DefaultConfigurationPoller.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/DefaultConfigurationPoller.java index 76ef06740b7..be230d3e861 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/DefaultConfigurationPoller.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/DefaultConfigurationPoller.java @@ -272,11 +272,10 @@ private boolean initialize() { try { // Initialization of these is delayed until the remote config URL is available. // See #initialize(). - Moshi moshi = - new Moshi.Builder() - .add(Instant.class, new InstantJsonAdapter()) - .add(ByteString.class, new RawJsonAdapter()) - .build(); + Moshi moshi = new Moshi.Builder() + .add(Instant.class, new InstantJsonAdapter()) + .add(ByteString.class, new RawJsonAdapter()) + .build(); this.responseFactory = new RemoteConfigResponse.Factory(moshi); this.requestFactory = new PollerRequestFactory(config, tracerVersion, containerId, entityId, url, moshi); @@ -289,12 +288,8 @@ private boolean initialize() { } private Response fetchConfiguration() throws IOException { - Request request = - this.requestFactory.newConfigurationRequest( - getSubscribedProductNames(), - this.nextClientState, - getCachedTargetFiles(), - capabilities); + Request request = this.requestFactory.newConfigurationRequest( + getSubscribedProductNames(), this.nextClientState, getCachedTargetFiles(), capabilities); if (request == null) { throw new IOException("Endpoint has not been discovered yet"); } @@ -414,12 +409,11 @@ private void handleAgentResponse(ResponseBody body) { ParsedConfigKey parsedConfigKey = ParsedConfigKey.parse(configKey); Product product = parsedConfigKey.getProduct(); if (!(productStates.containsKey(product))) { - throw new ReportableException( - "Told to handle config key " - + configKey - + ", but the product " - + parsedConfigKey.getProductName() - + " is not being handled"); + throw new ReportableException("Told to handle config key " + + configKey + + ", but the product " + + parsedConfigKey.getProductName() + + " is not being handled"); } parsedKeysByProduct.computeIfAbsent(product, k -> new ArrayList<>()).add(parsedConfigKey); } catch (ReportableException e) { diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/HexUtils.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/HexUtils.java index e21937b07d6..5d54d3a3181 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/HexUtils.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/HexUtils.java @@ -3,12 +3,11 @@ import java.util.Arrays; public class HexUtils { - private static final int[] DEC = - new int[] { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15 - }; + private static final int[] DEC = new int[] { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, + 11, 12, 13, 14, 15 + }; private HexUtils() {} diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/JsonCanonicalizer.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/JsonCanonicalizer.java index 081e99eab9b..f3e5f126b42 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/JsonCanonicalizer.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/JsonCanonicalizer.java @@ -36,28 +36,26 @@ private static void serialize(ByteArrayOutputStream os, Object o) { private static void serialize(ByteArrayOutputStream os, String s) { os.write('"'); - s.codePoints() - .forEach( - codepoint -> { - if (codepoint == '\\' || codepoint == '"') { - os.write('\\'); - } - if (codepoint < 0x80) { - os.write(codepoint); - } else if (codepoint < 0x800) { - os.write(0xc0 | (codepoint >> 6)); - os.write(0x80 | (codepoint & 0x3f)); - } else if (codepoint < 0x10000) { - os.write(0xe0 | ((codepoint >> 12))); - os.write(0x80 | ((codepoint >> 6) & 0x3f)); - os.write(0x80 | (codepoint & 0x3f)); - } else { - os.write(0xf0 | ((codepoint >> 18))); - os.write(0x80 | ((codepoint >> 12) & 0x3f)); - os.write(0x80 | ((codepoint >> 6) & 0x3f)); - os.write(0x80 | (codepoint & 0x3f)); - } - }); + s.codePoints().forEach(codepoint -> { + if (codepoint == '\\' || codepoint == '"') { + os.write('\\'); + } + if (codepoint < 0x80) { + os.write(codepoint); + } else if (codepoint < 0x800) { + os.write(0xc0 | (codepoint >> 6)); + os.write(0x80 | (codepoint & 0x3f)); + } else if (codepoint < 0x10000) { + os.write(0xe0 | ((codepoint >> 12))); + os.write(0x80 | ((codepoint >> 6) & 0x3f)); + os.write(0x80 | (codepoint & 0x3f)); + } else { + os.write(0xf0 | ((codepoint >> 18))); + os.write(0x80 | ((codepoint >> 12) & 0x3f)); + os.write(0x80 | ((codepoint >> 6) & 0x3f)); + os.write(0x80 | (codepoint & 0x3f)); + } + }); os.write('"'); } @@ -89,18 +87,17 @@ private static void serialize(ByteArrayOutputStream os, Map map) map.entrySet().stream() // the canonical json spec only says "keys are lexicographically sorted" .sorted((e1, e2) -> String.CASE_INSENSITIVE_ORDER.compare(e1.getKey(), e2.getKey())) - .forEach( - e -> { - if (first[0]) { - first[0] = false; - } else { - os.write(','); - } + .forEach(e -> { + if (first[0]) { + first[0] = false; + } else { + os.write(','); + } - serialize(os, e.getKey()); - os.write(':'); - serialize(os, e.getValue()); - }); + serialize(os, e.getKey()); + os.write(':'); + serialize(os, e.getValue()); + }); os.write('}'); } diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerRequestFactory.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerRequestFactory.java index f4714afd973..c294ba12933 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerRequestFactory.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerRequestFactory.java @@ -88,11 +88,9 @@ public Request newConfigurationRequest( long capabilities) { Request.Builder requestBuilder = new Request.Builder().url(this.url).get(); MediaType applicationJson = MediaType.parse("application/json"); - RequestBody requestBody = - RequestBody.create( - applicationJson, - buildRemoteConfigRequestJson( - productNames, clientState, cachedTargetFiles, capabilities)); + RequestBody requestBody = RequestBody.create( + applicationJson, + buildRemoteConfigRequestJson(productNames, clientState, cachedTargetFiles, capabilities)); requestBuilder.post(requestBody); if (this.apiKey != null) { requestBuilder.addHeader(HEADER_DD_API_KEY, this.apiKey); @@ -111,9 +109,8 @@ private String buildRemoteConfigRequestJson( ClientState clientState, Collection cachedTargetFiles, long capabilities) { - RemoteConfigRequest rcRequest = - buildRemoteConfigRequest( - productNames, clientState, cachedTargetFiles, capabilities, ServiceNameCollector.get()); + RemoteConfigRequest rcRequest = buildRemoteConfigRequest( + productNames, clientState, cachedTargetFiles, capabilities, ServiceNameCollector.get()); return moshi.adapter(RemoteConfigRequest.class).toJson(rcRequest); } @@ -140,10 +137,9 @@ public RemoteConfigRequest buildRemoteConfigRequest( } private List buildRequestTags() { - List tags = - Config.get().getGlobalTags().entrySet().stream() - .map(entry -> entry.getKey() + ":" + entry.getValue()) - .collect(Collectors.toList()); + List tags = Config.get().getGlobalTags().entrySet().stream() + .map(entry -> entry.getKey() + ":" + entry.getValue()) + .collect(Collectors.toList()); GitInfo gitInfo = GitInfoProvider.INSTANCE.getGitInfo(); String repositoryURL = gitInfo.getRepositoryURL(); if (repositoryURL != null) { @@ -153,12 +149,11 @@ private List buildRequestTags() { if (sha != null) { tags.add(Tags.GIT_COMMIT_SHA + ":" + sha); } - tags.addAll( - Arrays.asList( - "env:" + this.env, - "version:" + this.ddVersion, - "tracer_version:" + this.tracerVersion, - "host_name:" + this.hostName)); + tags.addAll(Arrays.asList( + "env:" + this.env, + "version:" + this.ddVersion, + "tracer_version:" + this.tracerVersion, + "host_name:" + this.hostName)); return tags; } diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java index 93a47be51f0..7beded9b692 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java @@ -58,8 +58,7 @@ private void reschedule() { } else { initialDelay = 0; } - this.scheduled = - taskScheduler.scheduleAtFixedRate( - poller::poll, poller, initialDelay, currentPollInterval, TimeUnit.MILLISECONDS); + this.scheduled = taskScheduler.scheduleAtFixedRate( + poller::poll, poller, initialDelay, currentPollInterval, TimeUnit.MILLISECONDS); } } diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/state/ProductState.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/state/ProductState.java index ccce0dab21c..58e28e2cd23 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/state/ProductState.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/state/ProductState.java @@ -92,10 +92,9 @@ public boolean apply( // Step 3: Remove obsolete configurations (for all products) // For ASM_DD, this is critical: removes MUST happen before applies to prevent // duplicate rule warnings from the ddwaf rule parser and causing memory spikes. - List keysToRemove = - cachedTargetFiles.keySet().stream() - .filter(configKey -> !configBeenUsedByProduct.contains(configKey)) - .collect(Collectors.toList()); + List keysToRemove = cachedTargetFiles.keySet().stream() + .filter(configKey -> !configBeenUsedByProduct.contains(configKey)) + .collect(Collectors.toList()); for (ParsedConfigKey configKey : keysToRemove) { changesDetected = true; @@ -193,10 +192,9 @@ RemoteConfigResponse.Targets.ConfigTarget getTargetOrThrow( RemoteConfigResponse.Targets.ConfigTarget target = fleetResponse.getTarget(configKey.toString()); if (target == null) { - throw new ReportableException( - "Told to apply config for " - + configKey - + " but no corresponding entry exists in targets.targets_signed.targets"); + throw new ReportableException("Told to apply config for " + + configKey + + " but no corresponding entry exists in targets.targets_signed.targets"); } return target; } @@ -218,10 +216,9 @@ byte[] getTargetFileContent(RemoteConfigResponse fleetResponse, ParsedConfigKey maybeFileContent = fleetResponse.getFileContents(configKey.toString()); } catch (MissingContentException e) { if (cachedTargetFiles.containsKey(configKey)) { - throw new ReportableException( - "Told to apply config " - + configKey - + " but content not present even though hash differs from that of 'cached file'"); + throw new ReportableException("Told to apply config " + + configKey + + " but content not present even though hash differs from that of 'cached file'"); } throw new ReportableException(e.getMessage()); } catch (Exception e) { diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigRequest.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigRequest.java index c8b6c388d41..2b1ac4a82b1 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigRequest.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigRequest.java @@ -25,20 +25,18 @@ public static RemoteConfigRequest newRequest( Collection cachedTargetFiles, long capabilities) { - ClientInfo.TracerInfo tracerInfo = - new RemoteConfigRequest.ClientInfo.TracerInfo( - runtimeId, - tracerVersion, - serviceName, - extraServices, - serviceEnv, - serviceVersion, - tags, - ProcessTags.getTagsAsStringList()); - - ClientInfo clientInfo = - new RemoteConfigRequest.ClientInfo( - clientState, clientId, productNames, tracerInfo, capabilities); + ClientInfo.TracerInfo tracerInfo = new RemoteConfigRequest.ClientInfo.TracerInfo( + runtimeId, + tracerVersion, + serviceName, + extraServices, + serviceEnv, + serviceVersion, + tags, + ProcessTags.getTagsAsStringList()); + + ClientInfo clientInfo = new RemoteConfigRequest.ClientInfo( + clientState, clientId, productNames, tracerInfo, capabilities); return new RemoteConfigRequest(clientInfo, cachedTargetFiles); } @@ -249,10 +247,9 @@ public CachedTargetFile( String path, long length, Map hashes) { this.path = path; this.length = length; - List hashesList = - hashes.entrySet().stream() - .map(e -> new TargetFileHash(e.getKey(), e.getValue())) - .collect(Collectors.toList()); + List hashesList = hashes.entrySet().stream() + .map(e -> new TargetFileHash(e.getKey(), e.getValue())) + .collect(Collectors.toList()); this.hashes = hashesList; } diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigResponse.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigResponse.java index 0fcb8482ab8..54b2e5d0b8d 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigResponse.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/tuf/RemoteConfigResponse.java @@ -57,9 +57,8 @@ public Optional fromInputStream(InputStream inputStream) { byte[] targetsJsonDecoded = Base64.getDecoder().decode(targetsJsonBase64.getBytes(StandardCharsets.ISO_8859_1)); if (targetsJsonDecoded.length > 0) { - response.targets = - adapterTargets.fromJson( - Okio.buffer(Okio.source(new ByteArrayInputStream(targetsJsonDecoded)))); + response.targets = adapterTargets.fromJson( + Okio.buffer(Okio.source(new ByteArrayInputStream(targetsJsonDecoded)))); response.targets.targetsSignedUntyped = extractUntypedSignedField(targetsJsonDecoded); } response.targetsJson = null; @@ -135,24 +134,22 @@ public byte[] getFileContents(String configKey) { byte[] decode = Base64.getDecoder().decode(raw); BigInteger gottenHash = sha256(decode); if (!expectedHash.equals(gottenHash)) { - throw new IntegrityCheckException( - "File " - + configKey - + " does not " - + "have the expected sha256 hash: Expected " - + expectedHash.toString(16) - + ", but got " - + gottenHash.toString(16)); + throw new IntegrityCheckException("File " + + configKey + + " does not " + + "have the expected sha256 hash: Expected " + + expectedHash.toString(16) + + ", but got " + + gottenHash.toString(16)); } if (decode.length != configTarget.length) { - throw new IntegrityCheckException( - "File " - + configKey - + " does not " - + "have the expected length: Expected " - + configTarget.length - + ", but got " - + decode.length); + throw new IntegrityCheckException("File " + + configKey + + " does not " + + "have the expected length: Expected " + + configTarget.length + + ", but got " + + decode.length); } return decode; diff --git a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/DefaultConfigurationPollerSpecification.java b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/DefaultConfigurationPollerSpecification.java index 51922d9cbfa..5daa887ad58 100644 --- a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/DefaultConfigurationPollerSpecification.java +++ b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/DefaultConfigurationPollerSpecification.java @@ -73,7 +73,8 @@ @WithConfig(key = "remote_config.integrity_check.enabled", value = "true") class DefaultConfigurationPollerSpecification extends DDJavaSpecification { private static final HttpUrl URL = HttpUrl.get("https://example.com/v0.7/config"); - private static final Request REQUEST = new Request.Builder().url("https://example.com").build(); + private static final Request REQUEST = + new Request.Builder().url("https://example.com").build(); private static final int DEFAULT_POLL_PERIOD = 5000; private static final String KEY_ID = "TEST_KEY_ID"; private static final Ed25519PrivateKey PRIVATE_KEY = @@ -111,9 +112,8 @@ private Response buildOKResponse(String bodyStr) { void setup() { // value derived from the randomly generated keypair, so it cannot be a @WithConfig literal injectSysConfig("dd.rc.targets.key", new BigInteger(1, PUBLIC_KEY.toByteArray()).toString(16)); - poller = - new DefaultConfigurationPoller( - Config.get(), "0.0.0", "", "", () -> configUrlSupplier.get(), okHttpClient, scheduler); + poller = new DefaultConfigurationPoller( + Config.get(), "0.0.0", "", "", () -> configUrlSupplier.get(), okHttpClient, scheduler); } // ----- Tests ----- @@ -211,48 +211,45 @@ void handleProductListenersPerConfig() throws IOException { String activationKey = "datadog/2/ASM_FEATURES/asm_features_activation/config"; String sampleRateKey = "datadog/2/ASM_FEATURES/api_security/sample_rate"; - String respBody = - toJson( - map( - "client_configs", list(activationKey, sampleRateKey), - "roots", list(), - "target_files", - list( - map("path", activationKey, "raw", b64("{\"asm\":{\"enabled\":true}}")), - map( - "path", - sampleRateKey, - "raw", - b64("{\"api_security\": {\"request_sample_rate\": 0.1}"))), - "targets", - signAndBase64EncodeTargets( - map( - "signed", + String respBody = toJson(map( + "client_configs", list(activationKey, sampleRateKey), + "roots", list(), + "target_files", + list( + map("path", activationKey, "raw", b64("{\"asm\":{\"enabled\":true}}")), + map( + "path", + sampleRateKey, + "raw", + b64("{\"api_security\": {\"request_sample_rate\": 0.1}"))), + "targets", + signAndBase64EncodeTargets(map( + "signed", + map( + "expires", + "2022-09-17T12:49:15Z", + "spec_version", + "1.0.0", + "targets", + map( + activationKey, + map( + "custom", map("v", 1), + "hashes", + map( + "sha256", + "159658ab85be7207761a4111172b01558394bfc74a1fe1d314f2023f7c656db"), + "length", 24), + sampleRateKey, map( - "expires", - "2022-09-17T12:49:15Z", - "spec_version", - "1.0.0", - "targets", - map( - activationKey, - map( - "custom", map("v", 1), - "hashes", - map( - "sha256", - "159658ab85be7207761a4111172b01558394bfc74a1fe1d314f2023f7c656db"), - "length", 24), - sampleRateKey, - map( - "custom", map("v", 1), - "hashes", - map( - "sha256", - "bc898b7eb75d9fd0ddee1c1a556bc3c528dd41382950aa86e48816f792d01494"), - "length", 45)), - "version", - 1))))); + "custom", map("v", 1), + "hashes", + map( + "sha256", + "bc898b7eb75d9fd0ddee1c1a556bc3c528dd41382950aa86e48816f792d01494"), + "length", 45)), + "version", + 1))))); String noConfigs = withClientConfigs(SAMPLE_RESP_BODY, list()); @@ -281,53 +278,50 @@ void processingHappensForAllListeners() throws IOException { listeners.add(typedListener()); } - String respBody = - toJson( - map( - "client_configs", - list( + String respBody = toJson(map( + "client_configs", + list( + "datadog/2/ASM_FEATURES/asm_features_activation/config", + "foo/ASM_DD/bar/config", + "foo/ASM/bar/config", + "foo/ASM_DATA/bar/config", + "foo/LIVE_DEBUGGING/bar/config"), + "roots", list(), + "target_files", + list( + map( + "path", + "datadog/2/ASM_FEATURES/asm_features_activation/config", + "raw", + b64("{\"asm\":{\"enabled\":true}}")), + map("path", "foo/ASM_DD/bar/config", "raw", ""), + map("path", "foo/ASM/bar/config", "raw", ""), + map("path", "foo/ASM_DATA/bar/config", "raw", ""), + map("path", "foo/LIVE_DEBUGGING/bar/config", "raw", "")), + "targets", + signAndBase64EncodeTargets(map( + "signed", + map( + "expires", + "2022-09-17T12:49:15Z", + "spec_version", + "1.0.0", + "targets", + map( "datadog/2/ASM_FEATURES/asm_features_activation/config", - "foo/ASM_DD/bar/config", - "foo/ASM/bar/config", - "foo/ASM_DATA/bar/config", - "foo/LIVE_DEBUGGING/bar/config"), - "roots", list(), - "target_files", - list( - map( - "path", - "datadog/2/ASM_FEATURES/asm_features_activation/config", - "raw", - b64("{\"asm\":{\"enabled\":true}}")), - map("path", "foo/ASM_DD/bar/config", "raw", ""), - map("path", "foo/ASM/bar/config", "raw", ""), - map("path", "foo/ASM_DATA/bar/config", "raw", ""), - map("path", "foo/LIVE_DEBUGGING/bar/config", "raw", "")), - "targets", - signAndBase64EncodeTargets( - map( - "signed", map( - "expires", - "2022-09-17T12:49:15Z", - "spec_version", - "1.0.0", - "targets", - map( - "datadog/2/ASM_FEATURES/asm_features_activation/config", - map( - "custom", map("v", 1), - "hashes", - map( - "sha256", - "159658ab85be7207761a4111172b01558394bfc74a1fe1d314f2023f7c656db"), - "length", 24), - "foo/ASM_DD/bar/config", emptyTarget(), - "foo/ASM/bar/config", emptyTarget(), - "foo/ASM_DATA/bar/config", emptyTarget(), - "foo/LIVE_DEBUGGING/bar/config", emptyTarget()), - "version", - 1))))); + "custom", map("v", 1), + "hashes", + map( + "sha256", + "159658ab85be7207761a4111172b01558394bfc74a1fe1d314f2023f7c656db"), + "length", 24), + "foo/ASM_DD/bar/config", emptyTarget(), + "foo/ASM/bar/config", emptyTarget(), + "foo/ASM_DATA/bar/config", emptyTarget(), + "foo/LIVE_DEBUGGING/bar/config", emptyTarget()), + "version", + 1))))); poller.addListener(Product.ASM_DD, deserializer, listeners.get(1)); poller.addListener(Product.ASM, deserializer, listeners.get(2)); @@ -348,14 +342,11 @@ void processingHappensForAllListeners() throws IOException { @Test void reschedulesIfInstructedToDoSo() throws IOException { - poller.addListener( - Product.ASM_DD, - parseDeserializer(), - (configKey, config, hinter) -> { - hinter.suggestPollingRate(Duration.ofMillis(124)); - hinter.suggestPollingRate(Duration.ofMillis(123)); - hinter.suggestPollingRate(Duration.ofMillis(1230)); // higher is ignored - }); + poller.addListener(Product.ASM_DD, parseDeserializer(), (configKey, config, hinter) -> { + hinter.suggestPollingRate(Duration.ofMillis(124)); + hinter.suggestPollingRate(Duration.ofMillis(123)); + hinter.suggestPollingRate(Duration.ofMillis(1230)); // higher is ignored + }); start(); when(scheduler.scheduleAtFixedRate(any(), eq(poller), eq(123L), eq(123L), eq(MILLISECONDS))) @@ -383,12 +374,11 @@ void setsCachedFilesAndConfigStateOnSecondRequest() throws IOException { assertEquals(1, cachedTargetFiles.size()); Map cached = asMap(cachedTargetFiles.get(0)); assertEquals( - list( - map( - "algorithm", - "sha256", - "hash", - "6302258236e6051216b950583ec7136d946b463c17cbe64384ba5d566324819")), + list(map( + "algorithm", + "sha256", + "hash", + "6302258236e6051216b950583ec7136d946b463c17cbe64384ba5d566324819")), cached.get("hashes")); assertEquals(919L, asLong(cached.get("length"))); assertEquals("employee/ASM_DD/1.recommended.json/config", cached.get("path")); @@ -466,7 +456,8 @@ void appliesConfigurationOnlyIfTheHashHasChanged() throws IOException { Map changed = parseMap(SAMPLE_RESP_BODY); List targetFiles = asList(changed.get("target_files")); - byte[] fileDecoded = Base64.getDecoder().decode((String) asMap(targetFiles.get(0)).get("raw")); + byte[] fileDecoded = + Base64.getDecoder().decode((String) asMap(targetFiles.get(0)).get("raw")); byte[] newFile = Arrays.copyOf(fileDecoded, fileDecoded.length + 1); newFile[fileDecoded.length] = '\n'; asMap(targetFiles.get(0)).put("raw", Base64.getEncoder().encodeToString(newFile)); @@ -500,7 +491,8 @@ void configurationCannotBeAppliedWithoutHashes() throws IOException { Map noHashes = parseMap(SAMPLE_RESP_BODY); Map targets = decodeTargets(noHashes.get("targets")); - asMap(asMap(asMap(asMap(targets.get("signed")).get("targets")).get(configKey)).get("hashes")) + asMap(asMap(asMap(asMap(targets.get("signed")).get("targets")).get(configKey)) + .get("hashes")) .remove("sha256"); noHashes.put("targets", signAndBase64EncodeTargets(targets)); @@ -525,7 +517,8 @@ void encodedFileIsNotValidBase64Data() throws IOException { Map badBase64 = parseMap(SAMPLE_RESP_BODY); List targetFiles = asList(badBase64.get("target_files")); - byte[] fileDecoded = Base64.getDecoder().decode((String) asMap(targetFiles.get(0)).get("raw")); + byte[] fileDecoded = + Base64.getDecoder().decode((String) asMap(targetFiles.get(0)).get("raw")); asMap(targetFiles.get(0)).put("raw", Base64.getEncoder().encodeToString(fileDecoded) + "##"); stubHttp(buildOKResponse(toJson(badBase64)), buildOKResponse(SAMPLE_RESP_BODY)); @@ -563,7 +556,8 @@ void rejectsConfigurationIfTheHashIsWrong() throws IOException { Map wrongHash = parseMap(SAMPLE_RESP_BODY); Map targets = decodeTargets(wrongHash.get("targets")); - asMap(asMap(asMap(asMap(targets.get("signed")).get("targets")).get(configKey)).get("hashes")) + asMap(asMap(asMap(asMap(targets.get("signed")).get("targets")).get(configKey)) + .get("hashes")) .put("sha256", "0"); wrongHash.put("targets", signAndBase64EncodeTargets(targets)); @@ -590,14 +584,13 @@ void acceptsAnEmptyObjectAsAResponseToIndicateNoChanges() throws IOException { @Test void acceptsHttp204AsAResponseToIndicateNoChanges() throws IOException { - Response resp = - new Response.Builder() - .request(REQUEST) - .protocol(Protocol.HTTP_1_1) - .message("No Content") - .body(ResponseBody.create(MediaType.parse("application/json"), "")) - .code(204) - .build(); + Response resp = new Response.Builder() + .request(REQUEST) + .protocol(Protocol.HTTP_1_1) + .message("No Content") + .body(ResponseBody.create(MediaType.parse("application/json"), "")) + .code(204) + .build(); ConfigurationChangesTypedListener listener = typedListener(); ConfigurationDeserializer deserializer = deserializerMock(); @@ -686,12 +679,9 @@ void exceptionApplyingOneConfigShouldNotPreventOthersFromBeingApplied() throws I String newConfigId = "1ba66cc9-146a-3479-9e66-2b63fd580f48"; String newConfigKey = "datadog/2/LIVE_DEBUGGING/" + newConfigId + "/config"; - poller.addListener( - Product.ASM_DD, - parseDeserializer(), - (configKey, config, hinter) -> { - throw new RuntimeException("throw here"); - }); + poller.addListener(Product.ASM_DD, parseDeserializer(), (configKey, config, hinter) -> { + throw new RuntimeException("throw here"); + }); poller.addListener( Product.LIVE_DEBUGGING, parseDeserializer(), (configKey, config, hinter) -> {}); start(); @@ -928,12 +918,9 @@ void reportsErrorDuringDeserialization() throws IOException { @Test void reportsErrorApplyingConfiguration() throws IOException { - poller.addListener( - Product.ASM_DD, - content -> true, - (configKey, config, hinter) -> { - throw new RuntimeException("error applying config"); - }); + poller.addListener(Product.ASM_DD, content -> true, (configKey, config, hinter) -> { + throw new RuntimeException("error applying config"); + }); start(); stubHttp(buildOKResponse(SAMPLE_RESP_BODY), buildOKResponse(SAMPLE_RESP_BODY)); @@ -955,13 +942,8 @@ void theMaxSizeIsExceeded() throws IOException { start(); Map oversized = parseMap(SAMPLE_RESP_BODY); - asList(oversized.get("target_files")) - .add( - map( - "path", - "foo/bar", - "raw", - repeat("a", (int) Config.get().getRemoteConfigMaxPayloadSizeBytes()))); + asList(oversized.get("target_files")).add(map("path", "foo/bar", "raw", repeat("a", (int) + Config.get().getRemoteConfigMaxPayloadSizeBytes()))); stubHttp(buildOKResponse(toJson(oversized))); task.run(poller); @@ -1051,10 +1033,8 @@ void distributeConfigAcrossMultipleListenersForSameSubscriber() throws IOExcepti verify(listener2) .accept( any(), - cfgMatches( - cfg -> - Double.valueOf(0.1) - .equals(asMap(cfg.get("api_security")).get("request_sample_rate"))), + cfgMatches(cfg -> Double.valueOf(0.1) + .equals(asMap(cfg.get("api_security")).get("request_sample_rate"))), any()); } @@ -1062,13 +1042,10 @@ void distributeConfigAcrossMultipleListenersForSameSubscriber() throws IOExcepti void errorApplyingFeatures() throws IOException { AtomicBoolean called = new AtomicBoolean(false); - poller.addListener( - Product.ASM_FEATURES, - content -> true, - (configKey, config, hinter) -> { - called.set(true); - throw new RuntimeException("throws"); - }); + poller.addListener(Product.ASM_FEATURES, content -> true, (configKey, config, hinter) -> { + called.set(true); + throw new RuntimeException("throws"); + }); start(); stubHttp(buildOKResponse(FEATURES_RESP_BODY)); @@ -1124,9 +1101,8 @@ static Stream checkSettingOfCapabilitiesPositiveTestArguments() { arguments("1 << 8", 1L << 8, new byte[] {1, 0}), arguments("1 << 9", 1L << 9, new byte[] {2, 0}), arguments( - "long min plus one", - -9223372036854775807L, - new byte[] {(byte) 128, 0, 0, 0, 0, 0, 0, 1})); + "long min plus one", -9223372036854775807L, new byte[] {(byte) 128, 0, 0, 0, 0, 0, 0, 1 + })); } @ParameterizedTest(name = "check setting of capabilities positive test: {0}") @@ -1153,22 +1129,19 @@ void checkSettingOfCapabilitiesPositiveTest(String scenario, long capabilities, private void start() { when(scheduler.scheduleAtFixedRate( any(), eq(poller), eq(0L), eq((long) DEFAULT_POLL_PERIOD), eq(MILLISECONDS))) - .thenAnswer( - invocation -> { - task = invocation.getArgument(0); - return scheduled; - }); + .thenAnswer(invocation -> { + task = invocation.getArgument(0); + return scheduled; + }); poller.start(); assertNotNull(task); } private void stubHttp(Response... responses) throws IOException { - when(okHttpClient.newCall(any(Request.class))) - .thenAnswer( - invocation -> { - request = invocation.getArgument(0); - return call; - }); + when(okHttpClient.newCall(any(Request.class))).thenAnswer(invocation -> { + request = invocation.getArgument(0); + return call; + }); OngoingStubbing stubbing = when(call.execute()); for (Response response : responses) { stubbing = stubbing.thenReturn(response); @@ -1227,9 +1200,8 @@ private static String cfgWithoutAsm() { Map map = parseMap(SAMPLE_RESP_BODY); map.put("client_configs", list()); Map targets = decodeTargets(map.get("targets")); - asMap( - asMap(asMap(targets.get("signed")).get("targets")) - .get("employee/ASM_DD/1.recommended.json/config")) + asMap(asMap(asMap(targets.get("signed")).get("targets")) + .get("employee/ASM_DD/1.recommended.json/config")) .put( "hashes", map("sha256", "aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f")); @@ -1335,152 +1307,144 @@ private static String toJson(Object value) { return MOSHI.adapter(Object.class).toJson(value); } - private static final String SAMPLE_APPSEC_CONFIG = - "\n" - + "{\n" - + " \"version\": \"2.2\",\n" - + " \"metadata\": {\n" - + " \"rules_version\": \"1.3.1\"\n" - + " },\n" - + " \"rules\": [\n" - + " {\n" - + " \"id\": \"crs-913-110\",\n" - + " \"name\": \"Acunetix\",\n" - + " \"tags\": {\n" - + " \"type\": \"security_scanner\",\n" - + " \"crs_id\": \"913110\",\n" - + " \"category\": \"attack_attempt\"\n" - + " },\n" - + " \"conditions\": [\n" - + " {\n" - + " \"parameters\": {\n" - + " \"inputs\": [\n" - + " {\n" - + " \"address\": \"server.request.headers.no_cookies\"\n" - + " }\n" - + " ],\n" - + " \"list\": [\n" - + " \"acunetix-product\"\n" - + " ]\n" - + " },\n" - + " \"operator\": \"phrase_match\"\n" - + " }\n" - + " ],\n" - + " \"transformers\": [\n" - + " \"lowercase\"\n" - + " ]\n" - + " }\n" - + " ]\n" - + "}\n"; - - private static final String SAMPLE_TARGETS = - "\n" - + "{\n" - + " \"signatures\" : [\n" - + " {\n" - + " \"keyid\" : \"5c4ece41241a1bb513f6e3e5df74ab7d5183dfffbd71bfd43127920d880569fd\",\n" - + " \"sig\" : \"766871ed1acc60ef35f9f24262682283a55e79334f5154486176033b67568aed82fe8139a1f78689b96473537f0a2e55c8365d50bff345ea9ac350d57b90390d\"\n" - + " }\n" - + " ],\n" - + " \"signed\" : {\n" - + " \"_type\" : \"targets\",\n" - + " \"custom\" : {\n" - + " \"opaque_backend_state\" : \"foobar\"\n" - + " },\n" - + " \"expires\" : \"2022-09-17T12:49:15Z\",\n" - + " \"spec_version\" : \"1.0.0\",\n" - + " \"targets\" : {\n" - + " \"employee/ASM_DD/1.recommended.json/config\" : {\n" - + " \"custom\" : {\n" - + " \"v\" : 1\n" - + " },\n" - + " \"hashes\" : {\n" - + " \"sha256\" : \"6302258236e6051216b950583ec7136d946b463c17cbe64384ba5d566324819\"\n" - + " },\n" - + " \"length\" : 919\n" - + " },\n" - + " \"employee/ASM_DD/2.suggested.json/config\" : {\n" - + " \"custom\" : {\n" - + " \"v\" : 1\n" - + " },\n" - + " \"hashes\" : {\n" - + " \"sha256\" : \"6302258236e6051216b950583ec7136d946b463c17cbe64384ba5d566324819\"\n" - + " },\n" - + " \"length\" : 919\n" - + " },\n" - + " \"employee/CWS_DD/2.default.policy/config\" : {\n" - + " \"custom\" : {\n" - + " \"v\" : 2\n" - + " },\n" - + " \"hashes\" : {\n" - + " \"sha256\" : \"2f075fcaa9bdfc96bfc30d5a18711fbebf59d2cb3f3b5258d41ebdc1b1a54569\"\n" - + " },\n" - + " \"length\" : 34805\n" - + " }\n" - + " },\n" - + " \"version\" : 23337393\n" - + " }\n" - + "}\n"; - - private static final String SAMPLE_RESP_BODY = - "{\n" - + " \"client_configs\" : [\n" - + " \"employee/ASM_DD/1.recommended.json/config\"\n" - + " ],\n" - + " \"roots\" : [],\n" - + " \"target_files\" : [\n" - + " {\n" - + " \"path\" : \"employee/ASM_DD/1.recommended.json/config\",\n" - + " \"raw\" : \"" - + b64(SAMPLE_APPSEC_CONFIG) - + "\"\n" - + " },\n" - + " {\n" - + " \"path\" : \"employee/ASM_DD/2.suggested.json/config\",\n" - + " \"raw\" : \"" - + b64(SAMPLE_APPSEC_CONFIG) - + "\"\n" - + " }\n" - + " ],\n" - + " \"targets\" : \"" - + signAndBase64EncodeTargets(SAMPLE_TARGETS) - + "\"\n" - + "}\n"; - - private static final String FEATURES_RESP_BODY = - toJson( - map( - "client_configs", list("datadog/2/ASM_FEATURES/asm_features_activation/config"), - "roots", list(), - "target_files", - list( - map( - "path", - "datadog/2/ASM_FEATURES/asm_features_activation/config", - "raw", - b64( - "{\"asm\":{\"enabled\":true},\"api_security\":{\"request_sample_rate\":0.1}}"))), - "targets", - signAndBase64EncodeTargets( + private static final String SAMPLE_APPSEC_CONFIG = "\n" + + "{\n" + + " \"version\": \"2.2\",\n" + + " \"metadata\": {\n" + + " \"rules_version\": \"1.3.1\"\n" + + " },\n" + + " \"rules\": [\n" + + " {\n" + + " \"id\": \"crs-913-110\",\n" + + " \"name\": \"Acunetix\",\n" + + " \"tags\": {\n" + + " \"type\": \"security_scanner\",\n" + + " \"crs_id\": \"913110\",\n" + + " \"category\": \"attack_attempt\"\n" + + " },\n" + + " \"conditions\": [\n" + + " {\n" + + " \"parameters\": {\n" + + " \"inputs\": [\n" + + " {\n" + + " \"address\": \"server.request.headers.no_cookies\"\n" + + " }\n" + + " ],\n" + + " \"list\": [\n" + + " \"acunetix-product\"\n" + + " ]\n" + + " },\n" + + " \"operator\": \"phrase_match\"\n" + + " }\n" + + " ],\n" + + " \"transformers\": [\n" + + " \"lowercase\"\n" + + " ]\n" + + " }\n" + + " ]\n" + + "}\n"; + + private static final String SAMPLE_TARGETS = "\n" + + "{\n" + + " \"signatures\" : [\n" + + " {\n" + + " \"keyid\" : \"5c4ece41241a1bb513f6e3e5df74ab7d5183dfffbd71bfd43127920d880569fd\",\n" + + " \"sig\" : \"766871ed1acc60ef35f9f24262682283a55e79334f5154486176033b67568aed82fe8139a1f78689b96473537f0a2e55c8365d50bff345ea9ac350d57b90390d\"\n" + + " }\n" + + " ],\n" + + " \"signed\" : {\n" + + " \"_type\" : \"targets\",\n" + + " \"custom\" : {\n" + + " \"opaque_backend_state\" : \"foobar\"\n" + + " },\n" + + " \"expires\" : \"2022-09-17T12:49:15Z\",\n" + + " \"spec_version\" : \"1.0.0\",\n" + + " \"targets\" : {\n" + + " \"employee/ASM_DD/1.recommended.json/config\" : {\n" + + " \"custom\" : {\n" + + " \"v\" : 1\n" + + " },\n" + + " \"hashes\" : {\n" + + " \"sha256\" : \"6302258236e6051216b950583ec7136d946b463c17cbe64384ba5d566324819\"\n" + + " },\n" + + " \"length\" : 919\n" + + " },\n" + + " \"employee/ASM_DD/2.suggested.json/config\" : {\n" + + " \"custom\" : {\n" + + " \"v\" : 1\n" + + " },\n" + + " \"hashes\" : {\n" + + " \"sha256\" : \"6302258236e6051216b950583ec7136d946b463c17cbe64384ba5d566324819\"\n" + + " },\n" + + " \"length\" : 919\n" + + " },\n" + + " \"employee/CWS_DD/2.default.policy/config\" : {\n" + + " \"custom\" : {\n" + + " \"v\" : 2\n" + + " },\n" + + " \"hashes\" : {\n" + + " \"sha256\" : \"2f075fcaa9bdfc96bfc30d5a18711fbebf59d2cb3f3b5258d41ebdc1b1a54569\"\n" + + " },\n" + + " \"length\" : 34805\n" + + " }\n" + + " },\n" + + " \"version\" : 23337393\n" + + " }\n" + + "}\n"; + + private static final String SAMPLE_RESP_BODY = "{\n" + + " \"client_configs\" : [\n" + + " \"employee/ASM_DD/1.recommended.json/config\"\n" + + " ],\n" + + " \"roots\" : [],\n" + + " \"target_files\" : [\n" + + " {\n" + + " \"path\" : \"employee/ASM_DD/1.recommended.json/config\",\n" + + " \"raw\" : \"" + + b64(SAMPLE_APPSEC_CONFIG) + + "\"\n" + + " },\n" + + " {\n" + + " \"path\" : \"employee/ASM_DD/2.suggested.json/config\",\n" + + " \"raw\" : \"" + + b64(SAMPLE_APPSEC_CONFIG) + + "\"\n" + + " }\n" + + " ],\n" + + " \"targets\" : \"" + + signAndBase64EncodeTargets(SAMPLE_TARGETS) + + "\"\n" + + "}\n"; + + private static final String FEATURES_RESP_BODY = toJson(map( + "client_configs", list("datadog/2/ASM_FEATURES/asm_features_activation/config"), + "roots", list(), + "target_files", + list(map( + "path", + "datadog/2/ASM_FEATURES/asm_features_activation/config", + "raw", + b64("{\"asm\":{\"enabled\":true},\"api_security\":{\"request_sample_rate\":0.1}}"))), + "targets", + signAndBase64EncodeTargets(map( + "signed", + map( + "expires", + "2022-09-17T12:49:15Z", + "spec_version", + "1.0.0", + "targets", + map( + "datadog/2/ASM_FEATURES/asm_features_activation/config", map( - "signed", - map( - "expires", - "2022-09-17T12:49:15Z", - "spec_version", - "1.0.0", - "targets", + "custom", map("v", 1), + "hashes", map( - "datadog/2/ASM_FEATURES/asm_features_activation/config", - map( - "custom", map("v", 1), - "hashes", - map( - "sha256", - "b01cb68f140fbfb7a2bb0ce39a473aa59c33664aca0c871cf07b8f4e09e3e360"), - "length", 67)), - "version", - 23337393))))); + "sha256", + "b01cb68f140fbfb7a2bb0ce39a473aa59c33664aca0c871cf07b8f4e09e3e360"), + "length", 67)), + "version", + 23337393))))); private static String signAndBase64EncodeTargets(String targetsJson) { return signAndBase64EncodeTargets(parseMap(targetsJson)); diff --git a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/PollerRequestFactoryTest.java b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/PollerRequestFactoryTest.java index 9d5280e4783..b6b88de5ef7 100644 --- a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/PollerRequestFactoryTest.java +++ b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/PollerRequestFactoryTest.java @@ -36,29 +36,25 @@ class PollerRequestFactoryTest extends DDJavaSpecification { @WithConfig(key = "tags", value = "version:1.0.0-SNAPSHOT") @WithConfig( key = "trace.global.tags", - value = - Tags.GIT_REPOSITORY_URL - + ":https://github.com/DataDog/dd-trace-java," - + Tags.GIT_COMMIT_SHA - + ":1234") + value = Tags.GIT_REPOSITORY_URL + + ":https://github.com/DataDog/dd-trace-java," + + Tags.GIT_COMMIT_SHA + + ":1234") void remoteConfigRequestFieldsBeenSanitized() { - PollerRequestFactory factory = - new PollerRequestFactory( - Config.get(), TRACER_VERSION, CONTAINER_ID, ENTITY_ID, INVALID_REMOTE_CONFIG_URL, null); + PollerRequestFactory factory = new PollerRequestFactory( + Config.get(), TRACER_VERSION, CONTAINER_ID, ENTITY_ID, INVALID_REMOTE_CONFIG_URL, null); - RemoteConfigRequest request = - factory.buildRemoteConfigRequest( - Collections.singletonList("ASM"), null, null, 0, ServiceNameCollector.get()); + RemoteConfigRequest request = factory.buildRemoteConfigRequest( + Collections.singletonList("ASM"), null, null, 0, ServiceNameCollector.get()); RemoteConfigRequest.ClientInfo.TracerInfo tracerInfo = request.getClient().getTracerInfo(); assertEquals("service_name", tracerInfo.getServiceName()); assertEquals("prod", tracerInfo.getServiceEnv()); assertEquals("1.0.0-snapshot", tracerInfo.getServiceVersion()); assertTrue(tracerInfo.getTags().contains("env:PROD")); - assertTrue( - tracerInfo - .getTags() - .contains(Tags.GIT_REPOSITORY_URL + ":https://github.com/DataDog/dd-trace-java")); + assertTrue(tracerInfo + .getTags() + .contains(Tags.GIT_REPOSITORY_URL + ":https://github.com/DataDog/dd-trace-java")); assertTrue(tracerInfo.getTags().contains(Tags.GIT_COMMIT_SHA + ":1234")); } @@ -71,13 +67,11 @@ void remoteConfigRequestExtraServices() { ServiceNameCollector extraServicesProvider = ServiceNameCollector.get(); extraServicesProvider.clear(); extraServicesProvider.addService(extraService); - PollerRequestFactory factory = - new PollerRequestFactory( - Config.get(), TRACER_VERSION, CONTAINER_ID, ENTITY_ID, INVALID_REMOTE_CONFIG_URL, null); + PollerRequestFactory factory = new PollerRequestFactory( + Config.get(), TRACER_VERSION, CONTAINER_ID, ENTITY_ID, INVALID_REMOTE_CONFIG_URL, null); - RemoteConfigRequest request = - factory.buildRemoteConfigRequest( - Collections.singletonList("ASM"), null, null, 0, extraServicesProvider); + RemoteConfigRequest request = factory.buildRemoteConfigRequest( + Collections.singletonList("ASM"), null, null, 0, extraServicesProvider); assertTrue(request.getClient().getTracerInfo().getExtraServices().contains(extraService)); } @@ -89,13 +83,11 @@ void remoteConfigProvidesProcessTagsWhenEnabled(boolean enabled) throws Exceptio injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "false"); } ProcessTags.reset(Config.get()); - PollerRequestFactory factory = - new PollerRequestFactory( - Config.get(), TRACER_VERSION, CONTAINER_ID, ENTITY_ID, INVALID_REMOTE_CONFIG_URL, null); + PollerRequestFactory factory = new PollerRequestFactory( + Config.get(), TRACER_VERSION, CONTAINER_ID, ENTITY_ID, INVALID_REMOTE_CONFIG_URL, null); - RemoteConfigRequest request = - factory.buildRemoteConfigRequest( - Collections.singletonList("ASM"), null, null, 0, ServiceNameCollector.get()); + RemoteConfigRequest request = factory.buildRemoteConfigRequest( + Collections.singletonList("ASM"), null, null, 0, ServiceNameCollector.get()); String json = new Moshi.Builder().build().adapter(RemoteConfigRequest.class).toJson(request); List processTags = request.getClient().getTracerInfo().getProcessTags(); diff --git a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/Rcte1TestVectorsSpecification.java b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/Rcte1TestVectorsSpecification.java index 8cd8b03d3ed..00fe82b234f 100644 --- a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/Rcte1TestVectorsSpecification.java +++ b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/Rcte1TestVectorsSpecification.java @@ -45,7 +45,8 @@ class Rcte1TestVectorsSpecification extends DDJavaSpecification { private static final int DEFAULT_POLL_PERIOD = 5000; private static final HttpUrl URL = HttpUrl.get("https://example.com/v0.7/config"); - private static final Request REQUEST = new Request.Builder().url("https://example.com").build(); + private static final Request REQUEST = + new Request.Builder().url("https://example.com").build(); private final Moshi moshi = new Moshi.Builder().build(); @@ -76,9 +77,8 @@ private Response buildOKResponse(String bodyStr) { @BeforeEach void setup() { Supplier urlSupplier = URL::toString; - poller = - new DefaultConfigurationPoller( - Config.get(), "0.0.0", "containerid", "entityid", urlSupplier, okHttpClient, scheduler); + poller = new DefaultConfigurationPoller( + Config.get(), "0.0.0", "containerid", "entityid", urlSupplier, okHttpClient, scheduler); } private static String getFileContents(String baseFileName) throws IOException { @@ -96,19 +96,17 @@ private static String bodyToString(RequestBody body) throws IOException { private void stubScheduling() { when(scheduler.scheduleAtFixedRate( any(), eq(poller), eq(0L), eq((long) DEFAULT_POLL_PERIOD), eq(TimeUnit.MILLISECONDS))) - .thenAnswer( - invocation -> { - task = invocation.getArgument(0); - return scheduled; - }); + .thenAnswer(invocation -> { + task = invocation.getArgument(0); + return scheduled; + }); } @Test void validFile() throws IOException { AtomicReference savedConfig = new AtomicReference<>(); - ConfigurationDeserializer deserializer = - content -> - moshi.adapter(Object.class).fromJson(new String(content, StandardCharsets.UTF_8)); + ConfigurationDeserializer deserializer = content -> + moshi.adapter(Object.class).fromJson(new String(content, StandardCharsets.UTF_8)); ConfigurationChangesTypedListener listener = (configKey, config, hinter) -> savedConfig.set(config); poller.addListener(Product.ASM_DD, deserializer, listener); @@ -117,12 +115,10 @@ void validFile() throws IOException { poller.start(); assertNotNull(task); - when(okHttpClient.newCall(any(Request.class))) - .thenAnswer( - invocation -> { - request = invocation.getArgument(0); - return call; - }); + when(okHttpClient.newCall(any(Request.class))).thenAnswer(invocation -> { + request = invocation.getArgument(0); + return call; + }); when(call.execute()).thenReturn(buildOKResponse(getFileContents("validOneFile"))); task.run(poller); @@ -138,11 +134,10 @@ void validFile() throws IOException { "missing target file | tufTargetsMissingTargetFile | 'is in target_files, but not in targets.signed' " }) void invalidFile(String baseFileName, String message) throws IOException { - ConfigurationDeserializer deserializer = - content -> { - fail("should never be called"); - return null; - }; + ConfigurationDeserializer deserializer = content -> { + fail("should never be called"); + return null; + }; ConfigurationChangesTypedListener listener = (configKey, config, hinter) -> {}; poller.addListener(Product.ASM_DD, deserializer, listener); @@ -150,12 +145,10 @@ void invalidFile(String baseFileName, String message) throws IOException { poller.start(); assertNotNull(task); - when(okHttpClient.newCall(any(Request.class))) - .thenAnswer( - invocation -> { - request = invocation.getArgument(0); - return call; - }); + when(okHttpClient.newCall(any(Request.class))).thenAnswer(invocation -> { + request = invocation.getArgument(0); + return call; + }); when(call.execute()) .thenReturn(buildOKResponse(getFileContents(baseFileName))) .thenReturn(buildOKResponse("validOneFile")); diff --git a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/state/ProductStateSpecification.java b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/state/ProductStateSpecification.java index 360c2d0a99c..cae2dd84d28 100644 --- a/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/state/ProductStateSpecification.java +++ b/remote-config/remote-config-core/src/test/java/datadog/remoteconfig/state/ProductStateSpecification.java @@ -42,11 +42,9 @@ void testApplyForNonAsmDdProductAppliesChangesBeforeRemoves() { listener.operations.clear(); // Clear for the actual test // a new response with config1 (changed hash) and config2 (new) - RemoteConfigResponse response2 = - buildResponse( - targets( - "org/ASM_DATA/config1/foo", new TargetSpec(2, 8, "newhash1"), - "org/ASM_DATA/config2/foo", new TargetSpec(1, 8, "hash2"))); + RemoteConfigResponse response2 = buildResponse(targets( + "org/ASM_DATA/config1/foo", new TargetSpec(2, 8, "newhash1"), + "org/ASM_DATA/config2/foo", new TargetSpec(1, 8, "hash2"))); ParsedConfigKey key2 = ParsedConfigKey.parse("org/ASM_DATA/config2/foo"); // apply is called @@ -70,11 +68,9 @@ void testApplyForAsmDdProductAppliesChangesAfterRemoves() { productState.addProductListener(listener); // first apply with config1 and config2 to cache them - RemoteConfigResponse response1 = - buildResponse( - targets( - "org/ASM_DD/config1/foo", new TargetSpec(1, 8, "oldhash1"), - "org/ASM_DD/config2/foo", new TargetSpec(1, 8, "hash2"))); + RemoteConfigResponse response1 = buildResponse(targets( + "org/ASM_DD/config1/foo", new TargetSpec(1, 8, "oldhash1"), + "org/ASM_DD/config2/foo", new TargetSpec(1, 8, "hash2"))); ParsedConfigKey key1 = ParsedConfigKey.parse("org/ASM_DD/config1/foo"); ParsedConfigKey key2 = ParsedConfigKey.parse("org/ASM_DD/config2/foo"); productState.apply(response1, Arrays.asList(key1, key2), hinter); @@ -104,22 +100,18 @@ void testAsmDdWithMultipleNewConfigsRemovesBeforeAppliesAll() { productState.addProductListener(listener); // first apply with old configs - RemoteConfigResponse response1 = - buildResponse( - targets( - "org/ASM_DD/old1/foo", new TargetSpec(1, 8, "hash_old1"), - "org/ASM_DD/old2/foo", new TargetSpec(1, 8, "hash_old2"))); + RemoteConfigResponse response1 = buildResponse(targets( + "org/ASM_DD/old1/foo", new TargetSpec(1, 8, "hash_old1"), + "org/ASM_DD/old2/foo", new TargetSpec(1, 8, "hash_old2"))); ParsedConfigKey oldKey1 = ParsedConfigKey.parse("org/ASM_DD/old1/foo"); ParsedConfigKey oldKey2 = ParsedConfigKey.parse("org/ASM_DD/old2/foo"); productState.apply(response1, Arrays.asList(oldKey1, oldKey2), hinter); listener.operations.clear(); // Clear for the actual test // a response with completely new configs - RemoteConfigResponse response2 = - buildResponse( - targets( - "org/ASM_DD/new1/foo", new TargetSpec(1, 8, "hash_new1"), - "org/ASM_DD/new2/foo", new TargetSpec(1, 8, "hash_new2"))); + RemoteConfigResponse response2 = buildResponse(targets( + "org/ASM_DD/new1/foo", new TargetSpec(1, 8, "hash_new1"), + "org/ASM_DD/new2/foo", new TargetSpec(1, 8, "hash_new2"))); ParsedConfigKey newKey1 = ParsedConfigKey.parse("org/ASM_DD/new1/foo"); ParsedConfigKey newKey2 = ParsedConfigKey.parse("org/ASM_DD/new2/foo"); @@ -225,11 +217,9 @@ void testConfigListenersAreCalledInAdditionToProductListeners() { productState.addProductListener("config1", configListener); // a response with two configs - RemoteConfigResponse response = - buildResponse( - targets( - "org/ASM_DATA/config1/foo", new TargetSpec(1, 8, "hash1"), - "org/ASM_DATA/config2/foo", new TargetSpec(1, 8, "hash2"))); + RemoteConfigResponse response = buildResponse(targets( + "org/ASM_DATA/config1/foo", new TargetSpec(1, 8, "hash1"), + "org/ASM_DATA/config2/foo", new TargetSpec(1, 8, "hash2"))); ParsedConfigKey key1 = ParsedConfigKey.parse("org/ASM_DATA/config1/foo"); ParsedConfigKey key2 = ParsedConfigKey.parse("org/ASM_DATA/config2/foo"); diff --git a/telemetry/src/jmh/java/datadog/telemetry/dependency/DependencyResolverBenchmark.java b/telemetry/src/jmh/java/datadog/telemetry/dependency/DependencyResolverBenchmark.java index c0b6d4dd7db..68c98576282 100644 --- a/telemetry/src/jmh/java/datadog/telemetry/dependency/DependencyResolverBenchmark.java +++ b/telemetry/src/jmh/java/datadog/telemetry/dependency/DependencyResolverBenchmark.java @@ -22,17 +22,13 @@ public class DependencyResolverBenchmark { private static final String PROJECT_DIR = System.getProperty("user.dir"); - private static final URI SIMPLE_JAR_URI = - URI.create( - "file://" - + PROJECT_DIR - + "/src/test/resources/datadog/telemetry/dependencies/bson-4.2.0.jar"); - - private static final URI NESTED_SPRING_BOOT_JAR_URI = - URI.create( - "jar:file://" - + PROJECT_DIR - + "/src/test/resources/datadog/telemetry/dependencies/spring-boot-app.jar!/BOOT-INF/lib/opentracing-util-0.33.0.jar!/"); + private static final URI SIMPLE_JAR_URI = URI.create("file://" + PROJECT_DIR + + "/src/test/resources/datadog/telemetry/dependencies/bson-4.2.0.jar"); + + private static final URI NESTED_SPRING_BOOT_JAR_URI = URI.create( + "jar:file://" + + PROJECT_DIR + + "/src/test/resources/datadog/telemetry/dependencies/spring-boot-app.jar!/BOOT-INF/lib/opentracing-util-0.33.0.jar!/"); @Benchmark public void resolveSimpleJar() { diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java b/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java index 5c756d73ad1..f2fff756c9b 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetryRequest.java @@ -57,15 +57,14 @@ public class TelemetryRequest { public Request.Builder httpRequest() { long bodySize = requestBody.endRequest(); - Request.Builder builder = - new Request.Builder() - .addHeader("Content-Type", String.valueOf(JSON)) - .addHeader("Content-Length", String.valueOf(bodySize)) - .addHeader("DD-Telemetry-API-Version", API_VERSION) - .addHeader("DD-Telemetry-Request-Type", String.valueOf(this.requestType)) - .addHeader("DD-Client-Library-Language", DDTags.LANGUAGE_TAG_VALUE) - .addHeader("DD-Client-Library-Version", TracerVersion.TRACER_VERSION) - .post(requestBody); + Request.Builder builder = new Request.Builder() + .addHeader("Content-Type", String.valueOf(JSON)) + .addHeader("Content-Length", String.valueOf(bodySize)) + .addHeader("DD-Telemetry-API-Version", API_VERSION) + .addHeader("DD-Telemetry-Request-Type", String.valueOf(this.requestType)) + .addHeader("DD-Client-Library-Language", DDTags.LANGUAGE_TAG_VALUE) + .addHeader("DD-Client-Library-Version", TracerVersion.TRACER_VERSION) + .post(requestBody); final String containerId = ContainerInfo.get().getContainerId(); if (containerId != null) { diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetryRouter.java b/telemetry/src/main/java/datadog/telemetry/TelemetryRouter.java index 9a7192f9375..b471d9348c6 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetryRouter.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetryRouter.java @@ -10,9 +10,14 @@ public class TelemetryRouter { private static final Logger log = LoggerFactory.getLogger(TelemetryRouter.class); - @Nullable private final DDAgentFeaturesDiscovery ddAgentFeaturesDiscovery; + @Nullable + private final DDAgentFeaturesDiscovery ddAgentFeaturesDiscovery; + private final TelemetryClient agentClient; - @Nullable private final TelemetryClient intakeClient; + + @Nullable + private final TelemetryClient intakeClient; + private final boolean useIntakeClientByDefault; private TelemetryClient currentClient; private boolean errorReported; @@ -51,11 +56,10 @@ public TelemetryClient.Result sendRequest(TelemetryRequest request) { Request.Builder httpRequestBuilder = request.httpRequest(); TelemetryClient.Result result = currentClient.sendHttpRequest(httpRequestBuilder); - boolean requestFailed = - result != TelemetryClient.Result.SUCCESS - // interrupted request is most likely due to telemetry system shutdown, - // we do not want to log errors and reattempt in this case - && result != TelemetryClient.Result.INTERRUPTED; + boolean requestFailed = result != TelemetryClient.Result.SUCCESS + // interrupted request is most likely due to telemetry system shutdown, + // we do not want to log errors and reattempt in this case + && result != TelemetryClient.Result.INTERRUPTED; if (currentClient == agentClient) { if (requestFailed) { reportErrorOnce(currentClient.getUrl(), result); diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetryRunnable.java b/telemetry/src/main/java/datadog/telemetry/TelemetryRunnable.java index e991ee5ee52..f8202287bca 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetryRunnable.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetryRunnable.java @@ -39,13 +39,12 @@ public TelemetryRunnable( this.telemetryService = telemetryService; this.actions = actions; this.actionsAtMetricsInterval = findMetricPeriodicActions(actions); - this.scheduler = - new Scheduler( - timeSource, - sleeper, - (long) (Config.get().getTelemetryHeartbeatInterval() * 1000), - (long) (Config.get().getTelemetryMetricsInterval() * 1000), - Config.get().getTelemetryExtendedHeartbeatInterval() * 1000); + this.scheduler = new Scheduler( + timeSource, + sleeper, + (long) (Config.get().getTelemetryHeartbeatInterval() * 1000), + (long) (Config.get().getTelemetryMetricsInterval() * 1000), + Config.get().getTelemetryExtendedHeartbeatInterval() * 1000); } private List findMetricPeriodicActions( @@ -142,7 +141,8 @@ private void mainLoopIteration() throws InterruptedException { } private void collectConfigChanges() { - Map> collectedConfig = ConfigCollector.get().collect(); + Map> collectedConfig = + ConfigCollector.get().collect(); if (!collectedConfig.isEmpty()) { telemetryService.addConfiguration(collectedConfig); } diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetryService.java b/telemetry/src/main/java/datadog/telemetry/TelemetryService.java index a5490e0649c..8c5f568a34a 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetryService.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetryService.java @@ -41,16 +41,15 @@ public class TelemetryService { private final BlockingQueue endpoints = new LinkedBlockingQueue<>(); - private final EventSource.Queued eventSource = - new EventSource.Queued( - configurations, - integrations, - dependencies, - metrics, - distributionSeries, - logMessages, - productChanges, - endpoints); + private final EventSource.Queued eventSource = new EventSource.Queued( + configurations, + integrations, + dependencies, + metrics, + distributionSeries, + logMessages, + productChanges, + endpoints); private final long messageBytesSoftLimit; private final boolean debug; @@ -67,9 +66,8 @@ public static TelemetryService build( TelemetryClient intakeClient, boolean useIntakeClientByDefault, boolean debug) { - TelemetryRouter telemetryRouter = - new TelemetryRouter( - ddAgentFeaturesDiscovery, agentClient, intakeClient, useIntakeClientByDefault); + TelemetryRouter telemetryRouter = new TelemetryRouter( + ddAgentFeaturesDiscovery, agentClient, intakeClient, useIntakeClientByDefault); return new TelemetryService(telemetryRouter, DEFAULT_MESSAGE_BYTES_SOFT_LIMIT, debug); } @@ -142,13 +140,8 @@ public boolean addEndpoint(final Endpoint endpoint) { } public void sendAppClosingEvent() { - TelemetryRequest telemetryRequest = - new TelemetryRequest( - this.eventSource, - EventSink.NOOP, - messageBytesSoftLimit, - RequestType.APP_CLOSING, - debug); + TelemetryRequest telemetryRequest = new TelemetryRequest( + this.eventSource, EventSink.NOOP, messageBytesSoftLimit, RequestType.APP_CLOSING, debug); if (telemetryRouter.sendRequest(telemetryRequest) != TelemetryClient.Result.SUCCESS) { log.warn("Couldn't send app-closing event!"); } @@ -175,9 +168,8 @@ public boolean sendAppStartedEvent() { eventSink = bufferedEvents; log.debug("Preparing app-started request"); - TelemetryRequest request = - new TelemetryRequest( - eventSource, eventSink, messageBytesSoftLimit, RequestType.APP_STARTED, debug); + TelemetryRequest request = new TelemetryRequest( + eventSource, eventSink, messageBytesSoftLimit, RequestType.APP_STARTED, debug); request.writeProducts(); request.writeConfigurations(); @@ -213,14 +205,12 @@ public boolean sendTelemetryEvents() { boolean isMoreDataAvailable = false; if (eventSource.isEmpty()) { log.debug("Preparing app-heartbeat request"); - request = - new TelemetryRequest( - eventSource, eventSink, messageBytesSoftLimit, RequestType.APP_HEARTBEAT, debug); + request = new TelemetryRequest( + eventSource, eventSink, messageBytesSoftLimit, RequestType.APP_HEARTBEAT, debug); } else { log.debug("Preparing message-batch request"); - request = - new TelemetryRequest( - eventSource, eventSink, messageBytesSoftLimit, RequestType.MESSAGE_BATCH, debug); + request = new TelemetryRequest( + eventSource, eventSink, messageBytesSoftLimit, RequestType.MESSAGE_BATCH, debug); request.writeHeartbeat(); request.writeConfigurations(); request.writeIntegrations(); @@ -254,13 +244,12 @@ public boolean sendTelemetryEvents() { public boolean sendExtendedHeartbeat() { log.debug("Preparing message-batch request"); EventSource extendedHeartbeatDataSnapshot = extendedHeartbeatData.snapshot(); - TelemetryRequest request = - new TelemetryRequest( - extendedHeartbeatDataSnapshot, - EventSink.NOOP, - messageBytesSoftLimit, - RequestType.APP_EXTENDED_HEARTBEAT, - debug); + TelemetryRequest request = new TelemetryRequest( + extendedHeartbeatDataSnapshot, + EventSink.NOOP, + messageBytesSoftLimit, + RequestType.APP_EXTENDED_HEARTBEAT, + debug); request.writeConfigurations(); request.writeDependencies(); request.writeIntegrations(); diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetrySystem.java b/telemetry/src/main/java/datadog/telemetry/TelemetrySystem.java index 667fe414cb6..e618332d8ca 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetrySystem.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetrySystem.java @@ -131,10 +131,9 @@ public static void startTelemetry( DependencyService dependencyService = createDependencyService(instrumentation); DDAgentFeaturesDiscovery ddAgentFeaturesDiscovery = sco.featuresDiscovery(config); - HttpRetryPolicy.Factory httpRetryPolicy = - config.isCiVisibilityEnabled() - ? new HttpRetryPolicy.Factory(2, 100, 2.0, true) - : HttpRetryPolicy.Factory.NEVER_RETRY; + HttpRetryPolicy.Factory httpRetryPolicy = config.isCiVisibilityEnabled() + ? new HttpRetryPolicy.Factory(2, 100, 2.0, true) + : HttpRetryPolicy.Factory.NEVER_RETRY; TelemetryClient agentClient = TelemetryClient.buildAgentClient(sco.agentHttpClient, sco.agentUrl, httpRetryPolicy); @@ -142,9 +141,8 @@ public static void startTelemetry( boolean useIntakeClientByDefault = config.isCiVisibilityEnabled() && config.isCiVisibilityAgentlessEnabled(); - TelemetryService telemetryService = - TelemetryService.build( - ddAgentFeaturesDiscovery, agentClient, intakeClient, useIntakeClientByDefault, debug); + TelemetryService telemetryService = TelemetryService.build( + ddAgentFeaturesDiscovery, agentClient, intakeClient, useIntakeClientByDefault, debug); TELEMETRY_THREAD = createTelemetryRunnable(telemetryService, dependencyService, telemetryMetricsEnabled); diff --git a/telemetry/src/main/java/datadog/telemetry/dependency/Dependency.java b/telemetry/src/main/java/datadog/telemetry/dependency/Dependency.java index 6765f77f4de..651c2c9a6f2 100644 --- a/telemetry/src/main/java/datadog/telemetry/dependency/Dependency.java +++ b/telemetry/src/main/java/datadog/telemetry/dependency/Dependency.java @@ -55,7 +55,8 @@ public final class Dependency { * serialized by the telemetry pipeline unless explicitly written by {@link * datadog.telemetry.TelemetryRequestBody#writeDependency}. */ - @Nullable public final List reachabilityMetadata; + @Nullable + public final List reachabilityMetadata; public Dependency(String name, String version, String source, @Nullable String hash) { this(name, version, source, hash, null); diff --git a/telemetry/src/main/java/datadog/telemetry/dependency/DependencyService.java b/telemetry/src/main/java/datadog/telemetry/dependency/DependencyService.java index 439fb65fe31..fb90df2eb27 100644 --- a/telemetry/src/main/java/datadog/telemetry/dependency/DependencyService.java +++ b/telemetry/src/main/java/datadog/telemetry/dependency/DependencyService.java @@ -30,14 +30,13 @@ public class DependencyService implements Runnable { private AgentTaskScheduler.Scheduled scheduledTask; public void schedulePeriodicResolution() { - scheduledTask = - AgentTaskScheduler.get() - .scheduleAtFixedRate( - AgentTaskScheduler.RunnableTask.INSTANCE, - this, - 0, - Config.get().getDependecyResolutionPeriodMillis(), - TimeUnit.MILLISECONDS); + scheduledTask = AgentTaskScheduler.get() + .scheduleAtFixedRate( + AgentTaskScheduler.RunnableTask.INSTANCE, + this, + 0, + Config.get().getDependecyResolutionPeriodMillis(), + TimeUnit.MILLISECONDS); } public void resolveOneDependency() { diff --git a/telemetry/src/main/java/datadog/telemetry/dependency/JbossVirtualFileHelper.java b/telemetry/src/main/java/datadog/telemetry/dependency/JbossVirtualFileHelper.java index 80b79d90ddb..86fc58308cc 100644 --- a/telemetry/src/main/java/datadog/telemetry/dependency/JbossVirtualFileHelper.java +++ b/telemetry/src/main/java/datadog/telemetry/dependency/JbossVirtualFileHelper.java @@ -89,9 +89,8 @@ public static URI getJbossVfsPath(URL location) { if (jbossVirtualFileHelper == null) { try { - jbossVirtualFileHelper = - JbossVirtualFileHelper.jbossVirtualFileHelper = - new JbossVirtualFileHelper(connection.getClass().getClassLoader()); + jbossVirtualFileHelper = JbossVirtualFileHelper.jbossVirtualFileHelper = + new JbossVirtualFileHelper(connection.getClass().getClassLoader()); } catch (Exception e) { log.debug("Error preparing for inspection of jboss virtual files", e); return null; diff --git a/telemetry/src/main/java/datadog/telemetry/log/LogPeriodicAction.java b/telemetry/src/main/java/datadog/telemetry/log/LogPeriodicAction.java index e949782b4ba..e65802a2aca 100644 --- a/telemetry/src/main/java/datadog/telemetry/log/LogPeriodicAction.java +++ b/telemetry/src/main/java/datadog/telemetry/log/LogPeriodicAction.java @@ -32,12 +32,11 @@ public class LogPeriodicAction implements TelemetryRunnable.TelemetryPeriodicAct public void doIteration(TelemetryService service) { for (LogCollector.RawLogMessage rawLogMsg : LogCollector.get().drain()) { - LogMessage logMessage = - new LogMessage() - .message(rawLogMsg.message) - .tracerTime(rawLogMsg.timestamp) - .tags(rawLogMsg.tags) - .count(rawLogMsg.count); + LogMessage logMessage = new LogMessage() + .message(rawLogMsg.message) + .tracerTime(rawLogMsg.timestamp) + .tags(rawLogMsg.tags) + .count(rawLogMsg.count); if (rawLogMsg.logLevel != null) { logMessage.level(LogMessageLevel.fromString(rawLogMsg.logLevel)); diff --git a/telemetry/src/main/java/datadog/telemetry/rum/RumPeriodicAction.java b/telemetry/src/main/java/datadog/telemetry/rum/RumPeriodicAction.java index afcd8872933..238fd2aac9f 100644 --- a/telemetry/src/main/java/datadog/telemetry/rum/RumPeriodicAction.java +++ b/telemetry/src/main/java/datadog/telemetry/rum/RumPeriodicAction.java @@ -46,12 +46,11 @@ private Metric convertToTelemetryMetric(MetricCollector.Metric raw) { private DistributionSeries convertToDistributionSeries( MetricCollector.DistributionSeriesPoint point) { - DistributionSeries distribution = - new DistributionSeries() - .namespace(point.namespace) - .metric(point.metricName) - .common(point.common) - .tags(point.tags); + DistributionSeries distribution = new DistributionSeries() + .namespace(point.namespace) + .metric(point.metricName) + .common(point.common) + .tags(point.tags); distribution.addPoint(point.value); return distribution; } diff --git a/telemetry/src/main/java/datadog/telemetry/sca/ScaReachabilityPeriodicAction.java b/telemetry/src/main/java/datadog/telemetry/sca/ScaReachabilityPeriodicAction.java index b1dd6b416a9..118344fa081 100644 --- a/telemetry/src/main/java/datadog/telemetry/sca/ScaReachabilityPeriodicAction.java +++ b/telemetry/src/main/java/datadog/telemetry/sca/ScaReachabilityPeriodicAction.java @@ -138,16 +138,14 @@ public void doIteration(TelemetryService telService) { Dependency known = knownDeps.get(key); if (known != null) { // Dep was resolved in a prior heartbeat — emit enriched with source/hash. - telService.addDependency( - new Dependency( - known.name, known.version, known.source, known.hash, buildMetadata(snapshot))); + telService.addDependency(new Dependency( + known.name, known.version, known.source, known.hash, buildMetadata(snapshot))); } else { // Dep not yet resolved — emit without source/hash so CVE data is not delayed. // When the dep is eventually resolved (stored in knownDeps via Step 2), subsequent // CVE emissions (e.g., after a method hit) will include source/hash automatically. - telService.addDependency( - new Dependency( - snapshot.artifact, snapshot.version, null, null, buildMetadata(snapshot))); + telService.addDependency(new Dependency( + snapshot.artifact, snapshot.version, null, null, buildMetadata(snapshot))); } } } diff --git a/telemetry/src/test/java/datadog/telemetry/FileBasedTelemetryClientTest.java b/telemetry/src/test/java/datadog/telemetry/FileBasedTelemetryClientTest.java index 1104d3549d5..375d6e61ad2 100644 --- a/telemetry/src/test/java/datadog/telemetry/FileBasedTelemetryClientTest.java +++ b/telemetry/src/test/java/datadog/telemetry/FileBasedTelemetryClientTest.java @@ -43,9 +43,8 @@ void createsOutputDirectoryIfMissing(@TempDir Path tmp) { assertFalse(Files.exists(outputDir)); FileBasedTelemetryClient client = new FileBasedTelemetryClient(outputDir.toString()); - TelemetryClient.Result result = - client.sendHttpRequest( - requestBuilder("app-heartbeat", "{}".getBytes(StandardCharsets.UTF_8))); + TelemetryClient.Result result = client.sendHttpRequest( + requestBuilder("app-heartbeat", "{}".getBytes(StandardCharsets.UTF_8))); assertEquals(TelemetryClient.Result.SUCCESS, result); assertTrue(Files.isDirectory(outputDir)); @@ -87,8 +86,9 @@ void sequenceIncrementsPerRequest(@TempDir Path tmp) throws IOException { @Test void handlesNullRequestBody(@TempDir Path tmp) throws IOException { FileBasedTelemetryClient client = new FileBasedTelemetryClient(tmp.toString()); - Request.Builder builder = - new Request.Builder().addHeader("DD-Telemetry-Request-Type", "app-closing").get(); + Request.Builder builder = new Request.Builder() + .addHeader("DD-Telemetry-Request-Type", "app-closing") + .get(); TelemetryClient.Result result = client.sendHttpRequest(builder); @@ -106,9 +106,8 @@ void returnsFailureWhenOutputDirIsNotWritable(@TempDir Path tmp) throws IOExcept FileBasedTelemetryClient client = new FileBasedTelemetryClient(collision.resolve("sub").toString()); - TelemetryClient.Result result = - client.sendHttpRequest( - requestBuilder("app-heartbeat", "{}".getBytes(StandardCharsets.UTF_8))); + TelemetryClient.Result result = client.sendHttpRequest( + requestBuilder("app-heartbeat", "{}".getBytes(StandardCharsets.UTF_8))); assertEquals(TelemetryClient.Result.FAILURE, result); } diff --git a/telemetry/src/test/java/datadog/telemetry/TelemetryRequestBodyDependencyMetadataTest.java b/telemetry/src/test/java/datadog/telemetry/TelemetryRequestBodyDependencyMetadataTest.java index 9751aaf68d6..ef9d2756b43 100644 --- a/telemetry/src/test/java/datadog/telemetry/TelemetryRequestBodyDependencyMetadataTest.java +++ b/telemetry/src/test/java/datadog/telemetry/TelemetryRequestBodyDependencyMetadataTest.java @@ -20,17 +20,15 @@ class TelemetryRequestBodyDependencyMetadataTest { @Test void writeDependency_includesMetadataArrayWhenPresent() throws IOException { - String metadataValue = - "{\"id\":\"GHSA-645p-88qh-w398\"," - + "\"reached\":[{\"path\":\"com.fasterxml.jackson.databind.ObjectMapper\"," - + "\"symbol\":\"\",\"line\":1}]}"; - Dependency dep = - new Dependency( - "com.fasterxml.jackson.core:jackson-databind", - "2.8.5", - null, - null, - Collections.singletonList(metadataValue)); + String metadataValue = "{\"id\":\"GHSA-645p-88qh-w398\"," + + "\"reached\":[{\"path\":\"com.fasterxml.jackson.databind.ObjectMapper\"," + + "\"symbol\":\"\",\"line\":1}]}"; + Dependency dep = new Dependency( + "com.fasterxml.jackson.core:jackson-databind", + "2.8.5", + null, + null, + Collections.singletonList(metadataValue)); String json = serializeDependency(dep); @@ -42,15 +40,14 @@ void writeDependency_includesMetadataArrayWhenPresent() throws IOException { @Test void writeDependency_includesAllMetadataEntriesForMultipleCves() throws IOException { - Dependency dep = - new Dependency( - "com.example:lib", - "1.0.0", - null, - null, - Arrays.asList( - "{\"id\":\"GHSA-aaa-1111-2222\",\"reached\":[]}", - "{\"id\":\"GHSA-bbb-3333-4444\",\"reached\":[]}")); + Dependency dep = new Dependency( + "com.example:lib", + "1.0.0", + null, + null, + Arrays.asList( + "{\"id\":\"GHSA-aaa-1111-2222\",\"reached\":[]}", + "{\"id\":\"GHSA-bbb-3333-4444\",\"reached\":[]}")); String json = serializeDependency(dep); diff --git a/telemetry/src/test/java/datadog/telemetry/dependency/DependencyServiceTests.java b/telemetry/src/test/java/datadog/telemetry/dependency/DependencyServiceTests.java index 63d327b4aae..334a6673d4e 100644 --- a/telemetry/src/test/java/datadog/telemetry/dependency/DependencyServiceTests.java +++ b/telemetry/src/test/java/datadog/telemetry/dependency/DependencyServiceTests.java @@ -41,19 +41,17 @@ public void teardown() throws IOException { private ClassFileTransformer captureTransformer() { final ClassFileTransformer[] t = {null}; - Instrumentation instrumentation = - (Instrumentation) - Proxy.newProxyInstance( - DependencyServiceTests.class.getClassLoader(), - new Class[] {Instrumentation.class}, - (proxy, method, args) -> { - if (method.getName().equals("addTransformer")) { - t[0] = (ClassFileTransformer) args[0]; - } else { - throw new UnsupportedOperationException(); - } - return null; - }); + Instrumentation instrumentation = (Instrumentation) Proxy.newProxyInstance( + DependencyServiceTests.class.getClassLoader(), + new Class[] {Instrumentation.class}, + (proxy, method, args) -> { + if (method.getName().equals("addTransformer")) { + t[0] = (ClassFileTransformer) args[0]; + } else { + throw new UnsupportedOperationException(); + } + return null; + }); depService.installOn(instrumentation); assert t[0] != null; @@ -86,11 +84,9 @@ public void jboss_vfs_url() throws IOException, IllegalClassFormatException { VirtualFile assemblyLocation = VFS.getChild("assembly.jar"); assemblyHandle = VFS.mountAssembly(assembly, assemblyLocation); - VirtualFile virtualDir = - VFS.getChild( - ClassLoader.getSystemClassLoader() - .getResource("datadog/telemetry/dependencies/") - .getPath()); + VirtualFile virtualDir = VFS.getChild(ClassLoader.getSystemClassLoader() + .getResource("datadog/telemetry/dependencies/") + .getPath()); assembly.add("/groovy.jar", virtualDir.getChild("groovy-manifest.jar")); Dependency dep = identifyDependency(t, "assembly.jar/groovy.jar"); @@ -108,11 +104,9 @@ public void jboss_vfs_url() throws IOException, IllegalClassFormatException { public void jboss_vfs_zip_url() throws IOException, IllegalClassFormatException { ClassFileTransformer t = captureTransformer(); - VirtualFile zipFile = - VFS.getChild( - ClassLoader.getSystemClassLoader() - .getResource("datadog/telemetry/dependencies/junit.zip") - .getPath()); + VirtualFile zipFile = VFS.getChild(ClassLoader.getSystemClassLoader() + .getResource("datadog/telemetry/dependencies/junit.zip") + .getPath()); VirtualFile mountPoint = VFS.getChild("foo.zip"); tempFileProvider = TempFileProvider.create("test", new ScheduledThreadPoolExecutor(2)); assemblyHandle = VFS.mountZip(zipFile, mountPoint, tempFileProvider); diff --git a/telemetry/src/test/java/datadog/telemetry/metric/LLMObsMetricPeriodicActionTest.java b/telemetry/src/test/java/datadog/telemetry/metric/LLMObsMetricPeriodicActionTest.java index 271bd4a2cd8..6ad8858cc81 100644 --- a/telemetry/src/test/java/datadog/telemetry/metric/LLMObsMetricPeriodicActionTest.java +++ b/telemetry/src/test/java/datadog/telemetry/metric/LLMObsMetricPeriodicActionTest.java @@ -56,32 +56,28 @@ void emitsOneMetricPerDistinctTagCombination() { tagSets.add(new HashSet<>(metric.getTags())); } assertEquals( - new HashSet<>( - Arrays.asList( - new HashSet<>( - Arrays.asList( - "integration:openai", - "span_kind:llm", - "is_root_span:1", - "autoinstrumented:1", - "error:0", - "has_session_id:1")), - new HashSet<>( - Arrays.asList( - "integration:openai", - "span_kind:llm", - "is_root_span:0", - "autoinstrumented:1", - "error:0", - "has_session_id:0")), - new HashSet<>( - Arrays.asList( - "integration:anthropic", - "span_kind:embedding", - "is_root_span:1", - "autoinstrumented:0", - "error:1", - "has_session_id:0")))), + new HashSet<>(Arrays.asList( + new HashSet<>(Arrays.asList( + "integration:openai", + "span_kind:llm", + "is_root_span:1", + "autoinstrumented:1", + "error:0", + "has_session_id:1")), + new HashSet<>(Arrays.asList( + "integration:openai", + "span_kind:llm", + "is_root_span:0", + "autoinstrumented:1", + "error:0", + "has_session_id:0")), + new HashSet<>(Arrays.asList( + "integration:anthropic", + "span_kind:embedding", + "is_root_span:1", + "autoinstrumented:0", + "error:1", + "has_session_id:0")))), tagSets); } diff --git a/telemetry/src/test/java/datadog/telemetry/sca/ScaReachabilityPeriodicActionTest.java b/telemetry/src/test/java/datadog/telemetry/sca/ScaReachabilityPeriodicActionTest.java index 4037e73286c..358b3a4893e 100644 --- a/telemetry/src/test/java/datadog/telemetry/sca/ScaReachabilityPeriodicActionTest.java +++ b/telemetry/src/test/java/datadog/telemetry/sca/ScaReachabilityPeriodicActionTest.java @@ -127,13 +127,11 @@ void reportsAllCvesWhenOneIsHit() { Dependency secondReport = reported.get(1); assertEquals(2, secondReport.reachabilityMetadata.size()); // cve-1 now has a callsite - assertTrue( - secondReport.reachabilityMetadata.stream() - .anyMatch(v -> v.contains("GHSA-cve-1") && v.contains("\"path\""))); + assertTrue(secondReport.reachabilityMetadata.stream() + .anyMatch(v -> v.contains("GHSA-cve-1") && v.contains("\"path\""))); // cve-2 still has empty reached - assertTrue( - secondReport.reachabilityMetadata.stream() - .anyMatch(v -> v.contains("GHSA-cve-2") && v.contains("\"reached\":[]"))); + assertTrue(secondReport.reachabilityMetadata.stream() + .anyMatch(v -> v.contains("GHSA-cve-2") && v.contains("\"reached\":[]"))); } @Test @@ -254,14 +252,13 @@ void buildMetadataValue_emptyReachedWhenNoHit() { @Test void buildMetadataValue_includesCallsiteWhenHit() { - ScaReachabilityHit hit = - new ScaReachabilityHit( - "GHSA-645p-88qh-w398", - "com.fasterxml.jackson.core:jackson-databind", - "2.8.5", - "com.fasterxml.jackson.databind.ObjectMapper", - "", - 1); + ScaReachabilityHit hit = new ScaReachabilityHit( + "GHSA-645p-88qh-w398", + "com.fasterxml.jackson.core:jackson-databind", + "2.8.5", + "com.fasterxml.jackson.databind.ObjectMapper", + "", + 1); ScaReachabilityDependencyRegistry.CveSnapshot cve = new ScaReachabilityDependencyRegistry.CveSnapshot("GHSA-645p-88qh-w398", hit); @@ -350,16 +347,14 @@ void newDepAndUnrelatedCveState_emitsTwoIndependentEntries() { verify(telService, times(2)).addDependency(captor.capture()); java.util.List emitted = captor.getAllValues(); - Dependency depA = - emitted.stream() - .filter(d -> "com.example:lib".equals(d.name)) - .findFirst() - .orElseThrow(() -> new AssertionError("dep not found")); - Dependency depB = - emitted.stream() - .filter(d -> "com.other:lib".equals(d.name)) - .findFirst() - .orElseThrow(() -> new AssertionError("dep not found")); + Dependency depA = emitted.stream() + .filter(d -> "com.example:lib".equals(d.name)) + .findFirst() + .orElseThrow(() -> new AssertionError("dep not found")); + Dependency depB = emitted.stream() + .filter(d -> "com.other:lib".equals(d.name)) + .findFirst() + .orElseThrow(() -> new AssertionError("dep not found")); assertTrue(depA.reachabilityMetadata.isEmpty(), "depA: no CVE state → metadata:[]"); assertTrue( @@ -379,9 +374,8 @@ void cveFiresAfterDepResolved_usesKnownDepsForSourceHash() { DependencyService svc = mock(DependencyService.class); // Heartbeat 1: DependencyService returns the dep, no CVE yet when(svc.drainDeterminedDependencies()) - .thenReturn( - Collections.singletonList( - new Dependency("com.example:lib", "1.0.0", "lib.jar", "ABCD"))) + .thenReturn(Collections.singletonList( + new Dependency("com.example:lib", "1.0.0", "lib.jar", "ABCD"))) .thenReturn(Collections.emptyList()); // heartbeat 2: nothing new ScaReachabilityPeriodicAction merged = new ScaReachabilityPeriodicAction(svc); diff --git a/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java b/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java index 4d5fcc59e0e..0e6460e7421 100644 --- a/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java +++ b/test-published-dependencies/agent-logs-on-java-7/src/test/java/StartWithAgentTest.java @@ -17,9 +17,8 @@ public class StartWithAgentTest { - private static final Pattern WARNING_PATTERN = - Pattern.compile( - "^Warning: Version [^ ]+ of dd-java-agent is not compatible with Java [^ ]+ found at [^ ]+ and is effectively disabled\\.$"); + private static final Pattern WARNING_PATTERN = Pattern.compile( + "^Warning: Version [^ ]+ of dd-java-agent is not compatible with Java [^ ]+ found at [^ ]+ and is effectively disabled\\.$"); private static final String UPGRADE_MESSAGE = "Please upgrade your Java version to 8+"; @Test diff --git a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java index 53024a3273a..9d1162e58bf 100644 --- a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java @@ -248,12 +248,10 @@ private static void loadTraceTagsMap( } } while (start < str.length()) { - int nextSplitter = - argSeparatorInd == -1 - ? -1 - : str.indexOf( - keyValueSeparator, - argSeparatorInd + 1); // next splitter after the next argSeparator + int nextSplitter = argSeparatorInd == -1 + ? -1 + : str.indexOf( + keyValueSeparator, argSeparatorInd + 1); // next splitter after the next argSeparator int nextArgSeparator = argSeparatorInd == -1 ? -1 : str.indexOf(argSeparator, argSeparatorInd + 1); int end = argSeparatorInd == -1 ? str.length() : argSeparatorInd; diff --git a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java index f8187b546d2..f26eeb516e5 100644 --- a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java @@ -145,9 +145,8 @@ public String getStringNotEmpty(String key, String defaultValue, String... alias } // Create resolver only if candidate is not empty or blank if (!candidateValue.trim().isEmpty()) { - resolver = - ConfigValueResolver.of( - candidateValue, source.origin(), seqId, getConfigIdFromSource(source)); + resolver = ConfigValueResolver.of( + candidateValue, source.origin(), seqId, getConfigIdFromSource(source)); } } @@ -505,31 +504,28 @@ public static ConfigProvider getInstance() { } public static ConfigProvider createDefault() { - Properties configProperties = - loadConfigurationFile( - new ConfigProvider(new SystemPropertiesConfigSource(), new EnvironmentConfigSource())); + Properties configProperties = loadConfigurationFile( + new ConfigProvider(new SystemPropertiesConfigSource(), new EnvironmentConfigSource())); ConfigProvider.Source propertiesSource = !configProperties.isEmpty() ? new PropertiesConfigSource(configProperties, true) : null; Map ciEnvironmentVariables = CiEnvironmentVariables.getAll(); - ConfigProvider.Source ciEnvironmentSource = - ciEnvironmentVariables != null - ? new MapConfigSource( - ciEnvironmentVariables, - ConfigStrings::propertyNameToEnvironmentVariableName, - ConfigOrigin.ENV) - : null; - - return new ConfigProvider( - filterNonNull( - new SystemPropertiesConfigSource(), - StableConfigSource.FLEET, - ciEnvironmentSource, - new EnvironmentConfigSource(), - propertiesSource, - new OtelEnvironmentConfigSource(), - StableConfigSource.LOCAL, - new CapturedEnvironmentConfigSource())); + ConfigProvider.Source ciEnvironmentSource = ciEnvironmentVariables != null + ? new MapConfigSource( + ciEnvironmentVariables, + ConfigStrings::propertyNameToEnvironmentVariableName, + ConfigOrigin.ENV) + : null; + + return new ConfigProvider(filterNonNull( + new SystemPropertiesConfigSource(), + StableConfigSource.FLEET, + ciEnvironmentSource, + new EnvironmentConfigSource(), + propertiesSource, + new OtelEnvironmentConfigSource(), + StableConfigSource.LOCAL, + new CapturedEnvironmentConfigSource())); } private static ConfigProvider.Source[] filterNonNull(ConfigProvider.Source... values) { @@ -537,10 +533,8 @@ private static ConfigProvider.Source[] filterNonNull(ConfigProvider.Source... va } public static ConfigProvider withoutCollector() { - Properties configProperties = - loadConfigurationFile( - new ConfigProvider( - false, new SystemPropertiesConfigSource(), new EnvironmentConfigSource())); + Properties configProperties = loadConfigurationFile(new ConfigProvider( + false, new SystemPropertiesConfigSource(), new EnvironmentConfigSource())); if (configProperties.isEmpty()) { return new ConfigProvider( false, @@ -565,12 +559,8 @@ public static ConfigProvider withoutCollector() { public static ConfigProvider withPropertiesOverride(Properties properties) { PropertiesConfigSource providedConfigSource = new PropertiesConfigSource(properties, false); - Properties configProperties = - loadConfigurationFile( - new ConfigProvider( - new SystemPropertiesConfigSource(), - new EnvironmentConfigSource(), - providedConfigSource)); + Properties configProperties = loadConfigurationFile(new ConfigProvider( + new SystemPropertiesConfigSource(), new EnvironmentConfigSource(), providedConfigSource)); if (configProperties.isEmpty()) { return new ConfigProvider( new SystemPropertiesConfigSource(), diff --git a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java index 90fc10f10ac..9d5146da5b1 100644 --- a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java @@ -235,10 +235,9 @@ static String processTemplate(String content) throws IOException { private static String processTemplateVar(String templateVar) throws IOException { if (templateVar.startsWith(ENVIRONMENT_VARIABLES_PREFIX) && templateVar.endsWith("']")) { - String envVar = - templateVar - .substring(ENVIRONMENT_VARIABLES_PREFIX.length(), templateVar.length() - 2) - .trim(); + String envVar = templateVar + .substring(ENVIRONMENT_VARIABLES_PREFIX.length(), templateVar.length() - 2) + .trim(); if (envVar.isEmpty()) { throw new IOException("Empty environment variable name in template"); } @@ -248,8 +247,9 @@ private static String processTemplateVar(String templateVar) throws IOException } return value; } else if (templateVar.startsWith(PROCESS_ARGUMENTS_PREFIX) && templateVar.endsWith("']")) { - String processArg = - templateVar.substring(PROCESS_ARGUMENTS_PREFIX.length(), templateVar.length() - 2).trim(); + String processArg = templateVar + .substring(PROCESS_ARGUMENTS_PREFIX.length(), templateVar.length() - 2) + .trim(); if (processArg.isEmpty()) { throw new IOException("Empty process argument in template"); } diff --git a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java index 84d0835f984..3e266420c68 100644 --- a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java @@ -21,9 +21,8 @@ public final class StableConfigSource extends ConfigProvider.Source { "/etc/datadog-agent/managed/datadog-agent/stable/application_monitoring.yaml"; public static final StableConfigSource LOCAL = new StableConfigSource(LOCAL_STABLE_CONFIG_PATH, ConfigOrigin.LOCAL_STABLE_CONFIG); - public static final StableConfigSource FLEET = - new StableConfigSource( - StableConfigSource.FLEET_STABLE_CONFIG_PATH, ConfigOrigin.FLEET_STABLE_CONFIG); + public static final StableConfigSource FLEET = new StableConfigSource( + StableConfigSource.FLEET_STABLE_CONFIG_PATH, ConfigOrigin.FLEET_STABLE_CONFIG); private final ConfigOrigin fileOrigin; private final StableConfig config; diff --git a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariables.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariables.java index c8208ee709e..4110c332cf1 100644 --- a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariables.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariables.java @@ -120,9 +120,8 @@ private static Map getRemoteEnvironment(String url, String key) return asMap(properties); } else { - try (BufferedReader r = - new BufferedReader( - new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8))) { + try (BufferedReader r = new BufferedReader( + new InputStreamReader(conn.getErrorStream(), StandardCharsets.UTF_8))) { String body = r.lines().collect(Collectors.joining("\n")); throw new IOException( String.format("Remote environment request failed (HTTP %d) %s", code, body)); diff --git a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java index 4c62baf6069..88ebd99056d 100644 --- a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java @@ -50,23 +50,19 @@ public static Rule from(Map map) { configObj); } - List selectors = - ((List) selectorsObj) - .stream() - .filter(Objects::nonNull) - .map( - s -> { - if (!(s instanceof Map)) { - throwStableConfigMappingException( - "Each selector must be a map, but got: " - + s.getClass().getSimpleName() - + ": ", - s); - } + List selectors = ((List) selectorsObj) + .stream() + .filter(Objects::nonNull) + .map(s -> { + if (!(s instanceof Map)) { + throwStableConfigMappingException( + "Each selector must be a map, but got: " + s.getClass().getSimpleName() + ": ", + s); + } - return Selector.from((Map) s); - }) - .collect(toList()); + return Selector.from((Map) s); + }) + .collect(toList()); return new Rule(unmodifiableList(selectors), (Map) configObj); } diff --git a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java index 5b0f10a3cda..4d4ee573808 100644 --- a/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java @@ -19,8 +19,7 @@ static String safeToString(Object value) { String str = value.toString(); if (str.length() > MAX_LEN) { int partLen = MAX_LEN / 2; - return str.substring(0, partLen) - + "...(truncated)..." + return str.substring(0, partLen) + "...(truncated)..." + str.substring(str.length() - partLen); } return str; diff --git a/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java b/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java index e58c71fa664..5c8e753b836 100644 --- a/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java +++ b/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java @@ -130,12 +130,11 @@ public Map getEnvironmentVariables() { } String envFromDeprecated = configSource.primaryEnvFromDeprecated(key); if (envFromDeprecated != null) { - String warning = - "Environment variable " - + key - + " is deprecated. Please use " - + (primaryEnv != null ? primaryEnv : envFromDeprecated) - + " instead."; + String warning = "Environment variable " + + key + + " is deprecated. Please use " + + (primaryEnv != null ? primaryEnv : envFromDeprecated) + + " instead."; log.warn(warning); } } else { @@ -159,11 +158,10 @@ public String getEnvironmentVariable(String name) { if (configInversionStrict == StrictnessPolicy.STRICT_TEST) { unsupportedConfigs.add(name); - throw new IllegalArgumentException( - "Unsupported configuration: " - + name - + " is not in GeneratedSupportedConfigurations. " - + "Add it to metadata/supported-configurations.json or remove the usage."); + throw new IllegalArgumentException("Unsupported configuration: " + + name + + " is not in GeneratedSupportedConfigurations. " + + "Add it to metadata/supported-configurations.json or remove the usage."); } } diff --git a/utils/config-utils/src/test/java/datadog/trace/api/ConfigSettingTest.java b/utils/config-utils/src/test/java/datadog/trace/api/ConfigSettingTest.java index 0b40400d963..a0575c86cf9 100644 --- a/utils/config-utils/src/test/java/datadog/trace/api/ConfigSettingTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/api/ConfigSettingTest.java @@ -59,7 +59,8 @@ void supportsEqualityCheck( "non-sensitive key | some.other.key | somevalue | somevalue " }) void filtersKeyValues(String key, String value, String filteredValue) { - assertEquals(filteredValue, ConfigSetting.of(key, value, ConfigOrigin.DEFAULT).stringValue()); + assertEquals( + filteredValue, ConfigSetting.of(key, value, ConfigOrigin.DEFAULT).stringValue()); } @TableTest({ diff --git a/utils/config-utils/src/test/java/datadog/trace/api/env/CapturedEnvironmentTest.java b/utils/config-utils/src/test/java/datadog/trace/api/env/CapturedEnvironmentTest.java index 4b0c22204b7..6aec5203ebf 100644 --- a/utils/config-utils/src/test/java/datadog/trace/api/env/CapturedEnvironmentTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/api/env/CapturedEnvironmentTest.java @@ -74,13 +74,12 @@ private static String forkAndRunProperties(String arg, Map envVa int exitCode = process.waitFor(); // Dumping state on error if (exitCode != 0) { - System.out.println( - "Error printing service name. Exit code " - + exitCode - + " with service name: '" - + serviceName - + "' and error:\n" - + error); + System.out.println("Error printing service name. Exit code " + + exitCode + + " with service name: '" + + serviceName + + "' and error:\n" + + error); throw new IllegalStateException("Process should exit without error"); } return serviceName; diff --git a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/ConfigConverterTest.java b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/ConfigConverterTest.java index 863902ece26..e8fd57649a8 100644 --- a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/ConfigConverterTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/ConfigConverterTest.java @@ -42,10 +42,9 @@ void convertBooleanProperties(String stringValue, Boolean expectedConvertedValue "off " }) void convertBooleanPropertiesThrowsExceptionForInvalidValues(String invalidValue) { - ConfigConverter.InvalidBooleanValueException exception = - assertThrows( - ConfigConverter.InvalidBooleanValueException.class, - () -> ConfigConverter.valueOf(invalidValue, Boolean.class)); + ConfigConverter.InvalidBooleanValueException exception = assertThrows( + ConfigConverter.InvalidBooleanValueException.class, + () -> ConfigConverter.valueOf(invalidValue, Boolean.class)); assertTrue(exception.getMessage().contains("Invalid boolean value:")); } diff --git a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigMappingExceptionTest.java b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigMappingExceptionTest.java index 8b2476197f3..6986b66c987 100644 --- a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigMappingExceptionTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigMappingExceptionTest.java @@ -23,21 +23,18 @@ void constructorsWorkAsExpected() { @Test void safeToStringHandlesNull() { - StableConfigMappingException ex = - assertThrows( - StableConfigMappingException.class, - () -> StableConfigMappingException.throwStableConfigMappingException("msg", null)); + StableConfigMappingException ex = assertThrows( + StableConfigMappingException.class, + () -> StableConfigMappingException.throwStableConfigMappingException("msg", null)); assertTrue(ex.getMessage().endsWith(" null")); } @Test void safeToStringHandlesShortString() { - StableConfigMappingException ex = - assertThrows( - StableConfigMappingException.class, - () -> - StableConfigMappingException.throwStableConfigMappingException( - "msg", "short string")); + StableConfigMappingException ex = assertThrows( + StableConfigMappingException.class, + () -> + StableConfigMappingException.throwStableConfigMappingException("msg", "short string")); assertTrue(ex.getMessage().endsWith(" short string")); } @@ -47,10 +44,9 @@ void safeToStringHandlesLongString() { Arrays.fill(chars, 'a'); String longStr = new String(chars); - StableConfigMappingException ex = - assertThrows( - StableConfigMappingException.class, - () -> StableConfigMappingException.throwStableConfigMappingException("msg", longStr)); + StableConfigMappingException ex = assertThrows( + StableConfigMappingException.class, + () -> StableConfigMappingException.throwStableConfigMappingException("msg", longStr)); char[] halfChars = new char[50]; Arrays.fill(halfChars, 'a'); diff --git a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java index 8ca3989ba7f..eaff01fd398 100644 --- a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java @@ -38,9 +38,8 @@ public class StableConfigSourceTest extends DDJavaSpecification { @Test void testFileDoesntExist() { - StableConfigSource config = - new StableConfigSource( - StableConfigSource.LOCAL_STABLE_CONFIG_PATH, ConfigOrigin.LOCAL_STABLE_CONFIG); + StableConfigSource config = new StableConfigSource( + StableConfigSource.LOCAL_STABLE_CONFIG_PATH, ConfigOrigin.LOCAL_STABLE_CONFIG); assertEquals(0, config.getKeys().size()); assertNull(config.getConfigId()); @@ -139,12 +138,9 @@ void testParseInvalidLogsMappingErrors(String yaml, String expectedLogSubstring) assertNull(stableCfg.getConfigId()); assertEquals(0, stableCfg.getKeys().size()); - boolean hasExpectedLog = - listAppender.list.stream() - .anyMatch( - event -> - "WARN".equals(event.getLevel().toString()) - && event.getFormattedMessage().contains(expectedLogSubstring)); + boolean hasExpectedLog = listAppender.list.stream() + .anyMatch(event -> "WARN".equals(event.getLevel().toString()) + && event.getFormattedMessage().contains(expectedLogSubstring)); assertTrue(hasExpectedLog, "Expected WARN log containing: " + expectedLogSubstring); } finally { tempFile.delete(); @@ -256,10 +252,9 @@ void testConfigIdExistsInConfigCollectorWhenUsingStableConfigSource() throws Exc String expectedConfigId = "123"; // Create YAML content with config_id and some configuration - String yamlContent = - "config_id: " - + expectedConfigId - + "\napm_configuration_default:\n DD_SERVICE: test-service\n DD_ENV: test-env\n"; + String yamlContent = "config_id: " + + expectedConfigId + + "\napm_configuration_default:\n DD_SERVICE: test-service\n DD_ENV: test-env\n"; Files.write(filePath, yamlContent.getBytes()); // Clear any existing collected config diff --git a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariablesTest.java b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariablesTest.java index 8a913b0901b..95aecc2502d 100644 --- a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariablesTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/civisibility/CiEnvironmentVariablesTest.java @@ -24,20 +24,19 @@ public class CiEnvironmentVariablesTest { @BeforeAll public static void startServer() throws Exception { server = new MockWebServer(); - server.setDispatcher( - new Dispatcher() { - @Override - public MockResponse dispatch(RecordedRequest req) { - if (failedResponses.getAndDecrement() > 0) { - return new MockResponse().setResponseCode(500); - } - if (SECRET_KEY.equals( - req.getHeader(CiEnvironmentVariables.DD_ENV_VARS_PROVIDER_KEY_HEADER))) { - return new MockResponse().setResponseCode(200).setBody("a=1\nb=2"); - } - return new MockResponse().setResponseCode(403); - } - }); + server.setDispatcher(new Dispatcher() { + @Override + public MockResponse dispatch(RecordedRequest req) { + if (failedResponses.getAndDecrement() > 0) { + return new MockResponse().setResponseCode(500); + } + if (SECRET_KEY.equals( + req.getHeader(CiEnvironmentVariables.DD_ENV_VARS_PROVIDER_KEY_HEADER))) { + return new MockResponse().setResponseCode(200).setBody("a=1\nb=2"); + } + return new MockResponse().setResponseCode(403); + } + }); server.start(); } @@ -50,12 +49,11 @@ public static void stopServer() throws Exception { void testGetEnvironment() { failedResponses.set(1); // to test retries - Map env = - CiEnvironmentVariables.getRemoteEnvironmentWithRetries( - server.url("/").toString(), - SECRET_KEY, - new CiEnvironmentVariables.RetryPolicy(2, 3, 2), - null); + Map env = CiEnvironmentVariables.getRemoteEnvironmentWithRetries( + server.url("/").toString(), + SECRET_KEY, + new CiEnvironmentVariables.RetryPolicy(2, 3, 2), + null); assertEquals(2, env.size()); assertEquals("1", env.get("a")); assertEquals("2", env.get("b")); @@ -65,12 +63,11 @@ void testGetEnvironment() { void testFailedGetEnvironment() { failedResponses.set(3); - Map env = - CiEnvironmentVariables.getRemoteEnvironmentWithRetries( - server.url("/").toString(), - SECRET_KEY, - new CiEnvironmentVariables.RetryPolicy(2, 3, 2), - null); + Map env = CiEnvironmentVariables.getRemoteEnvironmentWithRetries( + server.url("/").toString(), + SECRET_KEY, + new CiEnvironmentVariables.RetryPolicy(2, 3, 2), + null); assertNull(env); } } diff --git a/utils/config-utils/src/test/java/datadog/trace/config/inversion/ConfigHelperTest.java b/utils/config-utils/src/test/java/datadog/trace/config/inversion/ConfigHelperTest.java index 357da91fa64..864220f83bb 100644 --- a/utils/config-utils/src/test/java/datadog/trace/config/inversion/ConfigHelperTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/config/inversion/ConfigHelperTest.java @@ -58,9 +58,8 @@ static void setUp() { testAliasMapping.put(NEW_ALIAS_KEY_2, NEW_ALIAS_TARGET); // Create and set test configuration source - testSource = - new TestSupportedConfigurationSource( - testSupported, testAliases, testAliasMapping, new HashMap<>()); + testSource = new TestSupportedConfigurationSource( + testSupported, testAliases, testAliasMapping, new HashMap<>()); ConfigHelper.get().setConfigurationSource(testSource); strictness = ConfigHelper.get().configInversionStrictFlag(); ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.STRICT_TEST); @@ -138,9 +137,8 @@ void testAliasWithEmptyList() { aliasMap.put("EMPTY_ALIAS_CONFIG", new ArrayList<>()); ConfigHelper.get() - .setConfigurationSource( - new TestSupportedConfigurationSource( - new HashSet<>(), aliasMap, new HashMap<>(), new HashMap<>())); + .setConfigurationSource(new TestSupportedConfigurationSource( + new HashSet<>(), aliasMap, new HashMap<>(), new HashMap<>())); assertNull(ConfigHelper.env("EMPTY_ALIAS_CONFIG")); diff --git a/utils/config-utils/src/testFixtures/java/datadog/trace/test/ConfigInversionExtension.java b/utils/config-utils/src/testFixtures/java/datadog/trace/test/ConfigInversionExtension.java index d8ba0035cd2..7b4257e93e0 100644 --- a/utils/config-utils/src/testFixtures/java/datadog/trace/test/ConfigInversionExtension.java +++ b/utils/config-utils/src/testFixtures/java/datadog/trace/test/ConfigInversionExtension.java @@ -31,10 +31,9 @@ public void afterAll(ExtensionContext ctx) { ConfigHelper.get().setConfigInversionStrict(previousPolicy); if (!unsupported.isEmpty()) { - throw new AssertionError( - "Unsupported configurations found during test. " - + "Add these to metadata/supported-configurations.json or opt out with StrictnessPolicy.TEST:\n " - + String.join("\n ", unsupported)); + throw new AssertionError("Unsupported configurations found during test. " + + "Add these to metadata/supported-configurations.json or opt out with StrictnessPolicy.TEST:\n " + + String.join("\n ", unsupported)); } } } diff --git a/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java b/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java index 61d174e97c5..e632201edf0 100644 --- a/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java +++ b/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java @@ -41,9 +41,8 @@ public class ContainerInfo { private static final Pattern LINE_PATTERN = Pattern.compile("(\\d+):([^:]*):(.+)$"); private static final Pattern POD_PATTERN = Pattern.compile("(?:.+)?pod(" + UUID_REGEX + ")(?:.slice)?$"); - private static final Pattern CONTAINER_PATTERN = - Pattern.compile( - "(?:.+)?(" + UUID_REGEX + "|" + CONTAINER_REGEX + "|" + TASK_REGEX + ")(?:.scope)?$"); + private static final Pattern CONTAINER_PATTERN = Pattern.compile( + "(?:.+)?(" + UUID_REGEX + "|" + CONTAINER_REGEX + "|" + TASK_REGEX + ")(?:.scope)?$"); private static final ContainerInfo INSTANCE; diff --git a/utils/container-utils/src/test/java/datadog/common/container/ContainerInfoTest.java b/utils/container-utils/src/test/java/datadog/common/container/ContainerInfoTest.java index cb6fe8bf0d9..6ae564e9c74 100644 --- a/utils/container-utils/src/test/java/datadog/common/container/ContainerInfoTest.java +++ b/utils/container-utils/src/test/java/datadog/common/container/ContainerInfoTest.java @@ -343,7 +343,8 @@ void readEntityIDReturnIdInoForMemoryController( @Test void readEntityIDReturnIdInoForParentWhenPathIsSlash() throws Exception { File mountPath = createTempDir(); - File memoryController = Files.createDirectory(mountPath.toPath().resolve("memory")).toFile(); + File memoryController = + Files.createDirectory(mountPath.toPath().resolve("memory")).toFile(); memoryController.deleteOnExit(); long ino = readInode(memoryController.toPath()); diff --git a/utils/filesystem-utils/src/test/java/datadog/common/filesystem/FilesTest.java b/utils/filesystem-utils/src/test/java/datadog/common/filesystem/FilesTest.java index daa50573910..90d62a58a91 100644 --- a/utils/filesystem-utils/src/test/java/datadog/common/filesystem/FilesTest.java +++ b/utils/filesystem-utils/src/test/java/datadog/common/filesystem/FilesTest.java @@ -39,26 +39,25 @@ void existsReturnsFalseWhenSecurityManagerForbidsFileAccess() throws IOException // --- install restrictive SecurityManager only in this test --- SecurityManager originalSM = System.getSecurityManager(); - System.setSecurityManager( - new SecurityManager() { - @Override - public void checkRead(String filePath) { - // Deny only THIS file so classloading still works - if (filePath.equals(file.getAbsolutePath())) { - throw new SecurityException("Access denied"); - } - } + System.setSecurityManager(new SecurityManager() { + @Override + public void checkRead(String filePath) { + // Deny only THIS file so classloading still works + if (filePath.equals(file.getAbsolutePath())) { + throw new SecurityException("Access denied"); + } + } - @Override - public void checkPermission(Permission perm) { - // allow everything else - } + @Override + public void checkPermission(Permission perm) { + // allow everything else + } - @Override - public void checkPermission(Permission perm, Object context) { - // allow everything else - } - }); + @Override + public void checkPermission(Permission perm, Object context) { + // allow everything else + } + }); try { boolean result = Files.exists(file); diff --git a/utils/flare-utils/src/main/java/datadog/flare/TracerFlarePoller.java b/utils/flare-utils/src/main/java/datadog/flare/TracerFlarePoller.java index 49755cf24d0..9a1d223a063 100644 --- a/utils/flare-utils/src/main/java/datadog/flare/TracerFlarePoller.java +++ b/utils/flare-utils/src/main/java/datadog/flare/TracerFlarePoller.java @@ -77,9 +77,8 @@ public Runnable register(Config config, SharedCommunicationObjects sco) { @Override public void accept(ConfigKey configKey, byte[] content, PollingRateHinter hinter) throws IOException { - AgentConfigLayer agentConfigLayer = - AGENT_CONFIG_LAYER_ADAPTER.fromJson( - Okio.buffer(Okio.source(new ByteArrayInputStream(content)))); + AgentConfigLayer agentConfigLayer = AGENT_CONFIG_LAYER_ADAPTER.fromJson( + Okio.buffer(Okio.source(new ByteArrayInputStream(content)))); if (null != agentConfigLayer && null != agentConfigLayer.config && null != agentConfigLayer.config.logLevel) { diff --git a/utils/flare-utils/src/main/java/datadog/flare/TracerFlareService.java b/utils/flare-utils/src/main/java/datadog/flare/TracerFlareService.java index dcb097287a3..eb176bed681 100644 --- a/utils/flare-utils/src/main/java/datadog/flare/TracerFlareService.java +++ b/utils/flare-utils/src/main/java/datadog/flare/TracerFlareService.java @@ -158,22 +158,21 @@ void doSend(String caseId, String email, String hostname, boolean dumpThreads) { try { long flareEndMillis = System.currentTimeMillis(); - RequestBody report = - RequestBody.create( - OCTET_STREAM, buildFlareZip(flareStartMillis, flareEndMillis, dumpThreads)); - - RequestBody form = - new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart("source", "tracer_java") - .addFormDataPart("case_id", caseId) - .addFormDataPart("email", email) - .addFormDataPart("hostname", hostname) - .addFormDataPart("flare_file", getFlareName(flareEndMillis), report) - .build(); - - Request flareRequest = - OkHttpUtils.prepareRequest(flareUrl, Collections.emptyMap()).post(form).build(); + RequestBody report = RequestBody.create( + OCTET_STREAM, buildFlareZip(flareStartMillis, flareEndMillis, dumpThreads)); + + RequestBody form = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("source", "tracer_java") + .addFormDataPart("case_id", caseId) + .addFormDataPart("email", email) + .addFormDataPart("hostname", hostname) + .addFormDataPart("flare_file", getFlareName(flareEndMillis), report) + .build(); + + Request flareRequest = OkHttpUtils.prepareRequest(flareUrl, Collections.emptyMap()) + .post(form) + .build(); try (Response response = okHttpClient.newCall(flareRequest).execute()) { if (response.code() == 404) { @@ -252,10 +251,9 @@ private void addThreadDump(ZipOutputStream zip) throws IOException { StringBuilder buf = new StringBuilder(); try { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); - for (ThreadInfo threadInfo : - threadMXBean.dumpAllThreads( - threadMXBean.isObjectMonitorUsageSupported(), - threadMXBean.isSynchronizerUsageSupported())) { + for (ThreadInfo threadInfo : threadMXBean.dumpAllThreads( + threadMXBean.isObjectMonitorUsageSupported(), + threadMXBean.isSynchronizerUsageSupported())) { buf.append(threadInfo); } } catch (RuntimeException e) { diff --git a/utils/logging-utils/src/main/java/datadog/logging/IOLogger.java b/utils/logging-utils/src/main/java/datadog/logging/IOLogger.java index af21f4a0c57..fb0dd45d32e 100644 --- a/utils/logging-utils/src/main/java/datadog/logging/IOLogger.java +++ b/utils/logging-utils/src/main/java/datadog/logging/IOLogger.java @@ -85,23 +85,21 @@ public boolean error(final String message, Response response, Exception exceptio } boolean hasLogged; if (response != null) { - hasLogged = - ratelimitedLogger.warn( - EXCLUDE_TELEMETRY, - "{} Status: {} {}", - message, - response.getStatusCode(), - response.getMessage()); + hasLogged = ratelimitedLogger.warn( + EXCLUDE_TELEMETRY, + "{} Status: {} {}", + message, + response.getStatusCode(), + response.getMessage()); } else if (exception != null) { // NOTE: We do not pass the full exception to warn on purpose. We don't want to // print a full stacktrace unless we're in debug mode - hasLogged = - ratelimitedLogger.warn( - EXCLUDE_TELEMETRY, - "{} {}: {}", - message, - exception.getClass().getName(), - exception.getMessage()); + hasLogged = ratelimitedLogger.warn( + EXCLUDE_TELEMETRY, + "{} {}: {}", + message, + exception.getClass().getName(), + exception.getMessage()); } else { hasLogged = ratelimitedLogger.warn(message); } diff --git a/utils/logging-utils/src/main/java/datadog/logging/RatelimitedLogger.java b/utils/logging-utils/src/main/java/datadog/logging/RatelimitedLogger.java index b88505c1e59..0a1902f8286 100644 --- a/utils/logging-utils/src/main/java/datadog/logging/RatelimitedLogger.java +++ b/utils/logging-utils/src/main/java/datadog/logging/RatelimitedLogger.java @@ -65,10 +65,9 @@ private static String createNoLogMessage( noLogStringBuilder.append(delay); noLogStringBuilder.append(' '); String unit = timeUnit.name().toLowerCase(Locale.ROOT); - unit = - delay == 1 - ? unit.substring(0, unit.length() - 1) - : unit; // should we drop the plural s or not? + unit = delay == 1 + ? unit.substring(0, unit.length() - 1) + : unit; // should we drop the plural s or not? noLogStringBuilder.append(unit); noLogStringBuilder.append(postfix); return noLogStringBuilder.toString(); diff --git a/utils/logging-utils/src/test/java/datadog/logging/RateLimitedLoggerTest.java b/utils/logging-utils/src/test/java/datadog/logging/RateLimitedLoggerTest.java index 11519ad2d9f..f31c9e4ce8d 100644 --- a/utils/logging-utils/src/test/java/datadog/logging/RateLimitedLoggerTest.java +++ b/utils/logging-utils/src/test/java/datadog/logging/RateLimitedLoggerTest.java @@ -75,10 +75,9 @@ void warningOnce() { assertFalse(secondLog); verify(this.log) - .warn( - nullable(Marker.class), - eq("test {} {} (Will not log warnings for 1 minute)"), - (Object[]) any()); + .warn(nullable(Marker.class), eq("test {} {} (Will not log warnings for 1 minute)"), (Object + []) + any()); } @Test @@ -166,9 +165,8 @@ void noArgs() { verify(this.log) .warn( - nullable(Marker.class), - eq("test (Will not log warnings for 1 millisecond)"), - (Object[]) any()); + nullable(Marker.class), eq("test (Will not log warnings for 1 millisecond)"), (Object[]) + any()); } @Test diff --git a/utils/socket-utils/src/test/java/datadog/common/socket/TunnelingJdkSocketTest.java b/utils/socket-utils/src/test/java/datadog/common/socket/TunnelingJdkSocketTest.java index 1c7c7ec7a19..6d65e025799 100644 --- a/utils/socket-utils/src/test/java/datadog/common/socket/TunnelingJdkSocketTest.java +++ b/utils/socket-utils/src/test/java/datadog/common/socket/TunnelingJdkSocketTest.java @@ -236,25 +236,23 @@ private String getPid() { } private static void startServer(UnixDomainSocketAddress socketAddress) { - Thread serverThread = - new Thread( - () -> { - try (ServerSocketChannel serverChannel = - ServerSocketChannel.open(StandardProtocolFamily.UNIX)) { - serverChannel.bind(socketAddress); - isServerRunning.set(true); - - synchronized (isServerRunning) { - isServerRunning.notifyAll(); - } - - while (isServerRunning.get()) { - SocketChannel clientChannel = serverChannel.accept(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - }); + Thread serverThread = new Thread(() -> { + try (ServerSocketChannel serverChannel = + ServerSocketChannel.open(StandardProtocolFamily.UNIX)) { + serverChannel.bind(socketAddress); + isServerRunning.set(true); + + synchronized (isServerRunning) { + isServerRunning.notifyAll(); + } + + while (isServerRunning.get()) { + SocketChannel clientChannel = serverChannel.accept(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + }); serverThread.start(); synchronized (isServerRunning) { diff --git a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/DecodedSpanLinks.java b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/DecodedSpanLinks.java index 657582d8e74..1d0a7f0f017 100644 --- a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/DecodedSpanLinks.java +++ b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/DecodedSpanLinks.java @@ -145,10 +145,9 @@ private SpanLink( this.spanId = spanId; this.traceFlags = traceFlags; this.traceState = traceState == null ? "" : traceState; - this.attributes = - attributes == null || attributes.isEmpty() - ? emptyMap() - : unmodifiableMap(new HashMap<>(attributes)); + this.attributes = attributes == null || attributes.isEmpty() + ? emptyMap() + : unmodifiableMap(new HashMap<>(attributes)); } @Override diff --git a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/Decoder.java b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/Decoder.java index 313584518a3..b3c9681d82d 100644 --- a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/Decoder.java +++ b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/Decoder.java @@ -29,12 +29,10 @@ public static DecodedMessage decodeV04(byte[] buffer) { public static List sortByStart(Collection spans) { DecodedSpan[] spanArray = new DecodedSpan[spans.size()]; spanArray = spans.toArray(spanArray); - Arrays.sort( - spanArray, - (o1, o2) -> { - long res = o1.getStart() - o2.getStart(); - return res == 0 ? 0 : res > 0 ? 1 : -1; - }); + Arrays.sort(spanArray, (o1, o2) -> { + long res = o1.getStart() - o2.getStart(); + return res == 0 ? 0 : res > 0 ? 1 : -1; + }); return Arrays.asList(spanArray); } } diff --git a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/json/raw/MessageJson.java b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/json/raw/MessageJson.java index 42e8971cf06..99452eb1122 100644 --- a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/json/raw/MessageJson.java +++ b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/json/raw/MessageJson.java @@ -28,15 +28,13 @@ * the list of traces. */ public final class MessageJson implements DecodedMessage { - private static final Type LIST_OF_TRACES = - Types.newParameterizedType( - List.class, Types.newParameterizedType(List.class, SpanJson.class)); - private static final JsonAdapter>> ADAPTER = - new Moshi.Builder() - .add(new MetricNumberAdapter()) - .add(new MetaStructObjectAdapter()) - .build() - .adapter(LIST_OF_TRACES); + private static final Type LIST_OF_TRACES = Types.newParameterizedType( + List.class, Types.newParameterizedType(List.class, SpanJson.class)); + private static final JsonAdapter>> ADAPTER = new Moshi.Builder() + .add(new MetricNumberAdapter()) + .add(new MetaStructObjectAdapter()) + .build() + .adapter(LIST_OF_TRACES); private final List traces; @@ -68,10 +66,9 @@ public static MessageJson fromJson(String json) { || span.spanId == null || span.start == null || span.duration == null) { - throw new IllegalStateException( - "JSON span missing a required v0.4 field " - + "(name, trace_id, span_id, start, duration): " - + span); + throw new IllegalStateException("JSON span missing a required v0.4 field " + + "(name, trace_id, span_id, start, duration): " + + span); } span.resolveLinks(); decodedSpans.add(span); diff --git a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v04/raw/SpanV04.java b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v04/raw/SpanV04.java index cbaeb2af1ed..91a961e5c1e 100644 --- a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v04/raw/SpanV04.java +++ b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v04/raw/SpanV04.java @@ -42,10 +42,8 @@ static SpanV04 unpack(MessageUnpacker unpacker) { try { int size = unpacker.unpackMapHeader(); if (size != 12 && size != 13) { - throw new IllegalArgumentException( - "Wrong span element map size " - + size - + ". Expected 12 (plain) or 13 (with meta_struct)."); + throw new IllegalArgumentException("Wrong span element map size " + size + + ". Expected 12 (plain) or 13 (with meta_struct)."); } String service = unpackString("service", unpacker); diff --git a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/SpanV1.java b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/SpanV1.java index c4ec1e4b6b9..b296ce4d425 100644 --- a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/SpanV1.java +++ b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/SpanV1.java @@ -434,28 +434,25 @@ private static long unpackTraceId(MessageUnpacker unpacker) throws IOException { private static void unpackLinkAttributes( MessageUnpacker unpacker, List stringTable, Map attributes) throws IOException { - forEachAttribute( - unpacker, - stringTable, - (attributeUnpacker, table, key, valueType) -> { - switch (valueType) { - case STRING_VALUE_TYPE: - attributes.put(key, unpackStreamingString(attributeUnpacker, table)); - break; - case BOOL_VALUE_TYPE: - attributes.put(key, String.valueOf(attributeUnpacker.unpackBoolean())); - break; - case FLOAT_VALUE_TYPE: - attributes.put(key, String.valueOf(attributeUnpacker.unpackDouble())); - break; - case INT_VALUE_TYPE: - attributes.put(key, String.valueOf(attributeUnpacker.unpackLong())); - break; - default: - attributeUnpacker.skipValue(); - break; - } - }); + forEachAttribute(unpacker, stringTable, (attributeUnpacker, table, key, valueType) -> { + switch (valueType) { + case STRING_VALUE_TYPE: + attributes.put(key, unpackStreamingString(attributeUnpacker, table)); + break; + case BOOL_VALUE_TYPE: + attributes.put(key, String.valueOf(attributeUnpacker.unpackBoolean())); + break; + case FLOAT_VALUE_TYPE: + attributes.put(key, String.valueOf(attributeUnpacker.unpackDouble())); + break; + case INT_VALUE_TYPE: + attributes.put(key, String.valueOf(attributeUnpacker.unpackLong())); + break; + default: + attributeUnpacker.skipValue(); + break; + } + }); } static void skipAttributes(MessageUnpacker unpacker, List stringTable) diff --git a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/TraceV1.java b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/TraceV1.java index 5c23f0e1fb2..52b185d0960 100644 --- a/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/TraceV1.java +++ b/utils/test-agent-utils/decoder/src/main/java/datadog/trace/test/agent/decoder/v1/raw/TraceV1.java @@ -110,22 +110,21 @@ private static DecodedSpan[] withChunkFields( && !metrics.containsKey("_sampling_priority_v1")) { metrics.put("_sampling_priority_v1", samplingPriority); } - updated[i] = - new SpanV1( - span.getService(), - span.getName(), - span.getResource(), - traceId == 0 ? span.getTraceId() : traceId, - span.getSpanId(), - span.getParentId(), - span.getStart(), - span.getDuration(), - span.getError(), - span.getType(), - metrics, - span.getMeta(), - span.getMetaStruct(), - span.getLinks()); + updated[i] = new SpanV1( + span.getService(), + span.getName(), + span.getResource(), + traceId == 0 ? span.getTraceId() : traceId, + span.getSpanId(), + span.getParentId(), + span.getStart(), + span.getDuration(), + span.getError(), + span.getType(), + metrics, + span.getMeta(), + span.getMetaStruct(), + span.getLinks()); } return updated; } diff --git a/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/JsonDecoderTest.java b/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/JsonDecoderTest.java index 78d60bf8e0f..bb78dbdd4de 100644 --- a/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/JsonDecoderTest.java +++ b/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/JsonDecoderTest.java @@ -97,16 +97,15 @@ void decodesUnsignedIds() { // Trace/span IDs are unsigned 64-bit; the agent emits them as JSON numbers that can exceed // Long.MAX_VALUE. They must be parsed unsigned and kept as the signed bit pattern. String maxUnsigned = Long.toUnsignedString(-1L); // 18446744073709551615 == 2^64 - 1 - String json = - "[[{" - + "\"service\": \"s\", \"name\": \"n\", \"resource\": \"r\", \"type\": \"web\"," - + "\"trace_id\": " - + maxUnsigned - + ", \"span_id\": " - + maxUnsigned - + ", \"parent_id\": 0, \"start\": 0, \"duration\": 0, \"error\": 0," - + "\"meta\": {}, \"metrics\": {}" - + "}]]"; + String json = "[[{" + + "\"service\": \"s\", \"name\": \"n\", \"resource\": \"r\", \"type\": \"web\"," + + "\"trace_id\": " + + maxUnsigned + + ", \"span_id\": " + + maxUnsigned + + ", \"parent_id\": 0, \"start\": 0, \"duration\": 0, \"error\": 0," + + "\"meta\": {}, \"metrics\": {}" + + "}]]"; DecodedSpan span = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0); assertEquals(-1L, span.getTraceId(), "unsigned 2^64-1 kept as its signed bit pattern"); assertEquals(-1L, span.getSpanId()); @@ -121,17 +120,16 @@ void preservesIntegralMetricTypesAndPrecision() { // behaves identically whether the span came from the msgpack or JSON backend. long aboveDoublePrecision = (1L << 53) + 1; // 9007199254740993, not representable as a double BigInteger beyondLong = BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE); // 2^63 - String json = - "[[{" - + "\"service\": \"s\", \"name\": \"n\", \"resource\": \"r\"," - + "\"trace_id\": 1, \"span_id\": 1, \"parent_id\": 0, \"start\": 0, \"duration\": 0," - + "\"error\": 0, \"meta\": {}," - + "\"metrics\": {\"small\": 1, \"big\": " - + aboveDoublePrecision - + ", \"huge\": " - + beyondLong - + ", \"ratio\": 0.5}" - + "}]]"; + String json = "[[{" + + "\"service\": \"s\", \"name\": \"n\", \"resource\": \"r\"," + + "\"trace_id\": 1, \"span_id\": 1, \"parent_id\": 0, \"start\": 0, \"duration\": 0," + + "\"error\": 0, \"meta\": {}," + + "\"metrics\": {\"small\": 1, \"big\": " + + aboveDoublePrecision + + ", \"huge\": " + + beyondLong + + ", \"ratio\": 0.5}" + + "}]]"; Map metrics = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0).getMetrics(); @@ -164,9 +162,8 @@ void rejectsSpansMissingRequiredV04Fields() { "missing span_id"); assertThrows( IllegalStateException.class, - () -> - Decoder.decodeJson( - oneSpan("\"name\":\"n\",\"trace_id\":1,\"span_id\":1,\"duration\":0")), + () -> Decoder.decodeJson( + oneSpan("\"name\":\"n\",\"trace_id\":1,\"span_id\":1,\"duration\":0")), "missing start"); assertThrows( IllegalStateException.class, @@ -176,13 +173,12 @@ void rejectsSpansMissingRequiredV04Fields() { // error and parent_id are optional per the agent schema: a span omitting both still decodes, // with error defaulting to 0 (no error) and parent_id to 0 (root). - DecodedSpan span = - Decoder.decodeJson( - oneSpan("\"name\":\"n\",\"trace_id\":1,\"span_id\":1,\"start\":0,\"duration\":0")) - .getTraces() - .get(0) - .getSpans() - .get(0); + DecodedSpan span = Decoder.decodeJson( + oneSpan("\"name\":\"n\",\"trace_id\":1,\"span_id\":1,\"start\":0,\"duration\":0")) + .getTraces() + .get(0) + .getSpans() + .get(0); assertEquals(0, span.getError(), "absent error => 0"); assertEquals(0L, span.getParentId(), "absent parent_id => 0 (root)"); } @@ -233,23 +229,22 @@ void preservesMetaStructNumericTypesAcrossNesting() { // metaStruct(...) assertion or a leaf cast would behave differently across the two backends. long aboveDoublePrecision = (1L << 53) + 1; // 9007199254740993, not representable as a double BigInteger beyondLong = BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE); // 2^63 - String json = - "[[{" - + "\"service\": \"s\", \"name\": \"n\", \"resource\": \"r\"," - + "\"trace_id\": 1, \"span_id\": 1, \"parent_id\": 0, \"start\": 0, \"duration\": 0," - + "\"error\": 0, \"meta\": {}, \"metrics\": {}," - + "\"meta_struct\": {\"appsec\": {" - + " \"count\": 3," - + " \"rate\": 0.5," - + " \"whole\": 3.0," - + " \"nested\": {\"big\": " - + aboveDoublePrecision - + ", \"huge\": " - + beyondLong - + "}," - + " \"list\": [1, 2.5, \"x\", true, null]" - + "}}" - + "}]]"; + String json = "[[{" + + "\"service\": \"s\", \"name\": \"n\", \"resource\": \"r\"," + + "\"trace_id\": 1, \"span_id\": 1, \"parent_id\": 0, \"start\": 0, \"duration\": 0," + + "\"error\": 0, \"meta\": {}, \"metrics\": {}," + + "\"meta_struct\": {\"appsec\": {" + + " \"count\": 3," + + " \"rate\": 0.5," + + " \"whole\": 3.0," + + " \"nested\": {\"big\": " + + aboveDoublePrecision + + ", \"huge\": " + + beyondLong + + "}," + + " \"list\": [1, 2.5, \"x\", true, null]" + + "}}" + + "}]]"; Map metaStruct = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0).getMetaStruct(); diff --git a/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/SpanLinksDecoderTest.java b/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/SpanLinksDecoderTest.java index 19f12012dba..f0aa779eeea 100644 --- a/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/SpanLinksDecoderTest.java +++ b/utils/test-agent-utils/decoder/src/test/java/datadog/trace/test/agent/decoder/SpanLinksDecoderTest.java @@ -43,13 +43,11 @@ void decodesMinimalLinkApplyingDefaults() { @Test void decodesFullLink() { - List links = - fromTag( - "[{\"trace_id\":\"" - + TRACE_ID_128 - + "\",\"span_id\":\"a\",\"flags\":1," - + "\"tracestate\":\"dd=s:1\"," - + "\"attributes\":{\"link.kind\":\"span-pointer\",\"ptr.dir\":\"d\"}}]"); + List links = fromTag("[{\"trace_id\":\"" + + TRACE_ID_128 + + "\",\"span_id\":\"a\",\"flags\":1," + + "\"tracestate\":\"dd=s:1\"," + + "\"attributes\":{\"link.kind\":\"span-pointer\",\"ptr.dir\":\"d\"}}]"); DecodedSpanLink link = links.get(0); assertEquals(0xaL, link.getSpanId(), "an unpadded span id decodes"); @@ -63,11 +61,9 @@ void decodesFullLink() { @Test void preservesLinkOrderAndDecodesUnsignedSpanIds() { - List links = - fromTag( - "[{\"trace_id\":\"0\",\"span_id\":\"1\"}," - + "{\"trace_id\":\"0\",\"span_id\":\"ffffffffffffffff\"}," - + "{\"trace_id\":\"0\",\"span_id\":\"2\"}]"); + List links = fromTag("[{\"trace_id\":\"0\",\"span_id\":\"1\"}," + + "{\"trace_id\":\"0\",\"span_id\":\"ffffffffffffffff\"}," + + "{\"trace_id\":\"0\",\"span_id\":\"2\"}]"); assertEquals(3, links.size()); assertEquals(1L, links.get(0).getSpanId()); @@ -77,15 +73,17 @@ void preservesLinkOrderAndDecodesUnsignedSpanIds() { @Test void decodesAShortTraceId() { - DecodedSpanLink link = fromTag("[{\"trace_id\":\"abcd\",\"span_id\":\"1\"}]").get(0); + DecodedSpanLink link = + fromTag("[{\"trace_id\":\"abcd\",\"span_id\":\"1\"}]").get(0); assertEquals(0xabcdL, link.getTraceId()); } @Test void unknownKeysAreIgnored() { - DecodedSpanLink link = - fromTag("[{\"trace_id\":\"1\",\"span_id\":\"1\",\"something_new\":\"whatever\"}]").get(0); + DecodedSpanLink link = fromTag( + "[{\"trace_id\":\"1\",\"span_id\":\"1\",\"something_new\":\"whatever\"}]") + .get(0); assertEquals(1L, link.getTraceId()); } @@ -122,7 +120,8 @@ void linkFactoryNormalizesAbsentValues() { @Test void rendersIdentifiersAsHexadecimal() { - String rendered = DecodedSpanLinks.link(TRACE_ID_LOW, 0xaL, (byte) 0, "", null).toString(); + String rendered = + DecodedSpanLinks.link(TRACE_ID_LOW, 0xaL, (byte) 0, "", null).toString(); assertTrue(rendered.contains("traceId=9900aabbccddeeff"), "renders the trace id: " + rendered); assertTrue(rendered.contains("spanId=a"), "renders the span id: " + rendered); @@ -143,14 +142,13 @@ private static List fromTag(String tagValue) { @Test void decodedSpanExposesLinksAndKeepsTheTagVisible() { String tag = "[{\\\"trace_id\\\":\\\"" + TRACE_ID_128 + "\\\",\\\"span_id\\\":\\\"a\\\"}]"; - String json = - "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," - + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," - + "\"metrics\":{},\"meta\":{\"" - + SPAN_LINKS_TAG - + "\":\"" - + tag - + "\"}}]]"; + String json = "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," + + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," + + "\"metrics\":{},\"meta\":{\"" + + SPAN_LINKS_TAG + + "\":\"" + + tag + + "\"}}]]"; DecodedSpan span = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0); @@ -164,13 +162,12 @@ void decodedSpanExposesLinksAndKeepsTheTagVisible() { void decodesStructuredSpanLinksFieldFromAV1Payload() { // The agent converts a v1.0 payload's structured links into a top-level span_links field, // with decimal identifiers, rather than into the meta tag. - String json = - "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," - + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," - + "\"metrics\":{},\"meta\":{}," - + "\"span_links\":[{\"trace_id\":11068046444225730559,\"trace_id_high\":1234," - + "\"span_id\":10,\"flags\":1,\"tracestate\":\"dd=s:1\"," - + "\"attributes\":{\"link.kind\":\"span-pointer\"}}]}]]"; + String json = "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," + + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," + + "\"metrics\":{},\"meta\":{}," + + "\"span_links\":[{\"trace_id\":11068046444225730559,\"trace_id_high\":1234," + + "\"span_id\":10,\"flags\":1,\"tracestate\":\"dd=s:1\"," + + "\"attributes\":{\"link.kind\":\"span-pointer\"}}]}]]"; DecodedSpan span = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0); @@ -188,13 +185,12 @@ void decodesStructuredSpanLinksFieldFromAV1Payload() { @Test void structuredSpanLinksFieldWinsOverTheMetaTag() { - String json = - "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," - + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," - + "\"metrics\":{},\"meta\":{\"" - + SPAN_LINKS_TAG - + "\":\"[{\\\"trace_id\\\":\\\"1\\\",\\\"span_id\\\":\\\"99\\\"}]\"}," - + "\"span_links\":[{\"trace_id\":1,\"span_id\":7}]}]]"; + String json = "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," + + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," + + "\"metrics\":{},\"meta\":{\"" + + SPAN_LINKS_TAG + + "\":\"[{\\\"trace_id\\\":\\\"1\\\",\\\"span_id\\\":\\\"99\\\"}]\"}," + + "\"span_links\":[{\"trace_id\":1,\"span_id\":7}]}]]"; DecodedSpan span = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0); @@ -206,13 +202,12 @@ void structuredSpanLinksFieldWinsOverTheMetaTag() { void anEmptyStructuredSpanLinksFieldWinsOverTheMetaTag() { // A v1.0 payload always carries the span_links field, so an empty one means the span has no // link, whichever legacy meta tag the payload also holds. - String json = - "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," - + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," - + "\"metrics\":{},\"meta\":{\"" - + SPAN_LINKS_TAG - + "\":\"[{\\\"trace_id\\\":\\\"1\\\",\\\"span_id\\\":\\\"99\\\"}]\"}," - + "\"span_links\":[]}]]"; + String json = "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," + + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," + + "\"metrics\":{},\"meta\":{\"" + + SPAN_LINKS_TAG + + "\":\"[{\\\"trace_id\\\":\\\"1\\\",\\\"span_id\\\":\\\"99\\\"}]\"}," + + "\"span_links\":[]}]]"; DecodedSpan span = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0); @@ -221,10 +216,9 @@ void anEmptyStructuredSpanLinksFieldWinsOverTheMetaTag() { @Test void decodedSpanWithoutTheTagExposesNoLink() { - String json = - "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," - + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," - + "\"metrics\":{},\"meta\":{}}]]"; + String json = "[[{\"service\":\"s\",\"name\":\"n\",\"resource\":\"r\"," + + "\"trace_id\":1,\"span_id\":1,\"parent_id\":0,\"start\":0,\"duration\":1,\"error\":0," + + "\"metrics\":{},\"meta\":{}}]]"; DecodedSpan span = Decoder.decodeJson(json).getTraces().get(0).getSpans().get(0); diff --git a/utils/test-junit-converter-utils/src/main/java/datadog/trace/test/junit/utils/converter/TraceIdConverter.java b/utils/test-junit-converter-utils/src/main/java/datadog/trace/test/junit/utils/converter/TraceIdConverter.java index db2ec553dbe..8aad5c06659 100644 --- a/utils/test-junit-converter-utils/src/main/java/datadog/trace/test/junit/utils/converter/TraceIdConverter.java +++ b/utils/test-junit-converter-utils/src/main/java/datadog/trace/test/junit/utils/converter/TraceIdConverter.java @@ -27,7 +27,8 @@ public class TraceIdConverter implements ArgumentConverter { // 2^64 - 2 public static final String TRACE_ID_MAX_MINUS_1 = Long.toUnsignedString(-2L); // 2^64 (first out-of-range value) - public static final String TRACE_ID_MAX_PLUS_1 = new BigInteger(TRACE_ID_MAX).add(ONE).toString(); + public static final String TRACE_ID_MAX_PLUS_1 = + new BigInteger(TRACE_ID_MAX).add(ONE).toString(); @Override public Object convert(Object source, ParameterContext context) diff --git a/utils/test-junit-utils/src/main/java/datadog/trace/test/junit/utils/config/WithConfigExtension.java b/utils/test-junit-utils/src/main/java/datadog/trace/test/junit/utils/config/WithConfigExtension.java index 0e8857a9f4d..0e0722518ab 100644 --- a/utils/test-junit-utils/src/main/java/datadog/trace/test/junit/utils/config/WithConfigExtension.java +++ b/utils/test-junit-utils/src/main/java/datadog/trace/test/junit/utils/config/WithConfigExtension.java @@ -124,16 +124,13 @@ private static void applyClassLevelConfig(ExtensionContext context) { private static void applyMethodLevelConfig(ExtensionContext context) { // Method-level @WithConfig annotations (supports composed/meta-annotations) - context - .getTestMethod() - .ifPresent( - method -> { - List methodConfigs = - AnnotationSupport.findRepeatableAnnotations(method, WithConfig.class); - for (WithConfig cfg : methodConfigs) { - applyConfig(cfg); - } - }); + context.getTestMethod().ifPresent(method -> { + List methodConfigs = + AnnotationSupport.findRepeatableAnnotations(method, WithConfig.class); + for (WithConfig cfg : methodConfigs) { + applyConfig(cfg); + } + }); } private static void applyConfig(WithConfig cfg) { @@ -204,10 +201,9 @@ private static void ensureConfigInstrumentationHasBeenApplied() { if (isWritableInstance(CONFIG) && isWritableInstance(INST_CONFIG)) { return; } - throw new IllegalStateException( - "Config/InstrumenterConfig INSTANCE fields are not modifiable. " - + "Need the '-javaagent:modifiable-config-agent.jar' on the test JVM " - + "(the dd-trace-java.configure-tests Gradle convention plugin wires this automatically)."); + throw new IllegalStateException("Config/InstrumenterConfig INSTANCE fields are not modifiable. " + + "Need the '-javaagent:modifiable-config-agent.jar' on the test JVM " + + "(the dd-trace-java.configure-tests Gradle convention plugin wires this automatically)."); } private static boolean isWritableInstance(String className) { diff --git a/utils/test-utils/src/main/java/datadog/trace/test/logging/TestLogbackAppender.java b/utils/test-utils/src/main/java/datadog/trace/test/logging/TestLogbackAppender.java index 3afbda23bae..bb963a15305 100644 --- a/utils/test-utils/src/main/java/datadog/trace/test/logging/TestLogbackAppender.java +++ b/utils/test-utils/src/main/java/datadog/trace/test/logging/TestLogbackAppender.java @@ -27,13 +27,12 @@ public final class TestLogbackAppender extends AppenderBase { @Override protected void append(final ILoggingEvent event) { - final CapturedLog log = - new CapturedLog( - event.getMarker(), - event.getLevel().levelStr, - event.getMessage(), - event.getArgumentArray(), - event.getFormattedMessage()); + final CapturedLog log = new CapturedLog( + event.getMarker(), + event.getLevel().levelStr, + event.getMessage(), + event.getArgumentArray(), + event.getFormattedMessage()); TestLogCollector.INSTANCE.addLog(log); } } diff --git a/utils/test-utils/src/main/java/datadog/trace/test/util/AnyStackRunner.java b/utils/test-utils/src/main/java/datadog/trace/test/util/AnyStackRunner.java index 051d58ee59a..016f75f458e 100644 --- a/utils/test-utils/src/main/java/datadog/trace/test/util/AnyStackRunner.java +++ b/utils/test-utils/src/main/java/datadog/trace/test/util/AnyStackRunner.java @@ -17,13 +17,12 @@ public class AnyStackRunner { */ public static void callWithinStack(final String parentClass, final Runnable runnable) { // Create a copy of the RunnerRunner template class with the given name. - final Class dynamicType = - new ByteBuddy() - .redefine(RunnerRunner.class) - .name(parentClass) - .make() - .load(AnyStackRunner.class.getClassLoader()) - .getLoaded(); + final Class dynamicType = new ByteBuddy() + .redefine(RunnerRunner.class) + .name(parentClass) + .make() + .load(AnyStackRunner.class.getClassLoader()) + .getLoaded(); try { Consumer obj = (Consumer) dynamicType.getDeclaredConstructor().newInstance(); diff --git a/utils/test-utils/src/main/java/datadog/trace/test/util/AssertionsUtils.java b/utils/test-utils/src/main/java/datadog/trace/test/util/AssertionsUtils.java index d846b61bcc3..8209fb5d8da 100644 --- a/utils/test-utils/src/main/java/datadog/trace/test/util/AssertionsUtils.java +++ b/utils/test-utils/src/main/java/datadog/trace/test/util/AssertionsUtils.java @@ -10,11 +10,9 @@ private AssertionsUtils() { } public static void assertMapContainsKeyValues(Map actual, Map expectedSubset) { - expectedSubset.forEach( - (k, v) -> - assertEquals( - v, - actual.get(k), - () -> "Mismatch for key [" + k + "]: expected=" + v + ", actual=" + actual.get(k))); + expectedSubset.forEach((k, v) -> assertEquals( + v, + actual.get(k), + () -> "Mismatch for key [" + k + "]: expected=" + v + ", actual=" + actual.get(k))); } } diff --git a/utils/test-utils/src/main/java/datadog/trace/test/util/CleanConfigStateExtension.java b/utils/test-utils/src/main/java/datadog/trace/test/util/CleanConfigStateExtension.java index 09c18ced5a4..30e85dcaa85 100644 --- a/utils/test-utils/src/main/java/datadog/trace/test/util/CleanConfigStateExtension.java +++ b/utils/test-utils/src/main/java/datadog/trace/test/util/CleanConfigStateExtension.java @@ -22,16 +22,14 @@ @SuppressForbidden public class CleanConfigStateExtension implements BeforeAllCallback, AfterAllCallback { - private static final List ALLOWED_SYS_PROPS = - Arrays.asList( - "dd.appsec.enabled", "dd.iast.enabled", "dd.integration.grizzly-filterchain.enabled"); + private static final List ALLOWED_SYS_PROPS = Arrays.asList( + "dd.appsec.enabled", "dd.iast.enabled", "dd.integration.grizzly-filterchain.enabled"); private static final Predicate DATADOG_ENV_VAR_FILTER = k -> k.startsWith("DD_"); - private static final Predicate DATADOG_SYS_PROPERTIES_FILTER = - o -> { - String key = (String) o; - return key.startsWith("DD_") && !ALLOWED_SYS_PROPS.contains(key); - }; + private static final Predicate DATADOG_SYS_PROPERTIES_FILTER = o -> { + String key = (String) o; + return key.startsWith("DD_") && !ALLOWED_SYS_PROPS.contains(key); + }; @Override public void beforeAll(ExtensionContext context) { diff --git a/utils/test-utils/src/main/java/datadog/trace/test/util/DDJavaSpecification.java b/utils/test-utils/src/main/java/datadog/trace/test/util/DDJavaSpecification.java index d4780e89098..915d401a27a 100644 --- a/utils/test-utils/src/main/java/datadog/trace/test/util/DDJavaSpecification.java +++ b/utils/test-utils/src/main/java/datadog/trace/test/util/DDJavaSpecification.java @@ -49,11 +49,9 @@ void cleanup() { static Set getDDThreads() { return Thread.getAllStackTraces().keySet().stream() - .filter( - t -> - t.getName().startsWith("dd-") - && !t.getName().equals("dd-task-scheduler") - && !t.getName().equals("dd-cassandra-session-executor")) + .filter(t -> t.getName().startsWith("dd-") + && !t.getName().equals("dd-task-scheduler") + && !t.getName().equals("dd-cassandra-session-executor")) .collect(Collectors.toSet()); } diff --git a/utils/test-utils/src/main/java/datadog/trace/test/util/ThreadUtils.java b/utils/test-utils/src/main/java/datadog/trace/test/util/ThreadUtils.java index 8439c2c038a..2700615c482 100644 --- a/utils/test-utils/src/main/java/datadog/trace/test/util/ThreadUtils.java +++ b/utils/test-utils/src/main/java/datadog/trace/test/util/ThreadUtils.java @@ -38,22 +38,19 @@ public interface ThrowingRunnable { public static boolean runConcurrently( final int concurrency, final int totalInvocations, final ThrowingRunnable runnable) throws Throwable { - return runConcurrently( - concurrency, - totalInvocations, - new Closure(null) { - @Override - public Void call() { - try { - runnable.run(); - } catch (RuntimeException | Error e) { - throw e; - } catch (Throwable t) { - throw new RuntimeException(t); - } - return null; - } - }); + return runConcurrently(concurrency, totalInvocations, new Closure(null) { + @Override + public Void call() { + try { + runnable.run(); + } catch (RuntimeException | Error e) { + throw e; + } catch (Throwable t) { + throw new RuntimeException(t); + } + return null; + } + }); } public static boolean runConcurrently( @@ -78,28 +75,27 @@ public static boolean runConcurrently( final CountDownLatch endBarrier = new CountDownLatch(poolSize + 1); for (int i = 0; i < poolSize; i++) { final int invocations = each + (remainder <= 0 ? 0 : 1); - executor.execute( - () -> { + executor.execute(() -> { + try { + startBarrier.countDown(); + startBarrier.await(); + for (int c = 0; c < invocations && throwable.get() == null; c++) { try { - startBarrier.countDown(); - startBarrier.await(); - for (int c = 0; c < invocations && throwable.get() == null; c++) { - try { - closure.call(); - } catch (Throwable t) { - throwable.compareAndSet(null, t); - } - } + closure.call(); } catch (Throwable t) { throwable.compareAndSet(null, t); - } finally { - try { - endBarrier.countDown(); - } catch (Throwable t) { - throwable.compareAndSet(null, t); - } } - }); + } + } catch (Throwable t) { + throwable.compareAndSet(null, t); + } finally { + try { + endBarrier.countDown(); + } catch (Throwable t) { + throwable.compareAndSet(null, t); + } + } + }); remainder--; } startBarrier.countDown(); diff --git a/utils/test-utils/src/test/java/datadog/trace/test/util/PollingConditionsTest.java b/utils/test-utils/src/test/java/datadog/trace/test/util/PollingConditionsTest.java index 64ea4c5fe7e..f9cb34109b0 100644 --- a/utils/test-utils/src/test/java/datadog/trace/test/util/PollingConditionsTest.java +++ b/utils/test-utils/src/test/java/datadog/trace/test/util/PollingConditionsTest.java @@ -25,26 +25,21 @@ void passesOnFirstAttempt() { @Test void succeedsAfterSeveralRetries() { AtomicInteger attempts = new AtomicInteger(); - new PollingConditions(2) - .delay(0.01) - .eventually( - () -> { - if (attempts.incrementAndGet() < 5) { - fail("not yet"); - } - }); + new PollingConditions(2).delay(0.01).eventually(() -> { + if (attempts.incrementAndGet() < 5) { + fail("not yet"); + } + }); assertEquals(5, attempts.get()); } @Test void timesOutWithFormattedMessageAndUnderlyingCause() { - AssertionError error = - assertThrows( - AssertionError.class, - () -> - new PollingConditions(0.1) - .delay(0.01) - .eventually(() -> assertEquals(1, 2, "still wrong"))); + AssertionError error = assertThrows( + AssertionError.class, + () -> new PollingConditions(0.1) + .delay(0.01) + .eventually(() -> assertEquals(1, 2, "still wrong"))); assertTrue(error.getMessage().startsWith("Condition not satisfied after"), error.getMessage()); assertTrue(error.getMessage().contains("attempts"), error.getMessage()); @@ -69,14 +64,11 @@ void withinOverridesConfiguredTimeout() { @Test void retriesWhenConditionThrowsCheckedException() { AtomicInteger attempts = new AtomicInteger(); - new PollingConditions(2) - .delay(0.01) - .eventually( - () -> { - if (attempts.incrementAndGet() < 3) { - throw new IOException("not ready"); - } - }); + new PollingConditions(2).delay(0.01).eventually(() -> { + if (attempts.incrementAndGet() < 3) { + throw new IOException("not ready"); + } + }); assertEquals(3, attempts.get()); } @@ -89,12 +81,11 @@ void factorMultipliesDelayBetweenAttempts() { conditions.delay(0.02).factor(4); // 20ms base delay, multiplied by 4 after each attempt AtomicInteger attempts = new AtomicInteger(); - conditions.eventually( - () -> { - if (attempts.incrementAndGet() < 4) { - fail("not yet"); - } - }); + conditions.eventually(() -> { + if (attempts.incrementAndGet() < 4) { + fail("not yet"); + } + }); assertEquals(4, attempts.get()); // Three failed attempts -> three delays, each 4x the previous. @@ -121,10 +112,9 @@ void interruptedWhileWaitingFailsAndRestoresInterruptFlag() { // Pre-interrupt so the first inter-attempt sleep throws InterruptedException immediately. Thread.currentThread().interrupt(); try { - AssertionError error = - assertThrows( - AssertionError.class, - () -> new PollingConditions(2).delay(0.05).eventually(() -> fail("retry"))); + AssertionError error = assertThrows( + AssertionError.class, + () -> new PollingConditions(2).delay(0.05).eventually(() -> fail("retry"))); assertEquals("Interrupted while waiting for condition", error.getMessage()); assertTrue( Thread.currentThread().isInterrupted(), "interrupt flag should have been restored");