Skip to content

Commit 4378322

Browse files
authored
Merge branch 'master' into mattalp/reroute-gradle-profiler-dependencies
2 parents 8a7eab0 + 6bf2458 commit 4378322

File tree

47 files changed

+976
-264
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+976
-264
lines changed

.github/workflows/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ _Recovery:_ Manually trigger the action again.
106106

107107
### analyze-changes [🔗](analyze-changes.yaml)
108108

109-
_Trigger:_ When pushing commits to `master` or any pull request targeting `master`.
109+
_Trigger:_ When pushing commits to `master`.
110110

111111
_Action:_
112112

.github/workflows/analyze-changes.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ jobs:
6161

6262
trivy:
6363
name: Analyze changes with Trivy
64+
# Don’t run on PR, only when pushing to master
65+
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
6466
runs-on: ubuntu-latest
6567
permissions:
6668
actions: read

.gitlab-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ variables:
2424
BUILD_JOB_NAME: "build"
2525
DEPENDENCY_CACHE_POLICY: pull
2626
BUILD_CACHE_POLICY: pull
27-
GRADLE_VERSION: "8.4" # must match gradle-wrapper.properties
27+
GRADLE_VERSION: "8.5" # must match gradle-wrapper.properties
2828
MAVEN_REPOSITORY_PROXY: "http://artifactual.artifactual.all-clusters.local-dc.fabric.dog:8081/repository/maven-central/"
2929
GRADLE_PLUGIN_PROXY: "http://artifactual.artifactual.all-clusters.local-dc.fabric.dog:8081/repository/gradle-plugin-portal-proxy/"
3030
JAVA_BUILD_IMAGE_VERSION: "v25.05"

.gitlab/benchmarks.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
- when: on_success
1515
script:
1616
- export ARTIFACTS_DIR="$(pwd)/reports" && mkdir -p "${ARTIFACTS_DIR}"
17-
- export CIRCLE_CI_TOKEN=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.circleci_token --with-decryption --query "Parameter.Value" --out text)
1817
- git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ddbuild.io/DataDog/".insteadOf "https://github.com/DataDog/"
1918
- git clone --branch dd-trace-java/tracer-benchmarks https://github.com/DataDog/benchmarking-platform.git /platform && cd /platform
2019
artifacts:

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ buildscript {
1313
}
1414

1515
plugins {
16+
id "datadog.gradle-debug"
1617
id "datadog.dependency-locking"
1718

1819
id "com.diffplug.spotless" version "6.13.0"

buildSrc/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ plugins {
55
id("com.diffplug.spotless") version "6.13.0"
66
}
77

8+
java {
9+
toolchain {
10+
languageVersion = JavaLanguageVersion.of(8)
11+
}
12+
}
13+
814
gradlePlugin {
915
plugins {
1016
create("instrument-plugin") {
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* Gradle debugging plugin for dd-trace-java builds.
3+
*/
4+
5+
val ddGradleDebugEnabled = project.hasProperty("ddGradleDebug")
6+
val logPath = rootProject.layout.buildDirectory.file("datadog.gradle-debug.log")
7+
8+
fun inferJdkFromJavaHome(javaHome: String?): String {
9+
val effectiveJavaHome = javaHome ?: System.getenv("JAVA_HOME")
10+
if (effectiveJavaHome == null) {
11+
throw IllegalStateException("JAVA_HOME is not set")
12+
}
13+
val javaExecutable = File(effectiveJavaHome, "bin/java").absolutePath
14+
return try {
15+
val process = ProcessBuilder(javaExecutable, "-version")
16+
.redirectErrorStream(true)
17+
.start()
18+
val output = process.inputStream.bufferedReader().readText()
19+
val versionLine = output.lines().firstOrNull() ?: ""
20+
val versionMatch = Regex("version\\s+\"([0-9._]+)\"").find(versionLine)
21+
versionMatch?.let {
22+
val version = it.groupValues[1]
23+
when {
24+
version.startsWith("1.") -> version.substring(2, 3)
25+
else -> version.split('.').first()
26+
}
27+
} ?: "unknown"
28+
} catch (e: Exception) {
29+
"error: ${e.message}"
30+
}
31+
}
32+
33+
fun getJdkFromCompilerOptions(co: CompileOptions): String? {
34+
if (co.isFork) {
35+
val fo = co.forkOptions
36+
val javaHome = fo.javaHome
37+
if (javaHome != null) {
38+
return inferJdkFromJavaHome(javaHome.toString())
39+
}
40+
}
41+
return null
42+
}
43+
44+
fun printJdkForProjectTasks(project: Project, logFile: File) {
45+
project.tasks.forEach { task ->
46+
val data = mutableMapOf<String, String>()
47+
data["task"] = task.path.toString()
48+
if (task is JavaExec) {
49+
val launcher = task.javaLauncher.get()
50+
data["jdk"] = launcher.metadata.languageVersion.toString()
51+
} else if (task is Javadoc) {
52+
val tool = task.javadocTool.get()
53+
data["jdk"] = tool.metadata.languageVersion.toString()
54+
} else if (task is Test) {
55+
val launcher = task.javaLauncher.get()
56+
data["jdk"] = launcher.metadata.languageVersion.toString()
57+
} else if (task is Exec) {
58+
val java_home = task.environment.get("JAVA_HOME")?.toString()
59+
data["jdk"] = inferJdkFromJavaHome(java_home)
60+
} else if (task is JavaCompile) {
61+
val compiler = task.javaCompiler.get()
62+
data["jdk"] = compiler.metadata.languageVersion.toString()
63+
val jdkFromJavaHome = getJdkFromCompilerOptions(task.options)
64+
if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) {
65+
data["java_home"] = jdkFromJavaHome
66+
}
67+
} else if (task is GroovyCompile) {
68+
val launcher = task.javaLauncher.get()
69+
data["jdk"] = launcher.metadata.languageVersion.toString()
70+
val jdkFromJavaHome = getJdkFromCompilerOptions(task.options)
71+
if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) {
72+
data["java_home"] = jdkFromJavaHome
73+
}
74+
} else if (task is ScalaCompile) {
75+
val launcher = task.javaLauncher.get()
76+
data["jdk"] = launcher.metadata.languageVersion.toString()
77+
val jdkFromJavaHome = getJdkFromCompilerOptions(task.options)
78+
if (jdkFromJavaHome != null && jdkFromJavaHome != data["jdk"]) {
79+
data["java_home"] = jdkFromJavaHome
80+
}
81+
} else {
82+
data["jdk"] = "unknown"
83+
}
84+
val json = data.entries.joinToString(prefix = "{", postfix = "}") { (k, v) -> "\"$k\":\"$v\"" }
85+
logFile.appendText("$json\n")
86+
}
87+
}
88+
89+
class DebugBuildListener : org.gradle.BuildListener {
90+
override fun settingsEvaluated(settings: Settings) = Unit
91+
92+
override fun projectsLoaded(gradle: Gradle) = Unit
93+
94+
override fun buildFinished(result: BuildResult) = Unit
95+
96+
override fun projectsEvaluated(gradle: Gradle) {
97+
val logFile = logPath.get().asFile
98+
logFile.writeText("")
99+
gradle.rootProject.allprojects.forEach { project ->
100+
printJdkForProjectTasks(project, logFile)
101+
}
102+
}
103+
}
104+
105+
if (ddGradleDebugEnabled) {
106+
logger.lifecycle("datadog.gradle-debug plugin is enabled")
107+
gradle.addListener(DebugBuildListener())
108+
}

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ private TracerEnvironment buildTracerEnvironment(JvmInfo jvmInfo, @Nullable Stri
106106
.env(config.getEnv())
107107
.repositoryUrl(gitInfo.getRepositoryURL())
108108
.branch(gitInfo.getBranch())
109+
.tag(gitInfo.getTag())
109110
.sha(gitInfo.getCommit().getSha())
110111
.commitMessage(gitInfo.getCommit().getFullMessage())
111112
.osPlatform(wellKnownTags.getOsPlatform().toString())

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/TracerEnvironment.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.squareup.moshi.Json;
44
import datadog.trace.api.civisibility.config.Configurations;
5+
import datadog.trace.util.Strings;
56
import java.util.HashMap;
67
import java.util.Map;
78

@@ -111,6 +112,7 @@ public static final class Builder {
111112
private String env;
112113
private String repositoryUrl;
113114
private String branch;
115+
private String tag; // will act as fallback if no branch is provided
114116
private String sha;
115117
private String commitMessage;
116118
private String osPlatform;
@@ -143,6 +145,11 @@ public Builder branch(String branch) {
143145
return this;
144146
}
145147

148+
public Builder tag(String tag) {
149+
this.tag = tag;
150+
return this;
151+
}
152+
146153
public Builder sha(String sha) {
147154
this.sha = sha;
148155
return this;
@@ -203,7 +210,7 @@ public TracerEnvironment build() {
203210
service,
204211
env,
205212
repositoryUrl,
206-
branch,
213+
Strings.isNotBlank(branch) ? branch : tag,
207214
sha,
208215
commitMessage,
209216
new Configurations(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package datadog.trace.civisibility.config
2+
3+
import spock.lang.Specification
4+
5+
class TracerEnvironmentTest extends Specification {
6+
def "test fallback to tag on no branch"() {
7+
setup:
8+
def builder = TracerEnvironment.builder()
9+
def environment = builder.branch(branch).tag(tag).build()
10+
11+
expect:
12+
environment.branch == environmentBranch
13+
14+
where:
15+
branch | tag | environmentBranch
16+
"main" | "v.1.0.0" | "main"
17+
"main" | null | "main"
18+
null | "v.1.0.0" | "v.1.0.0"
19+
null | null | null
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.datadog.debugger.el.expressions;
2+
3+
import static com.datadog.debugger.el.PrettyPrintVisitor.print;
4+
5+
import com.datadog.debugger.el.EvaluationException;
6+
import com.datadog.debugger.el.Expression;
7+
import com.datadog.debugger.el.Value;
8+
import com.datadog.debugger.el.values.ListValue;
9+
import com.datadog.debugger.el.values.MapValue;
10+
import com.datadog.debugger.el.values.SetValue;
11+
import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver;
12+
import datadog.trace.bootstrap.debugger.util.WellKnownClasses;
13+
import java.util.List;
14+
import java.util.Map;
15+
import java.util.Set;
16+
17+
public class CollectionExpressionHelper {
18+
public static void checkSupportedMap(MapValue map, Expression<?> expression) {
19+
Map<?, ?> mapHolder = (Map<?, ?>) map.getMapHolder();
20+
if (!WellKnownClasses.isSafe(mapHolder)) {
21+
throw new EvaluationException(
22+
"Unsupported Map class: " + mapHolder.getClass().getTypeName(), print(expression));
23+
}
24+
}
25+
26+
public static void checkSupportedList(ListValue collection, Expression<?> expression) {
27+
Object holder = collection.getValue();
28+
if (holder instanceof List) {
29+
if (!WellKnownClasses.isSafe((List<?>) holder)) {
30+
throw new EvaluationException(
31+
"Unsupported List class: " + holder.getClass().getTypeName(), print(expression));
32+
}
33+
}
34+
}
35+
36+
public static Value<?> evaluateTargetCollection(
37+
ValueExpression<?> collectionTarget,
38+
Expression<?> expression,
39+
ValueReferenceResolver valueRefResolver) {
40+
if (collectionTarget == null) {
41+
throw new EvaluationException(
42+
"Cannot evaluate the expression for null value", print(expression));
43+
}
44+
Value<?> value = collectionTarget.evaluate(valueRefResolver);
45+
if (value.isUndefined()) {
46+
throw new EvaluationException(
47+
"Cannot evaluate the expression for undefined value", print(expression));
48+
}
49+
if (value.isNull()) {
50+
throw new EvaluationException(
51+
"Cannot evaluate the expression for null value", print(expression));
52+
}
53+
return value;
54+
}
55+
56+
public static Set<?> checkSupportedSet(SetValue set, Expression<?> expression) {
57+
Set<?> setHolder = (Set<?>) set.getSetHolder();
58+
if (!WellKnownClasses.isSafe(setHolder)) {
59+
throw new EvaluationException(
60+
"Unsupported Set class: " + setHolder.getClass().getTypeName(), print(expression));
61+
}
62+
return setHolder;
63+
}
64+
}

dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/FilterCollectionExpression.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
11
package com.datadog.debugger.el.expressions;
22

3+
import static com.datadog.debugger.el.PrettyPrintVisitor.print;
4+
import static com.datadog.debugger.el.expressions.CollectionExpressionHelper.checkSupportedList;
5+
import static com.datadog.debugger.el.expressions.CollectionExpressionHelper.checkSupportedMap;
6+
import static com.datadog.debugger.el.expressions.CollectionExpressionHelper.checkSupportedSet;
7+
import static com.datadog.debugger.el.expressions.CollectionExpressionHelper.evaluateTargetCollection;
8+
9+
import com.datadog.debugger.el.EvaluationException;
310
import com.datadog.debugger.el.Value;
411
import com.datadog.debugger.el.Visitor;
512
import com.datadog.debugger.el.values.CollectionValue;
613
import com.datadog.debugger.el.values.ListValue;
714
import com.datadog.debugger.el.values.MapValue;
15+
import com.datadog.debugger.el.values.SetValue;
816
import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver;
917
import datadog.trace.bootstrap.debugger.el.ValueReferences;
1018
import java.util.ArrayList;
1119
import java.util.Collection;
1220
import java.util.Collections;
1321
import java.util.HashMap;
22+
import java.util.HashSet;
1423
import java.util.Map;
24+
import java.util.Set;
1525
import org.slf4j.Logger;
1626
import org.slf4j.LoggerFactory;
1727

@@ -32,18 +42,10 @@ public FilterCollectionExpression(ValueExpression<?> source, BooleanExpression f
3242

3343
@Override
3444
public CollectionValue<?> evaluate(ValueReferenceResolver valueRefResolver) {
35-
Value<?> collectionValue = source.evaluate(valueRefResolver);
36-
if (collectionValue.isUndefined()) {
37-
return (collectionValue instanceof CollectionValue)
38-
? (CollectionValue<?>) collectionValue
39-
: CollectionValue.UNDEFINED;
40-
} else if (collectionValue.isNull()) {
41-
return (collectionValue instanceof CollectionValue)
42-
? (CollectionValue<?>) collectionValue
43-
: CollectionValue.NULL;
44-
}
45+
Value<?> collectionValue = evaluateTargetCollection(source, filterExpression, valueRefResolver);
4546
if (collectionValue instanceof ListValue) {
4647
ListValue materialized = (ListValue) collectionValue;
48+
checkSupportedList(materialized, this);
4749
Collection<Object> filtered = new ArrayList<>();
4850
int len = materialized.count();
4951
for (int i = 0; i < len; i++) {
@@ -57,6 +59,7 @@ public CollectionValue<?> evaluate(ValueReferenceResolver valueRefResolver) {
5759
return new ListValue(filtered);
5860
} else if (collectionValue instanceof MapValue) {
5961
MapValue materialized = (MapValue) collectionValue;
62+
checkSupportedMap(materialized, this);
6063
Map<Object, Object> filtered = new HashMap<>();
6164
for (Value<?> key : materialized.getKeys()) {
6265
Value<?> value = key.isUndefined() ? Value.undefinedValue() : materialized.get(key);
@@ -70,9 +73,22 @@ public CollectionValue<?> evaluate(ValueReferenceResolver valueRefResolver) {
7073
}
7174
}
7275
return new MapValue(filtered);
76+
} else if (collectionValue instanceof SetValue) {
77+
SetValue materialized = (SetValue) collectionValue;
78+
Collection<Object> filtered = new HashSet<>();
79+
Set<?> setHolder = checkSupportedSet(materialized, this);
80+
for (Object value : setHolder) {
81+
if (filterExpression.evaluate(
82+
valueRefResolver.withExtensions(
83+
Collections.singletonMap(ValueReferences.ITERATOR_EXTENSION_NAME, value)))) {
84+
filtered.add(value);
85+
}
86+
}
87+
return new SetValue(filtered);
7388
}
74-
log.warn("Unsupported collection type {}", collectionValue.getValue().getClass().getTypeName());
75-
return CollectionValue.UNDEFINED;
89+
throw new EvaluationException(
90+
"Unsupported collection type: " + collectionValue.getValue().getClass().getTypeName(),
91+
print(this));
7692
}
7793

7894
@Override

0 commit comments

Comments
 (0)